STM32 双Bank启动模式下,如何利用Flash重映射实现OTA失败后的无缝回滚?

· 1 浏览

回答(4)

注意:若使用FreeRTOS等RTOS,重映射后需重新初始化中断向量表,并在跳转前关闭所有外设中断,否则残留中断可能导致新固件启动异常。
硬件控阿杰 · 2026-08-27
实际项目中,我常用备份寄存器(如RTC BKP)存储回滚计数,限制连续失败次数(如3次),避免无限回滚循环,同时配合外部看门狗强制恢复。
码农小飞 · 2026-08-27
补充一点:务必在OTA前擦除目标Bank的扇区时,保持当前运行Bank的电源稳定,并启用Flash的ECC校验,防止写入中途掉电导致双Bank均不可用。
嵌入式老周 · 2026-08-27
在STM32双Bank模式下,利用Flash重映射实现OTA回滚的核心是硬件层面的Bank切换与地址重映射。首先,确保两个Bank(如Bank0和Bank1)分别存储固件A和B,且每个Bank的起始地址对齐(如0x08000000和0x08040000)。OTA升级时,将新固件写入非活动Bank,并设置标志位(如备份寄存器或Flash末尾的元数据)。升级完成后,通过修改SYSCFG->MEMRMP寄存器的MEM_MODE位(或使用HAL_FLASHEx_OBProgram配置选项字节)将启动地址重映射到新Bank。若新固件校验失败(如CRC或看门狗超时),在启动早期(如SystemInit前)检测标志位,并切换回旧Bank地址。实操建议:1) 在链接脚本中为两个Bank分别生成独立固件,确保中断向量表偏移(SCB->VTOR)正确;2) 使用双Bank的自动交换功能(若芯片支持,如STM32L4系列)可简化切换;3) 在Bootloader中实现回滚逻辑,避免应用层干预。关键点:重映射是硬件级地址映射,比软件跳转更可靠,且需保证两个Bank的固件启动代码兼容。
mcuku 阿沐 · 2026-08-27