STM32C5系列的双Bank Flash是其面向工业级固件安全升级的核心硬件特性,最大1MB的Flash空间被硬件划分为两个完全独立的存储区域,支持一边在Bank A运行业务代码,一边在Bank B完成固件升级,断点续传,全程不会出现代码运行中断,彻底解决传统单Bank IAP升级过程中掉电变砖的痛点。
双Bank硬件设计
STM32C5的双Bank采用硬件级完全隔离设计:
两个Bank拥有独立的擦写控制逻辑、独立的保护寄存器,互不干扰
支持边运行边擦写:在BankA正常执行业务代码的同时,可对BankB进行全扇区擦除和新固件烧写,完全不影响当前业务运行
内置FB_MODE内存重映射开关,通过配置寄存器位即可一键切换两个Bank的启动映射地址,无需修改任何链接脚本
额外支持EDATA专用数据Flash区域,可独立划分出部分空间模拟EEPROM,用于存储配置参数,完全不占用业务固件空间
典型应用场景
1. 固件A/B区升级(最主流用法)
原子级安全固件A/B升级,这是双Bank最核心的工业级应用,全程实现"零风险"固件更新:
设备出厂时,BankA烧写稳定版业务固件,BankB留空作为升级接收区
设备通过网络/串口接收新固件,直接写入BankB,全程BankA的业务代码正常运行,设备不会停机
新固件全部写入完成后,先做SHA256完整性校验,确认固件完整无损坏
配置Flash控制寄存器的BFB2位,下次复位后自动从BankB启动运行新固件
新固件启动后自检运行正常,再把BankA擦除,将新固件完整备份回BankA,完成全量升级
极端场景下升级中途掉电,BankA的旧固件始终完整可用,设备上电后自动回滚到旧版本,绝对不会变砖
2. 双固件冗余备份运行
对可靠性要求极高的工业控制场景,可在两个Bank同时烧写两份完全相同的业务固件:
系统启动后自动校验两个Bank的固件完整性,一旦检测到某一个Bank的Flash因为位翻转出现数据损坏,自动切换到另一个Bank运行
后台静默将完好的固件重新擦写覆盖损坏的Bank,全程业务不中断,实现硬件级的固件冗余防护
3. 在线参数分区存储
将其中一个小容量Bank专门划分为参数存储区:
业务固件运行在Bank1,Bank2不存放业务代码,专门用于存储设备的运行日志、校准参数、用户配置
业务代码运行时直接对Bank2进行擦写操作,完全不会影响Bank1中正在运行的代码执行,避免传统单Bank擦写参数时必须暂停业务的问题
关键配置步骤
在STM32CubeMX中开启双Bank划分,将1MB Flash平均划分为两个512KB的独立Bank,自动生成对应的分区链接脚本
配置Flash选项字节中的BFB2位,开启双Bank启动映射功能,支持复位时自动选择启动Bank
移植ST官方AN4767应用笔记中的双Bank升级驱动,实现固件写入、完整性校验、Bank切换的全套逻辑
配置独立看门狗超时时间大于整个固件升级流程的最大耗时,避免升级过程中误触发复位
总结
双Bank擦写操作时,必须确保当前运行代码所在的Bank不会被意外擦除,硬件会自动禁止对当前正在执行代码的Bank进行擦写操作
升级过程中所有中断向量表必须重定位到RAM中运行,避免擦写另一个Bank时意外影响中断响应
STM32C5没有集成TrustZone安全隔离,可直接通过软件配置实现双Bank的读写保护,防止固件被非法篡改
我要赚赏金
