1. 为什么需要IAP串口升级方案
在嵌入式开发领域,固件升级一直是个绕不开的话题。传统使用JTAG/SWD烧录器的方式,在产品部署后显得尤为不便。想象一下,当设备安装在几十米高的塔吊上,或者嵌入在工业生产线中,每次升级都需要工程师带着烧录器现场操作,这成本简直难以承受。
STM32F103的IAP(In-Application Programming)功能恰好解决了这个痛点。通过内置的Bootloader,我们可以直接通过串口完成固件更新,无需拆机、无需专用工具。我曾在某工业传感器项目中采用这个方案,将现场升级时间从平均2小时缩短到10分钟,客户满意度直接提升了一个量级。
2. Bootloader工作原理深度解析
2.1 STM32F103的启动机制
STM32F103上电时,首先会检查BOOT0和BOOT1引脚的状态。当BOOT0=1时,芯片会从系统存储器启动,运行内置的Bootloader;当BOOT0=0时,则从用户Flash启动。这个选择机制是IAP方案的基础。
关键细节:实际项目中,我推荐使用跳线帽或拨码开关控制BOOT0,而不是直接拉高拉低。这样既方便调试,又能避免意外进入Bootloader模式。
2.2 内存映射与中断向量表
理解内存映射对IAP开发至关重要。STM32F103的Flash起始地址为0x08000000,我们通常将Bootloader放在这个区域的开头(比如0x08000000-0x08002000),应用程序则放在后续区域。
中断向量表的重映射是个容易踩坑的点。在应用程序中,必须通过SCB->VTOR = FLASH_BASE | 0x2000这样的语句,将中断向量表指向应用程序区。我曾遇到一个诡异的Bug:所有中断都能正常触发,但处理函数总是跳转到错误地址,最后发现就是漏了这行代码。
3. Bootloader具体实现步骤
3.1 工程配置要点
在Keil中创建Bootloader工程时,需要特别注意以下配置:
- Target选项卡中,将IROM1起始地址设为0x08000000,大小根据Bootloader实际需求设置(通常8KB足够)
- 在Options->Output中勾选"Create Hex File"
- 在Options->User中
