文章目录
-
一.Flash的映射
-
二、stm32内存结构和上电运行过程
-
三.Flash的写入(从sram到Flash)
-
四.用户代码的修改
-
五.代码文件格式的转换和发送升级命令
-
六.程序的升级命令和跳转
-
七.跳转标志位
前言
我们平常常用的ISP下载,实际上是通过单片机专用的串行编程接口对单片机内部的Flash存储器进行编程(通过厂商固化好的程序),需要外部电路辅助实现,而IAP则是通过将Flash映射为两个区域,一部分为用户引导程序区BOOT,一部分为用户程序,利用引导程序实现在程序内编程(IAP)。 而485也好,串口也好,只是硬件传输上的协议,本质方法都是一样的。
整体思路就是Flash映射为两部分,首先运行引导程序,发送指令和程序包给stm32,再让stm32将sram储存的内容写入Flash的第二部分,再让主进程跳转至Flash的第二部分即可。
一、Flash的映射
第一步首先我们需要将Flash划分为两个区域,一部分为BOOT,一部分为用户程序。这就需要我们知道BOOT程序的大概大小。
通过keil5编译程序我们可以得到
linking...
Program Size: Code=7252 RO-data=336 RW-data=60 ZI-data=48068
FromELF: creating hex file...
"..\OBJ\USART.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed: 00:00:01
keil5代码分为两部分:
1. code,即程序代码部分
2. inline data. 即 literal pools(文字常量池), and short strings(短字符串)等
另外 RO Data: read-only data,只读的数据
RW Data: read write data,可读写的数据
ZI Data: zero initialized data,零初始化的可读写变量,存放未初始化的全局变量及初始化为0的变量
RO size: Code + RO_data,表示程序占用Flash空间的大小。
RW size: RW_data + ZI_data,表示运行时占用RAM的大小。
可以计算出我们的上面程序所占Flash大小为(7252+336)/1024=7K。
我采用的是stm32f103mini板,可以从keil5魔术棒Target栏看到
主要参数如下
CPU:STM32F103RCT6