这一章在干嘛? IAP 实验:IAP 原理(Bootloader + App)、bin 文件生成、串口 Ymodem 协议传输、App 跳转。从此固件远程升级。
38.1 IAP 简介
IAP(In Application Programming):在应用程序里更新 Flash。
IAP 必备条件:
- Flash 至少分 2 个区:Bootloader + App;
- Bootloader 接收新固件 → 写入 App 区 → 跳转执行。
原书图 38.1.1:IAP 工程 Flash 分区
常见协议:
- Ymodem:串口,块 1024 字节,含 CRC;
- HTTP:通过 4G/Wi-Fi 下载;
- OTA:Over The Air,BLE/Wi-Fi 等。
关键:App 区基址和大小必须在 Bootloader 与 App 的链接脚本中保持一致。
38.2 硬件设计
USART1 + 按键进入 Bootloader / 跳转 App。
38.3 程序设计
38.3.1 工程组织
- Bootloader 工程:FLASH 0x08000000 起,大小 0x8000(32 KB);
- App 工程:FLASH 0x08008000 起,向量表偏移 0x08008000。
38.3.2 App 工程配置
- MDK → Target → IROM1 = 0x08008000, Size = 0x40000
- 中断向量表偏移:SystemInit 中加
SCB->VTOR = 0x08008000; - 编译后用
fromelf 生成 bin:fromelf --bin -o app.bin axf/Objects/project.axf
38.3.3 Bootloader 主流程
main:
if (KEY0 == 0) { // 按键进 IAP
delay_ms(20);
if (KEY0 == 0) ymodem_receive_and_flash();
}
jump_to_app(0x08008000); // 跳到 App
void jump_to_app(uint32_t addr) {
uint32_t jump = *(__IO uint32_t *)(addr + 4);
fn jump_fn = (fn)jump;
__set_MSP(*(__IO uint32_t *)addr); // 设置栈顶
jump_fn(); // 跳转
}
原书图 38.3.3.1:IAP 跳转流程
原书图 38.3.3.2:Ymodem 接收 Flash 写入流程
38.3.4 Ymodem 接收
串口接收 SOH/STX/EOT 等控制字符,按块写入 Flash。
原书图 38.3.4.1:Ymodem 帧格式
38.4 下载验证
- 烧 Bootloader;
- 编译 App 为 bin;
- XCOM 用 Ymodem 协议发送 bin → 开发板接收 → 写入 Flash → 自动跳 App;
- App 中 LED 闪烁证明跳转成功。
App 大小限制:App 区必须预留至少 1 个扇区给 Bootloader。
🧠 小测验IAP 是什么?
在 App 中更新自身 Flash 的技术。
App 区基址必须改什么?
链接脚本起始地址 + 中断向量表偏移。
跳转前要做什么?
设置 MSP(栈顶指针)。