STM32 Bootloader与IAP固件升级实战:Flash分区、跳转表与串口升级协议设计

JUMU实名认证 发表于 2026-08-31 01:09 | 显示全部楼层 | 复制链接分享      上一主题  翻页  下一主题
产品一旦量产交付,固件升级就成了刚需。无论是修复Bug还是增加功能,通过Bootloader配合IAP(In-Application Programming,应用内编程)在线升级,可以免去拆机、省去返厂,极大降低维护成本。本文从Flash分区开始,一步步带你完成STM32串口IAP升级方案。

第一步是规划Flash分区。以STM32F103为例,主Flash从0x08000000开始。典型布局是:0x08000000~0x08003FFF(16KB)放Bootloader,0x08004000之后放应用程序APP。Bootloader负责接收新固件、写入Flash、跳转到APP;APP则是真正的业务程序。分区大小要根据实际Flash容量合理分配,APP区留足余量,方便后续升级。

第二步是处理向量表。APP程序烧录到0x08004000后,中断向量表默认还在0x08000000,这会导致APP运行后中断全部失效。解决办法是在APP启动代码开头执行SCB->VTOR = 0x08004000; 把向量表重定位到新地址。同时,工程编译的链接脚本(Keil里是IROM1起始地址)也要改成0x08004000,这样编译出的代码地址才正确。

第三步是设计跳转逻辑。Bootloader上电后先检查是否有升级请求:可以是检测一个特定按键,也可以是检查Flash里的升级标志位。没有升级请求就直接跳转到APP执行;有请求就进入接收固件模式。跳转前要把全局中断关闭、把外设恢复到复位状态,然后通过函数指针跳到APP的复位向量执行。这里有个细节:跳转后APP要重新初始化所有外设,所以Bootloader里别做太多初始化,越干净越好。

第四步是串口升级协议。协议要能保证传输可靠,最简单的方案是分帧传输:每帧包含帧头、帧类型、数据长度、数据、校验和。接收端边收边写入Flash,写完一页擦除一页、写满一页烧录一页。写入Flash时注意:Flash只能1变0,所以必须先擦除再写,且擦除是按页(通常1KB或2KB)进行的。整个升级过程要有超时保护、错误重传机制,升级完成后跳转校验,校验失败还能回退到旧固件,这是IAP方案里非常重要的容错设计。

最后总结:一个完整的STM32 IAP升级方案包含Flash分区、向量表重定位、Bootloader跳转、串口传输协议、Flash写入与校验回退五大部分。用STM32CubeMX生成Bootloader工程,配合自定义的升级协议和上位机,就能实现稳定的在线升级功能。这一套方案在工业设备、智能硬件中非常通用,值得每个嵌入式工程师掌握。

  距米网  

找到您想要的设计

工程师、学生在线交流学习平台
关注我们

手机版- JMCAD苏ICP备18040927号-1

©2017-2026 常州居居米智能技术有限公司 苏公网安备32041102000587号