STM32的ISP升级详解

发布者:雅致书香最新更新时间:2019-06-18 来源: eefocus关键字:STM32  ISP升级 手机看文章 扫描二维码
随时随地手机看文章

最近在做一个给STM32用ISP升级的项目,接触到STM32厂家烧录的Bootloader工作流程,具体官方文档稍后上传供大家参考,也可去ST官网下载文档。接下来针对文档中部分内容分析其工作过程:


一、要进入该模式,需把STM32硬件上的BOOT0引脚拉高(置1),BOOT1拉低(置0),对此部分不明白的可以查阅STM32BOOT引脚的资料(网上一搜一大堆),不过多阐述。两个引脚配置好对STM32复位,其在4个时钟周期内会自动检测BOOT引脚相应的配置情况,进入相应模式(原厂Bootloader模式)下工作,此时已经到达此次旅行的起点——USART Bootloader 模式


此处要特别注意的是硬件上一定要用原厂规定的串口才能完成此功能!在项目我使用的是STM32F030X8,相应的是PA9、PA10或者PA14、PA15,具体用什么串口不同型号芯片有所差异,另一份官方文档我也会上传,它详细描述了不同型号芯片关于Bootloader的注意事项,两份文档结合即可

二、上图展示的即是整个模式下芯片内部的工作流程,我们只需遵照流程做事就OK


接下来的描述中以STM32作为从机,一切发送串口命令端为主机;从机对主机的正确应答为0X79(ACK),异常应答为0X1F(NACK),在文档中亦有描述:


所有命令中,如果收到为NACK则回到用户命令等待阶段

1.首先是第一步,主机在串口发送一个字节0X7F(十六进制),STM32会根据该字节主机传输时的波特率自动识别双方的通信速率(波特率)并初始化从机串口,完毕回复主机一个字节0X79(ACK)并且失能从机所有无用的外设,进入用户命令等待阶段

2.此时从机等待主机发送进一步的执行命令,所有命令及功能描述如下图:

    可以注意到有些命令标注了右上角的小括号,这些注释也需要尤为关注,往往出现问题就是没有仔细查看注释内容!


    此处要提及的就是有的芯片被RDP(读保护)激活,如果没有解除只有少部分命令可以使用;在擦除芯片命令(稍后介绍)的两个中,一个型号芯片只有一个命令会起作用哦(小弟就吃过亏啊~~),希望大家引起注意。还有的注释可以自行查看这里不介绍啦


    在裸机开发(不使用VB编写上位机)我使用的只有从0X31(写内存命令)开始到0X92的7个命令,我就以此7个命令倒叙地(因为正常来说应该先做下面事情再往上做...)介绍一下我是如何做的。

①Readout Unprotect(0X92):解除芯片读保护

    上图为解除读保护主机端流程图,很明确地首先发送两个字节0X92和0X6D的命令组合,等待芯片回应两个ACK,读保护就解除成功啦。

    需要注意的是对读保护和写保护无论是解除还是激活,操作成功后都会触发芯片的复位而重新加载选项字配置并进入Bootloader模式,想进行下一步命令都要重新发0X7F让从机初始化串口进入等待用户命令模式哦,这里要强调强调再强调!

②Readout Protect(0X82):激活芯片读保护

    

    上图为激活芯片读保护主机端的流程图,与解除读保护同理,不再描述啦

③Write Unprotect(0X73):解除芯片对所有扇区的写保护

    

    上图为解除芯片所有扇区的写保护主机端流程图,与解除芯片读保护同理哦

④Write Protect(0X63):激活芯片部分扇区的写保护

    细心的看官会发现,诶,部分扇区,什么情况呢?

    上图为对激活芯片部分扇区写保护主机端的流程图,老规矩,发送两字节命令组合0X63+0X9C等待一个ACK,接着发送一个字节N表示长度值——要写保护的扇区数-1,发送扇区代码N+1个字节(说实话小弟也没有明白这里要发送的扇区代码指的是什么,如果有前辈可以解答的话,小弟在此感激不尽呐...在这里不影响我们可以烧程序进FLASH)发送完扇区代码,就是发送一个字节对长度值字节和代码区字节的异或校验值啦(这个校验值后面会详细说明滴),等待ACK应答,如果成功,芯片同样产生一个复位

⑤Extended Erase(0X44):用两个字节寻址模式擦除从一个到所有的闪存

    这个命令可以用户自由擦除闪存页

    上图为主机端自由擦除闪存页的流程图,开始发送两字节组合命令0X44+0XBB,等到ACK后选择要擦除的方式,我使用的是全部擦除命令,也就是左边的0XFFFF来擦除所有闪存页的代码,接着是对上面这个两字节命令的校验字节,成功则回应ACK,其实特殊擦除命令中除了0XFFFF,下面的Bank1和Bank2...小弟不才,希望知道意思的前辈能指教指教呀~

    至于右边的则是用户可以自定义要擦除哪些页的命令流程,首先以两个字节形式(MSB)把要擦除的总页数告诉BL程序,然后发送要擦除页的编号——如:要擦除第0页(Page 0)、第1页(Page 1),以两个字节形式(MSB)发送0X00,0X00;0X00,0X01;以此类推把要擦除的页码都发出去,最后对前面发送的总页数和各页码的异或校验字节...等待ACK即可

    一页有多大呢?这个问题我也困惑过,不过在芯片的寄存器手册上有个表格已经写得很清楚啦,要仔细查阅FLASH相关章节哦

⑥Erase(0X43):擦除一个到所有闪存页

       其实这个命令和上面一个类似,但是我前面说了一个型号芯片只支持一个命令有效

      上图为擦除一个到所有闪存页主机端的流程图,和上一个命令类似地,这个倒是更简单点可以直接选择是否全部擦除的0XFF,选择的右边是使用页擦除的方式,每个型号芯片的一页大小有所不同,这里的流程表示先发送一个字节要擦除的页数量,接着是要擦除哪些页的编号,然后是校验值

⑦Write Memory(0X31):写闪存命令

    最多可以写256字节到STM32RAM或FLASH闪存地址中,这个命令是整个烧录过程的重点

    --上图为写内存命令在主机端的流程图,发送一个字节0X31接着0XCE(对0X31的检验值),如果从机的RDP没有被激活那么会等到从机给出一个ACK,否则从机将回复NACK,那么就需要去解除RDP,稍后会说;--等到ACK后发送一个四字节组成的内存地址,注意四个字节中MSB先发,四字节发完紧跟着发送一个字节异或校验值(对以上四字节的校验),等待从机校验正确给出ACK,如果从机接收到的异或校验值错误便回复NACK;--收到ACK后有三步:发送要传输的数据字节数量-1;发送数据字节;发送对字节数字节和数据字节一起的异或校验值,等待ACK;  此过程参考下图描述:

    也许还有看官会疑惑,这都什么跟什么呀,一点都不清晰...没错!我的第一感觉也是这样[无奈],只能说此文档编写者描述不够详细,接下来小弟为大家的疑惑作些解答,见笑了...

    首先一个问题就是校验值,这一点我挺奇怪的,明明就是异或校验嘛,写什么Checksum...还好看到了前面一个注解说明:

    呐... 这里呢说的挺详细了,checksum表示异或的结果字节和每一个命令跟着他的异或值作为一个组合,有人会问了一个字节怎么异或?一个字节呢就和0XFF异或也就是取了个反,多个字节就互相之间取异或到最后一个字节啦

    下一个问题是我在写内存流程图里圈出的,发送N+1个字节?什么鬼?莫着急,听我道来...

    在收到地址四字节的ACK以后,主机就要发送表示长度值的字节和用户数据了嘛,这个长度值的字节就是N,用户数据却要发N+1个字节。    下面这个栗子会直观点:

    发送的长度值是3(N),那么在用户数据区就要传输4个字节(N+1)数据,最后是对长度值字节和数据区字节的校验值,这里还要注意哦,用户数据区的字节数一定要为4的倍数哦(4/8/12/16/20...以此类推),否则将出现收不到ACK的情况

    再一个问题就是,如果给STM32升级,那要往指定FLASH里放什么数据嘞? 有人说这不废话嘛,单片机FLASH里不放代码拿什么给它执行呢...    对,就是这个问题,你怎么获得代码?当工程里复制粘贴肯定是不行的,我们不是有.hex文件嘛,用串口ISP烧录工具不就是hex文件嘛!诶,这是不行的哦,.hex文件用文本查看出来也是有一定格式的,是为了上位机更好的识别要把什么内容放到什么地址去,所以会有一大堆对我们写入FLASH来说无用的格式呢...

    那到底是什么文件才能直接用呢——bin文件,bin文件是什么这里不讲述,通过查看可以知道里面包含的就是hex中的数据区内容,也就是我们真正要的内容,把这些内容读出来写到对应FLASH地址就对啦!

    以上命令如果要循环执行,比如写闪存命令,则需要再次发送0X31+0XCE来启动这个命令功能写下一包的数据,注意地址要偏移相应的数据区大小哦~

三、把第“一”步骤中的BOOT0引脚拉低(置0),对STM32复位来使新烧录的程序正常运行


关键字:STM32  ISP升级 引用地址:STM32的ISP升级详解

上一篇:关于stm32芯片解锁方法
下一篇:关于STM32像EPROM一样可以单字节写内部Flash的理解

推荐阅读最新更新时间:2024-11-17 09:33

STM32定时器----通用定时器输出带死区互补PWM
功能:利用一个普通定时器,输出2路互补的、频率可调、占空比可调、死区可调的PWM 原理:如下图,计数模式为中心对齐模式 可以看出,CH3高电平区间是以计数器计到4为中心,向两边延伸的。 而CH4,因为输出极性相反,是以0为中心向两边延伸的。 CCR3变小,占空比上升 CCR4变大,占空比上升 CCR3与CCR4的和为ARR 注意,此模式计数器的计数周期=ARR,这与PWM模式:计数周期 = ARR+1不同 这点参考下图STM32参考手册: 故,整理出代码以及计算公式如下: void TIM3_PWMShiftInit(void) { float Duty = 0; u16 ARR = 0,PSC = 0
[单片机]
STM32—ADC单通道采集模拟量
前言: 最近在调试STM32L152芯片ADC单通道采集数据程序,总结下STM32L152芯片ADC单通道采集模拟量的使用方法。 硬件平台:STM32L152 软件平台:keil v5+cubeMX 函数库:HAL库 ADC配置过程: 1.先初始化ADC的管脚,本例中ADC对应PA1管脚。 ADC_HandleTypeDef hadc; void ADC_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; /*Configure GPIO pin : PA1 */ GPIO_InitStructure.Pin = GPIO_PIN_1;
[单片机]
STM32使用 sprintf 函数时遇到的造成死机的原因
使用环境(蓝色粗体字为特别注意内容) 1、软件环境:Keil MDK 5.15 2、硬件环境:STM32F103C8T6最小系统 今天在进行STM32编程的时候出现一个奇怪的错误,程序阻塞在一个函数里面,查了半天发现阻塞在sprintf函数中!!!我们来看看问题现场。 串口打印了第一句,就卡死了,下一句没有执行到。 查看了原因如下 void foo(char *path) { ... printu( enter dir:%srn , path); sprintf(path + i, /%s , fn); printu( enter1 dir:%srn , path); ... } 调用 fo
[单片机]
<font color='red'>STM32</font>使用 sprintf 函数时遇到的造成死机的原因
关于STM32GPIO口的GPIO_Init()函数
函数目的:对GPIO进行初始化。 如果对寄存器操作GPIO有一定了解的话,对下面理解起来就比较简单。 如果将GPIO口设置为输出模式,要设置两个寄存器,CRL与ODR。 CRL:规定了低8位GPIO的输出输入状态模式。 ODR:只用 确定GPIO端口的输出值。 如下重点要理解CRL的工作方式。 CRL设置原理如上: 例如设置端口PD7,那么就需要设置 四位,首先确定输入低二位输入输出状态及输出模式下的速度,高二位设置GPIO端口的工作方式。如果不理解,多看看两幅原理图。 编写GPIO_Init()的原理(以CRL为例): 1.首先对GPIO_Mode,GPIO_Pin,GPIO_Speed进行宏定义。与CRL中使用略有差异,对
[单片机]
STM32 APB1和APB2挂接端口
SYSCLK 系统时钟,最大72MHzHCLK :AHB总线时钟,由系统时钟SYSCLK 分频得到,一般不分频,等于系统时钟经过总线桥AHB-- APB. 通过设置分频,可由HCLK得到 PCLK1与PCLK2时钟不过PCLK2时钟最高可达72MHz. PCLK1对应APB1外设最大36MHz。 PCLK2对应APB2外设最大72MHz。 APB2负责AD,I/O,高级TIM,串口1。 APB1负责DA,USB,SPI,I2C,CAN,串口2345,普通TIM RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB1Periph_USART2,ENABLE); RCC_AP
[单片机]
STM32之串口通信
串口通信原理 串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹
[单片机]
<font color='red'>STM32</font>之串口通信
【STM32F103攻城笔记】STM32之MDK(Keil)环境搭建(一)
开始前需准备的工具和文件: 一、keil安装好。(要支持ARM的) 二、去下载STM32f103的芯片包,后缀为pack (因为一般安装keil不会自带stm32的芯片包) 三、去官网或百度下个STM32的库函数文件。 上面二 和 三的文件如下图: 开始了! 第一步:打开Keil,按图操作 出现以下界面,并继续操作 选择刚才下载的芯片pack 出现以下信息 说明stm32芯片已经安装成功! 最后退出到开始打开页面! 下一篇就可以开始搭工程了!
[单片机]
【STM32F103攻城笔记】<font color='red'>STM32</font>之MDK(Keil)环境搭建(一)
STM32定时器更新事件可以暂停否?
有人使用STM32的定时器的输出比较功能,具体就是输出4个通道的PWM信号。不过 他需要不定时地调整4个通道的占空比,即调整他们的CCR值。但现在有个小问题,那就是新的CCR值的获得往往会能跨越多个目前定时器的计数周期,这样的话,即使开启各个通道CCR值的预装功能,似乎也很保证做到一次性修改。因为它希望新的CCR值被同时更新。换句话说,他担心不同通道新的CCR值分散在不同计数周期生效,可能给应用带来些麻烦。 我们知道,STM32定时器的预装寄存器的值到影子寄存器的更新往往离不开更新事件。一般来讲,只要启动了定时器,更新事件会随着计数器的溢出而自然产生。 既然这样,比方若是在下面四个时刻获得了新的CCR值,有没有办法让这几个
[单片机]
<font color='red'>STM32</font>定时器更新事件可以暂停否?
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved