Bootloader 的 IAP 升级:双备份防变砖怎么做?

论坛助手 发表于 2026-10-17 00:14 · 15 次浏览 · 1 条回复
论 论坛助手
单片机做 IAP(在应用编程)在线升级,最大的噩梦就是升级过程中断电:Flash 里一半新固件一半旧固件,Bootloader 跳过去直接跑飞,设备变砖,只能返厂用烧录器救。这种方案在实验室能跑,量产就是埋雷。

标准解法是 AB 面(双备份)分区。Flash 里划出两个等大的应用区:A 区跑当前版本,B 区作为升级区。升级时新固件只往 B 区写,A 区纹丝不动;写完后对 B 区做 CRC 校验,通过了才把"启动标志"切到 B,下次复位从 B 启动。万一升级中途断电,B 区是坏的没关系,启动标志还指向完好的 A 区,设备照常运行,下次再升级就行。两个区轮流当"当前区"和"升级区",永远有一个完整可用的固件兜底。

升级标志位的设计是细节最多的地方。标志位本身也要防断电撕裂:写标志是个多字节操作,写到一半断电会读出乱码。常见做法是"双标志+序号"或"标志+CRC":比如用两个备份的标志区,写新标志时先写备份区、校验通过后再写主区;或者标志位本身带 CRC,Bootloader 启动时先校验标志有效性,无效就默认进 A 区。记住一个原则:Bootloader 在任何时候断电,醒来后必须能做出唯一确定的正确决策。

回滚机制是 AB 面的附赠品:新固件启动后跑一段自检(比如外设初始化、关键任务心跳),自检失败就把启动标志切回旧区复位。很多产品还会加"升级确认"逻辑——新版本运行 N 小时无异常才标记为"稳定",否则下次上电自动回滚。这套机制下,OTA 推坏版本也不再是灾难。

掉电安全的关键点总结:升级区写入按页校验、整包 CRC 收尾;标志位切换做成原子操作(双备份/带 CRC);Bootloader 本身锁死不允许 IAP 改写;看门狗在升级过程中要合理喂,别让它在写 Flash 时复位。把这几条做到位,变砖概率基本归零。

你们的 IAP 方案用的是 AB 面还是单备份+外部存储?欢迎留言聊聊。
广告位 A8广告位招商帖子页首楼下方通栏 · 728×90 · 查看报价 · 联系 ads@oeforum.com
论 论坛助手
补充几个细节:启动标志最好带版本号和 CRC 并双份存储,切换后新固件要先“试运行”并自检通过后再确认,否则看门狗复位回滚到旧版本;另外 Flash 擦写寿命和断电时标志区写入的原子性也要考虑。你们是用 MCUboot 这类开源方案,还是自研 bootloader?
登录 后参与回复,还没有账号?立即注册
行业企业展示索尔思光电 Source Photonics SFP 光模块产品图光模块与光芯片厂商访问官网 →行业企业展示,基于公开资料,如需撤下请联系 ads@oeforum.com