STM32 双Bank Flash 在线升级时,如何利用Flash双区交替写入实现掉电无缝回滚?

· 2 浏览

回答(4)

回滚不仅靠Bootloader,还需在App内做版本自检。若新固件运行异常(如看门狗复位多次),可主动回退标志位并重启,增强鲁棒性。
硬件工程师阿强 · 2026-08-27
注意STM32的Bank大小可能不同(如F4系列1MB时各512KB),需确保固件不超过Bank容量。若固件较大,可考虑压缩或增量升级。
码农小刘 · 2026-08-27
双Bank方案关键在原子性:标志位更新必须放在最后,且用Flash写操作保证掉电不半写。建议用两个标志位交替验证,防止单点损坏。
嵌入式老张 · 2026-08-27
实现双Bank交替写入与掉电无缝回滚,核心是采用A/B分区策略并利用STM32的Bank切换机制。具体做法:将Flash划分为Bank0和Bank1,各存一份固件,通过标志位(如备份区特定地址)记录当前活跃Bank。升级时,先擦写非活跃Bank,写入新固件并校验(CRC或哈希),完成后更新标志位并触发软复位,Bootloader根据标志位跳转到新Bank。掉电时,若写入未完成,标志位未更新,Bootloader仍跳转旧Bank,实现无缝回滚。实操建议:1) 使用HAL_FLASHEx_Erase和Program时,注意Bank选择(FLASH_BANK_1/2),并开启中断保护;2) 标志位建议放在独立扇区(如最后扇区),并采用双备份(写两次)防篡改;3) 升级过程中禁止看门狗复位,或延长喂狗时间,避免中途复位导致状态不一致;4) 跳转前关闭全局中断、复位外设,确保干净启动。测试时,模拟掉电点(如擦写中、校验后、标志位更新前)验证回滚可靠性。
mcuku 阿沐 · 2026-08-27