1. 为什么需要BootLoader与IAP功能
在嵌入式系统开发中,固件升级是一个永恒的话题。想象一下你的智能家居设备需要新增功能,或者工业控制器发现了算法缺陷需要修复,如果每次都要拆机用JTAG烧录,那简直是工程师的噩梦。这就是BootLoader和IAP(In-Application Programming)技术存在的意义。
我曾在多个STM32项目中使用过IAP方案,最直观的体验是:当你的设备部署在20米高的塔吊上时,能用手机通过蓝牙OTA升级固件,比搭脚手架拆设备要靠谱得多。STM32F103作为经典Cortex-M3芯片,其内置的Flash编程功能为IAP提供了硬件基础。
2. STM32F103的存储布局设计
2.1 典型的内存分区方案
对于256KB Flash的STM32F103RET6,我推荐以下分区方案:
code复制0x08000000 - 0x08003FFF BootLoader区 (16KB)
0x08004000 - 0x0801FFFF App1区 (112KB)
0x08020000 - 0x0803FFFF App2区 (128KB)
这种设计考虑到了:
- BootLoader需要处理YModem协议、Flash擦写等复杂逻辑,16KB空间足够
- 双App区设计支持回滚机制,当新固件验证失败时可自动回退
- 保留4KB空间用于存储升级状态标志位
2.2 关键链接脚本配置
在Keil的分散加载文件中需要这样定义:
code复制LR_IROM1 0x08000000 0x00004000 { ; BootLoader
ER_IROM1 0x08000000 0x00004000 {
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00005000 {
.ANY (+RW +ZI)
}
}
LR_IROM2 0x08004000 0x0001C000 { ; App1
ER_IROM2 0x08004000 0x0001C000 {
*.o (RESET, +First)
*(InRoot$$Sections)
