在嵌入式开发的世界里IAPIn Application Programming应用内编程技术是每个工程师都需要掌握的核心技能之一。与传统的ISPIn System Programming系统内编程不同IAP 技术为我们提供了一种更加灵活和实用的固件更新方案。 技术对比技术类型ISPIAP编程方式通过专业调试器/下载器在应用中对其他分区编程典型工具JTAG、SWD等Bootloader灵活性需要外部工具可远程更新OTAOver The Air Technology空中下载技术则是 IAP 技术的无线升级实现方式通过蓝牙、WiFi等无线通信方式实现固件的远程更新大大提升了产品的可维护性和用户体验。 IAP 技术方案深度解析在实际产品开发中IAP 技术的实现远比简单的两个分区复杂得多。我们需要考虑• ❓升级失败怎么办• ❓如何恢复出厂版本• ❓如何保证升级的可靠性• ❓如何优化存储空间使用 通信协议栈的重要性开发 IAP 时通信协议栈用于接收固件程序是最基础也是最重要的组件。下面我们来看看几种主流的实现方案 一Bootloader 集成通信协议栈 方案特点以下方案由Bootloader 集成通信协议栈所有编程操作均在 Bootloader 中实现APP 程序基本不涉及编程操作。✅ 优点• ️高可靠性即使没有 APP 程序或 APP 程序异常时也能更新• 独立性强Bootloader 完全独立不依赖 APP 状态❌ 缺点• 占用空间大Bootloader 相对复杂Flash 占用空间较大• 开发复杂需要维护两套通信协议 方案一直接覆盖式更新工作流程1. 发送升级指令 → MCU2. MCU 复位/跳转 → 进入 Bootloader3. ️ Bootloader 擦除当前 APP 程序4. 接收新 APP 程序 → 直接写入 APP 分区┌─────────────────┬─────────────────┐ │ Bootloader │ APP │ │ Flash │ Flash │ └─────────────────┴─────────────────┘⚠️风险提示升级过程中断电可能导致设备变砖 方案二缓冲式更新工作流程1. 发送升级指令 → MCU2. MCU 复位/跳转 → 进入 Bootloader3. 接收新 APP 程序 → 写入空白 Flash4. ✅ 校验成功后 → 擦除旧 APP → 写入新 APP┌─────────────────┬─────────────────┬─────────────────┐ │ Bootloader │ APP │ 空白Flash │ │ Flash │ Flash │ │ └─────────────────┴─────────────────┴─────────────────┘✅优势升级失败时原程序仍然可用安全性更高 方案三双APP交替更新工作流程1. 发送升级指令 → MCU2. MCU 复位/跳转 → 进入 Bootloader3. 接收新 APP 程序 → 写入 APP24. ✅ 校验成功后 → 清除 APP1 有效标志 → 设置 APP2 有效标志5. 下次更新时 → 擦除 APP1 → 写入新程序到 APP1 → 切换标志┌─────────────────┬─────────────────┬─────────────────┐ │ Bootloader │ APP1 │ APP2 │ │ Flash │ Flash │ Flash │ └─────────────────┴─────────────────┴─────────────────┘最佳实践这是最安全可靠的方案但需要双倍 Flash 空间 二APP 程序集成通信协议栈 方案特点以下方案由APP 集成通信协议栈编程操作在 Bootloader 和 APP 程序中都有涉及且至少需要划分三块区域。✅ 优点• 空间节省Bootloader 程序 Flash 占用空间小• 开发效率APP 程序迭代快功能丰富❌ 缺点• ⚠️依赖性强没有 APP 程序时无法实现更新• 成本较高Flash 容量需求大• 风险较高APP 程序迭代快容易出现 bug影响更新功能 方案四APP 接收 Bootloader 写入工作流程1. 发送升级指令 → MCU2. APP 开始接收新程序 → 写入空白 Flash3. ✅ 校验成功后 → 复位/跳转进入 Bootloader4. ️ Bootloader 擦除当前 APP 程序5. Bootloader 将新程序写入 APP 分区┌─────────────────┬─────────────────┬─────────────────┐ │ Bootloader │ APP │ 空白Flash │ │ Flash │ Flash │ │ └─────────────────┴─────────────────┴─────────────────┘为什么不能在 APP 中直接写入就像你不能踩着左右脚上天一样程序无法在运行的同时修改自己 方案五APP 完全自主更新工作流程1. 发送升级指令 → MCU2. APP 接收新程序 → 写入 APP23. ✅ 校验成功后 → 清除 APP1 有效标志 → 设置 APP2 有效标志4. 复位后 → Bootloader 根据标志选择启动 APP┌─────────────────┬─────────────────┬─────────────────┐ │ Bootloader │ APP1 │ APP2 │ │ Flash │ Flash │ Flash │ └─────────────────┴─────────────────┴─────────────────┘特点只有 APP 涉及编程操作Bootloader 只负责启动选择 方案对比总结 方案选择建议方案适用场景Flash需求安全性开发复杂度方案一简单应用低⭐⭐⭐方案二一般产品中⭐⭐⭐⭐⭐方案三高可靠性产品高⭐⭐⭐⭐⭐⭐⭐⭐方案四成本敏感产品中⭐⭐⭐⭐⭐⭐方案五高端产品高⭐⭐⭐⭐⭐⭐⭐⭐⚠️ 重要注意事项 编译链接问题方案三和方案五由于程序运行地址不同需要对 APP 分别进行编译链接可应用性大打折扣。 OTA 升级特殊考虑OTA 升级采用无线方式相比直接线控升级• 断连风险高网络不稳定可能导致升级中断• 出错概率大无线传输更容易出现数据错误• ⏱️不适合实时写入不建议 MCU 每接收一帧数据就立即写入 最佳实践建议1.️ 安全第一优先选择双APP方案方案三/五2. 空间优化根据产品需求平衡安全性和成本3. 容错设计实现断点续传和校验机制4. 状态监控添加升级进度和状态反馈