目录
前言
一、IAP 与 ICP 基础概念区分
二、BootLoader 与 App 分工
三、Flash 分区规划要点
四、IAP 完整升级流程
五、程序跳转核心注意事项
六、固件传输与分片处理
七、量产项目安全防护机制
八、常用升级通信接口
九、常见故障与避坑
十、拓展进阶方向
前言
如果每次升级固件都需要拆机、使用下载器烧录,维护成本极高,无法满足现场设备、户外物联网设备的迭代需求。
IAP 在线升级就是解决这个问题的核心方案,也是嵌入式工程师量产项目必备技能。
一、IAP 与 ICP 基础概念区分
- ICP:在电路编程,也就是常规下载器烧录方式,需要调试接口,一般用于工厂初次烧录固件。
- IAP:在应用编程,设备运行自身程序的情况下,通过通信接口接收新固件,写入 Flash,完成程序升级,全程不需要下载器。
IAP 核心思路:划分两段程序,BootLoader 引导程序 + App 应用程序。
二、BootLoader 与 App 分工
1.BootLoader(引导程序)
- 存放在 Flash 低地址区域,设备上电优先运行。
- 主要功能:硬件初始化、检测升级标志、接收新固件、固件校验、固件搬运跳转。
- 如果检测到有效升级包,执行固件更新;若无升级需求,直接跳转至 App 程序运行。
2.App(业务应用程序)
- 存放于 Flash 高地址区域,实现产品全部业务逻辑,包含采集、控制、通信等功能。
- 升级时不能直接擦写自身运行所在扇区。
三、Flash 分区规划要点
进行 IAP 开发前,必须提前划分 Flash 地址空间,各个区域严格隔离,防止相互覆盖:
- BootLoader 区:存放引导程序,预留固定大小扇区
- App 运行区:正常执行业务固件的存储区域
- 固件备份区(升级缓存区):临时存放接收完成的新固件镜像
- 参数存储区:保存设备配置、升级标志、校验信息,对应上一篇掉电存储内容
分区大小必须按照芯片 Flash 扇区尺寸对齐,不同型号单片机扇区大小存在差异,以官方手册为准。
四、IAP 完整升级流程
- 设备上电,启动 BootLoader,初始化串口 / WiFi/CAN 等通信外设
- 读取存储区内升级标记,判断是否需要执行升级
- 若触发升级:通过通信接口分片接收新固件,写入固件备份区
- 接收完成后,对完整固件进行 CRC 校验,确认数据包无丢失、无篡改
- 校验通过,将备份区内新固件搬运至 App 运行区
- 清除升级标记,设置正常启动标志,跳转到 App 入口地址运行新固件
- 校验失败:保留原有旧固件,清除缓存升级包,直接启动旧 App,避免设备变砖
五、程序跳转核心注意事项
- 中断向量表偏移:App 程序必须配置向量表偏移寄存器,否则中断会跳转到 BootLoader 区域,引发死机
- 栈指针切换:跳转前修改主栈指针为 App 定义的栈起始地址
- 外设复位:跳转前关闭 BootLoader 使用的外设、定时器、中断,防止外设状态冲突
- 禁止在中断内执行程序跳转操作
六、固件传输与分片处理
大部分通信接口单次缓存长度有限,大固件不能一次性传输完成,必须分片传输:
- 上位机 / 云端按固定分片长度拆分固件 bin 文件
- 每传输一个分片,设备应答确认,丢包则重传分片
- 全部分片接收完毕,拼接完整固件镜像再执行校验写入 Flash
七、量产项目安全防护机制
- CRC 校验:防止传输过程数据出错导致固件损坏
- 双备份固件:保留旧版本固件,升级失败可回滚,防止设备变砖
- 固件加密:对 bin 固件进行加密处理,防止固件被窃取、篡改
- 版本号管理:固件内置版本号,支持差分升级,减少传输数据量
- 升级锁定:增加升级使能标志,避免误触发升级流程
八、常用升级通信接口
- 串口 IAP:适合本地调试、有线升级,成本最低
- CAN IAP:工业设备、车载设备主流升级方案
- WiFi/4G 远程 IAP:物联网设备远程升级,使用 MQTT 下发固件包
- USB IAP:带 USB 外设的单片机,配合上位机快速升级
九、常见故障与避坑
- Flash 分区重叠,升级时擦除 BootLoader,直接导致设备变砖
- 未配置中断向量偏移,App 运行中断异常、随机死机
- 分片接收无应答机制,丢包后升级包不完整
- 升级中途断电,无固件备份,设备无法正常启动
- 栈地址配置错误,跳转程序直接 HardFault 硬件错误
- 固件未做对齐处理,写入 Flash 触发地址错误
十、拓展进阶方向
基础 IAP 实现之后,可以继续学习:差分升级、固件签名验签、OTA 远程升级管理平台、文件系统管理固件包,适配大型物联网项目批量设备维护。