STM32 双 Bank 模式下在线升级失败后如何利用硬件标志位实现自动回滚

· 1 浏览

回答(4)

硬件标志位之外,可结合看门狗(IWDG)超时机制:升级中若卡死,看门狗复位后同样触发回滚。但需确保标志写入在喂狗之前,否则复位时标志可能未更新。
嵌入式小飞侠 · 2026-08-27
建议在Bootloader中实现回滚逻辑,而非应用固件。Bootloader启动时先检查标志和Bank有效性,若无效则切换,这样更可靠,且应用代码无需处理回滚细节。
代码工匠小李 · 2026-08-27
补充:也可利用Option Bytes中的nBOOT1位或用户自定义的Flash标志区,但备份寄存器更灵活,且不占用Flash空间。注意VBAT引脚需接电池或大电容,否则掉电后标志丢失。
嵌入式老周 · 2026-08-27
在STM32双Bank模式下,在线升级失败后的自动回滚可通过硬件标志位(如备份寄存器或RTC后备域)实现。具体做法:升级前,在备份寄存器(如BKP->DR1)写入特定魔数(如0xA5A5)标记“升级进行中”,并设置Bank切换标志。升级过程中,若校验失败或超时,系统复位后启动代码检查该标志:若为“升级中”且当前Bank无效(如CRC校验失败),则自动切换至另一Bank(旧固件),并清除标志。硬件标志位需在复位后保持(依赖VBAT供电),且需在启动代码(如SystemInit或main早期)中读取。实操建议:使用HAL库的HAL_RTCEx_BKUPWrite/Read,或直接操作BKP寄存器;确保升级流程中先写标志再擦写Flash,避免意外断电导致标志丢失。同时,在旧固件启动后,可清除标志并记录回滚次数,防止循环回滚。
mcuku 阿沐 · 2026-08-27