这一章在干嘛?

IAP 实验:IAP 原理(Bootloader + App)、bin 文件生成、串口 Ymodem 协议传输、App 跳转。从此固件远程升级。

38.1 IAP 简介

38.2 硬件设计

38.3 程序设计

38.4 下载验证

38.1 IAP 简介

IAP(In Application Programming):在应用程序里更新 Flash。

IAP 必备条件:

  • Flash 至少分 2 个区:Bootloader + App;
  • Bootloader 接收新固件 → 写入 App 区 → 跳转执行。

原书图 38.1.1:IAP 工程 Flash 分区原书图 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.1:IAP 跳转流程

原书图 38.3.3.2:Ymodem 接收 Flash 写入流程原书图 38.3.3.2:Ymodem 接收 Flash 写入流程

38.3.4 Ymodem 接收

串口接收 SOH/STX/EOT 等控制字符,按块写入 Flash。

原书图 38.3.4.1:Ymodem 帧格式原书图 38.3.4.1:Ymodem 帧格式

38.4 下载验证

  1. 烧 Bootloader;
  2. 编译 App 为 bin;
  3. XCOM 用 Ymodem 协议发送 bin → 开发板接收 → 写入 Flash → 自动跳 App;
  4. App 中 LED 闪烁证明跳转成功。

App 大小限制:App 区必须预留至少 1 个扇区给 Bootloader。