关键字:Dual Bank, STM32G4
1. 背景
STM32G4系列MCU越来越多的应用在数字电源项目中,客户希望软件升级的过程中,
不影响当前程序的执行或者尽量减少打断当前程序执行的时间,本文介绍STM32G4的双
Bank特性以及应用该特性进行程序升级。
2. STM32G4双Bank特性
本章节以STM32G474RET6为例,介绍双Bank的特性,文中所引用到的参考代码都是
基于NUCLEO-G474RE测试通过。
2.1. 双Bank
STM32G474RET6内置512K Flash空间,通过选项字节配置,512K Flash可设置为
单Bank,也可以设置为双Bank。两种模式下具有如下特性差异。

表1. 双Bank与单Bank主要特性对比
STM32G4系列,即使Flash大小为256K,在双Bank模式下,Bank2的起始地址也
是0x8040000,这意味着在双Bank模式下,Flash小于512K的版本,Bank1的结束地
址和Bank2的起始地址是不连续的。
单Bank和双Bank读取位宽以及Sector大小不一样,最直接的影响是,双Bank模
式下烧录的程序,切换为单Bank后,程序是无法执行的,同样的道理,单Bank模式下
烧录的程序,切换为双Bank后,程序也无法执行。
下图更为直观的展示了单Bank切换为双Bank之后,数据在Flash中的组织结构。

图1. 数据在单Bank与双Bank Flash的组织结构
双Bank支持RWW特性,这意味着,程序在Bank1执行的过程中,不受Bank2
的Flash 擦、写影响。
2.2. 双 Bank启动
当Flash 设置为双Bank模式的时候,用户可以通过设置选项字节的BFB2位选择应
用程序是从Bank1启动还是从Bank2启动。

图2. BFB2
当BFB2等于0的时候,系统复位后,直接从Bank1地址也就是0x08000000启动,
应用程序需要按照0x08000000设置向量表偏移,程序烧录在0x08000000的地址空
间。
当BFB2等于1的时候,系统先从位于SystemMemory的Bootloader启动,
Bootloader 根据 Bank2是否有程序,执行如下两种操作。
1) Bank2为空,Bank1不为空,那么Bootloader直接跳转到0x08000000执行。
2) Bank2不为空,那么Bootloader修改SYSCFG_MEMRMP的FB_MODE位为
1,这样Bank1和Bank2的地址发生了交换,Bootloader还是跳转到
0x08000000 执行,不过此时Bank2的地址是0x08000000,Bank1的地址变为
0x08040000.
对应用程序而言,即使是从Bank2启动,应用程序还是可以按照0x08000000地址进
行工程配置,不需要对向量表地址VTOR进行偏移设置,只需把程序烧录到0x08040000
即可。
当BFB2置1的时候,使用STM32CubeProgrammer读取Bank2的数据时,往往会
造成混淆,因为SYSCFG_MEMRMP的FB_MODE位是Bootloader动态修改的,如果
Programmer 使用Under reset 方式连接,此时FB_MODE位为0,此时Bank2的地址
为0x08040000,如果使用hot plug方式连接,此时FB_MODE位置1,此时Bank2的
地址为0x08000000.

图3. Hotplug & Under reset
还需要注意的地方,BFB2能否生效,还依赖于系统Bootloader的版本,低于0xD4
的版本,不支持双Bank启动的功能。
2.3. 双 Bank交换
在双Bank模式下,用户可以通过修改SYSCFG_MEMRMP寄存器的FB_MODE位控
制Bank1和Bank2的地址重新映射。
SYSCFG_MEMRMP寄存器中的FB_MODE位默认值为0,此时Bank1的起始地址为
0x08000000,Bank2 的起始地址为0x08040000。
当用户更改SYSCFG_MEMRMP寄存器的FB_MODE为1的时候,此时Bank1的地
址映射为0x08040000,而Bank2的地址映射为0x08000000。
上面描述的双Bank启动,也是Bootloader修改了FB_MODE位,实现Bank1和
Bank2 的地址交换。

图4. FB_MODE
3. 双Bank升级
上面章节描述了STM32G4的双Bank特性,下面介绍一下利用STM32G4双Bank特性
来实现双Bank程序升级。
在Flash单Bank模式下,由于编程和擦除Flash的时候,无法读Flash,所以对于单
Bank模式,通常采用BOOT+APP的方式实现,BOOT实现升级功能,升级程序的时候,
APP需要中止当前业务,跳转到BOOT程序中进行升级,升级完成之后,再跳转到APP中执
行业务功能,如下图所示。

图5. 单Bank升级流程
而在双Bank模式下,升级功能可以作为APP的一部分,即使在升级程序的过程中,
应用程序依然在正常运行。下图展示了双Bank升级的示意图。
1)运行状态下,应用程序在Bank1运行。
2)应用程序收到升级命令后,分时执行升级任务,新版本程序烧录到Bank2,这个过
程应用程序照常执行。
3)程序烧录完成之后,修改选项字节的BFB2为1,重新加载选项字节触发系统复
位,此时系统从位于System Memory的Bootloader启动,Bootloader更改
FB_MODE为1,从而Bank1和Bank2进行地址交换,新版本程序执行。
4)如果当前程序在Bank2执行,升级Bank1的程序,那么升级完成之后,则需要把
BFB2 置为0后,重新加载选项字节触发系统复位,此时系统直接从Bank1启动。

图6. 双Bank升级流程,修改BFB2
上图示意图是通过修改选项字节的BFB2来进行Bank交换,用户程序也可以直接修改
FB_MODE寄存器位进行Bank交换,如下图所示。

图7. 双Bank升级流程,修改FB_MODE
这种方案包含了BOOT+APP,BOOT根据Bank1和Bank2程序的版本信息,确定执
行Bank1的程序还是Bank2的程序 ,Bank1和Bank2程序的BOOT部分完全一样。
正常运行状态下,系统复位后,FB_MODE默认值为0,此时直接从Bank1的BOOT
启动,Boot程序读取Bank1和Bank2程序的版本信息,确定执行哪个版本的程序,如果
需要执行Bank1的程序,BOOT直接跳转到Bank1的程序即可。
如果需要执行Bank2的程序,BOOT修改FB_MODE为1后,Bank1和Bank2进行
交换,此时执行的程序为Bank2 的BOOT,因为Bank1和Bank2的BOOT完全一样,
所以程序可以正常运行,Bank2的BOOT再跳转到Bank2的应用程序,因为Bank1和
Bank2 进行了交换,所以跳转的地址是一样的。
双Bank模式下,除了上述两种升级方案,还是有一种和单Bank类似,也采用
BOOT+APP,同时BFB2和FB_MODE都保持为默认值,升级功能作为APP的一部分,
BOOT程序只负责读取Bank1和Bank2程序的版本信息来决定跳转的地址,但是这种方
案需要注意的是,编译Bank1程序的地址和Bank2的地址是不一样的,这意味着针对
Bank1 和Bank2的程序对应的链接脚本不一样,同样向量表偏移也不一样。
4. 小结
本文详细介绍了STM32G4双Bank的特性以及如何使用双Bank特性进行程序升级的内
容,在涉及相关应用时可以参考。
留言有礼
你是否了解意法半导体STM32G4?
你期待用STM32G4开发哪些应用?
你是否愿意在CSDN分享相关内容并@我?
文末留言,随机抽取一位已关注粉丝送**"NUCLEO-G431RB"**一块。
活动日期:至2026年1月20日。
意法半导体公司及其子公司 ("ST")保留随时对 ST 产品和 / 或本文档进行变更的权利,恕不另行通知。买方在订货之前应获取关于 ST 产 品的最新信息。 ST 产品的销售依照订单确认时的相关 ST 销售条款。 买方自行负责对 ST 产品的选择和使用, ST 概不承担与应用协助或买方产品设计相关的任何责任。 ST 不对任何知识产权进行任何明示或默示的授权或许可。 转售的 ST 产品如有不同于此处提供的信息的规定,将导致 ST 针对该产品授予的任何保证失效。 ST 和 ST 徽标是 ST 的商标。若需 ST 商标的更多信息,请参考 www.st.com/trademarks。所有其他产品或服务名称均为其 各自所有者的财 产。 本文档是ST中国本地团队的技术性文章,旨在交流与分享,并期望借此给予客户产品应用上足够的帮助或提醒。若文中内容存有局限或与ST 官网资料不一致,请以实际应用验证结果和ST官网最新发布的内容为准。您拥有完全自主权是否采纳本文档(包括代码,电路图等)信息, 我们也不承担因使用或采纳本文档内容而导致的任何风险。 本文档中的信息取代本文档所有早期版本中提供的信息。© 2020 STMicroelectronics - 保留所有权利