在量产产品中,IAP(In-Application Programming)在线升级已经是必备功能。APM32F4xx 系列 MCU 内置大容量 Flash,可轻松划分 Bootloader 与 APP 区域,通过串口、USB、网口、蓝牙等方式实现免拆壳固件更新。AN1084 应用笔记以串口 Ymodem 协议为例,完整讲解 IAP 原理、地址划分、向量表重定向、跳转机制与升级流程,照着做就能快速实现稳定升级。
资料获取:AN1084_APM32F4xx_IAP应用笔记
1. IAP 是什么?为什么一定要用?
IAP 可以理解为自定义 Bootloader,是一段烧录在 Flash 开头的启动程序,负责:
- 开机初始化
- 判断是否需要升级 APP
- 接收新固件并写入 Flash
- 校验固件完整性
- 跳转到 APP 运行
使用 IAP 后,产品出厂后不用拆机、不用仿真器,直接通过串口 / 无线完成升级,大幅降低售后成本。
2. APM32F4xx Flash 地址划分(核心)
AN1084 给出最稳定的分区方案(以 1MB Flash 为例):
- IAP Bootloader:
0x08000000 ~ 0x08004000(大小 16KB) - APP 程序区:
0x08004000 ~ 0x08100000(剩余空间)
要点:
- 地址必须按扇区对齐(16KB 倍数)
- IAP 占前 16KB 足够存放 Bootloader
- APP 从 0x08004000 开始
3. IAP 完整工作流程
- 芯片上电,从
0x08000000启动 IAP - 初始化串口、Flash、Ymodem 协议
- 显示菜单,等待指令:
- 按 1:更新 APP
- 按 2:读取 APP
- 按 3:直接跳转到 APP
- 升级时通过 Ymodem 接收
.bin文件 - 擦除 Flash → 写入 APP → 校验
- 自动跳转到 APP 运行
4. IAP 与 APP 最关键配置(必改)
4.1 APP 中断向量表重定向
APP 不在默认地址,必须修改偏移,否则中断无法使用:
// main函数开头加入
SCB->VTOR = FLASH_BASE | 0x4000;
4.2 MDK 工程 ROM 设置
- IROM 起始地址:
0x08004000 - 大小:
0x000FC000
4.3 生成.bin 固件
在 Keil 的 User 选项卡添加命令:
fromelf.exe --bin -o ./@L.bin !L
编译后自动生成可升级的 bin 文件。
5. IAP 程序结构(AN1084 标准方案)
- Flash 驱动:擦除、写入、读取
- USART1 驱动:PA9/PA10,115200 波特率
- Ymodem 协议:稳定传输 bin 文件
- 升级菜单:串口交互指令
- APP 跳转函数:栈顶地址 + 复位指针跳转
6. APP 程序设计要点
- 重定向中断向量表
SCB->VTOR = 0x08004000 - 正常初始化外设
- 跑 LED / 业务代码即可
- 编译后必须用 bin 文件升级
7. 升级操作步骤(超级终端 + Ymodem)
- 烧录 IAP 程序到
0x08000000 - 打开串口调试助手(115200 8N1)
- 复位模块,看到 IAP 菜单
- 按1进入接收模式
- 通过 Ymodem 发送 APP 的.bin 文件
- 提示 “Programming Completed” 即成功
- 按 3 或等待超时自动跳转 APP
8. IAP 常见坑(AN1084 重点提醒)
- 中断向量表必须偏移,否则 APP 死机
- 只能用bin 文件,不能用 hex
- Flash 必须先擦除再写入
- 跳转前要关闭所有中断
- 地址必须扇区对齐,不能随便填
- 升级时必须保证不断电
AN1084 是 APM32F4xx 最实用的IAP 升级官方手册,提供完整可直接量产的方案:
- Flash 分区清晰
- 中断重定向明确
- 代码结构标准
- Ymodem 稳定可靠
- 升级流程简单
只需修改少量参数,即可快速实现串口 IAP,也可扩展到 USB、网口、WiFi、蓝牙无线升级。
阅读全文
132