STM32 串口 IAP 下载
IAP(即在应用编程)是程序在运行过程中对 User Flash 部分区域进行烧写,目的是对产品中的固件程序进行更新升级。
实现 IAP 需要编写两个项目代码:1、执行对第二部分代码的更新;2、第二部分功能代码。
两部分项目代码都同时烧录在 User Flash 中,当芯片上电后,首先是第一个项目代码开始运行,它的操作如下:
- 检查是否需要对第二部分代码进行更新;
- 如果不需要更新则转到 4;
- 执行更新操作;
- 跳转到第二部分代码执行。
第一部分代码必须通过其他方式烧入;第二部分代码可以使用第一部分代码的 IAP 功能烧入,也可以和第一部分代码一起烧入,以后需要程序更新时再通过第一部分 IAP 代码更新。
第一部分代码称为 Bootloader 程序,第二个项目代码称为 APP 程序,它们存放在 STM32 FLAH 的不同地址范围,一般从最低地址区开始存放 Bootloader, 随后就是 APP 程序。
STM32 的程序不仅可以放在 FLASH 里面运行,也可以放在 SRAM 里运行。以下常用的两种型号的 STM32 Flash 和 SRAM 空间大小。
| STM32F103ZET6 | STM32F103RCT6 | |
|---|---|---|
| Flash | 512K | 256K |
| SRAM | 64K | 48K |
STM32 正常的程序运行流程如下图所示:

STM32 内部闪存(Flash) 地址起始于 0x8000000。程序启动后,先从中断向量表 (0x8000004) 取出复位中断向量,执行复位中断完成启动。
如图中所示,程序执行的步骤为 ① \(\rightarrow\) ② \(\rightarrow\)③\(\rightarrow\)④\(\rightarrow\) ⑤ \(\rightarrow\)③ \(\rightarrow\)④\(\rightarrow\) ⑤ \(\cdots\)
加入 IAP 程序之后,程序的运行流程如下图所示:

图中 STM32 复位后还是从 0x8000004 地址取出复位中断向量的地址,然后跳转到复位中断服务程序,运行完复位中断服务程序之后跳转到 IAP 的 main 函数(主要功能是将新的 APP 代码写入 STM32 的 Flash,新程序的复位中断向量起始地址为 0x8000004+N+M),然后跳转至新写入程序的复位向量表,取出新程序的复位中断向量的地址,并跳转执行新程序的复位中断服务程序,随后跳转至新程序的 main 函数。
在 APP main 函数的执行过程中,如果有中断请求,PC 指针任然跳转到 0x08000004 中断向量表处(步骤 ④),程序再根据设置的中断向量表偏移量跳转到对应中断源新的中断服务程序 (步骤 ⑤),执行完终端服务程序后,程序返回 main 函数继续运行 (步骤⑥)。
通过以上两个过程分析,IAP 程序必须满足两个要求:
- 新程序必须再 IAP 程序之后的某个偏移量为 x 的地址开始;
- 必须将新程序的中断向量表相应的移动,移动的偏移量为 x;
Ⅰ. APP 程序起始地址设置方法

默认情况下图中 IROM1 的起始地址一般为 0x8000000,(ZET6) 大小为 0x80000 (RCT6大小为0x40000),即从 0x8000000 开始的 512K 空间 (RCT6 256K 空间),图中设置的起始地址为 0x8010000,即偏移量为 0x10000 (64K字节),所以留给 APP 用的 Flash 空间只有 0x70000 即 448K 字节(ZET6 只剩 0x30000 即 192K字节的空间)。
保证偏移量是 0x200 的倍数
Ⅱ. 中断向量表的偏移量设置方法
在 systemInit 函数初始化时钟系统的时候同时还完成了中断向量表的设置。在 systemInit 结尾处有 :
SCB->VTOR = FLASH\_BASE | VECT\_TAB\_OFFSET;
/* Vector Table Relocation in Internal FLASH. */
STM32 VTOR 寄存器存放的是中断向量表起始地址。设置 SCB->VTOR = FLASH_BASE+偏移量,所以要在 main 函数最开头处添加如下代码:
SCB->VTOR = FLASH_BASE | 0x10000;
通过 Ⅰ和 Ⅱ 两个步骤的设置,就可以生成 APP 程序。不过 IAP 升级用的是 .bin 文件。通过 MDK 自带的格式转换工具 fromelf.exe 来实现 .axf 文件到 .bin 文件的转换。该工具在 MDK 安装目录 ( 我的是 “ C:\Keil_v5\ARM\ARMCC\bin“)
在 Options for Target 的 User 选项卡如下图所示:

填入的内容为:
C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe --bin -o .\Objects\Vehicle.bin .\Objects\Vehicle.axf
以上的 "Vehicle" 是我的工程名。
保存退出后,点编译会自动在指定路径下生成 .bin 文件。然后通过串口将 .bin 文件发送到 STM32 即可完成升级。
总结 APP 程序的生成步骤:
设置 APP 程序的起始地址和存储空间大小
设置中断向量表偏移量
设置编译后运行 fromelf.exe,生成 .bin 文件
注:因为 Bootload 程序用的是串口二,所以在 正常程序中不能对 USART2 进行二次端口初始化,防止出现死机

浙公网安备 33010602011771号