【文末送NUCLEO-G431RB】一文说明白STM32G4双Bank启动与升级 LAT1596

关键字: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 - 保留所有权利

相关推荐
AC赳赳老秦几秒前
量化交易脚本开发:DeepSeek生成技术指标计算与信号触发代码
数据库·elasticsearch·信息可视化·流程图·数据库架构·memcached·deepseek
何中应3 分钟前
Redis的两个小错误
数据库·redis·缓存
金线银线还是铜线?4 分钟前
BLE设备 MF9006 PMIC 能量协同设计 低功耗物联网供电方案
嵌入式硬件·物联网·射频工程·iot
yuanmenghao6 分钟前
CAN系列 — (3) Radar Object List 在 MCU 内部是如何被拼装、校验并最终被消费的?
单片机·嵌入式硬件·自动驾驶·信息与通信
AI前端老薛7 分钟前
CSS实现动画的几种方式
前端·css
晨米酱9 分钟前
轻量级 Git Hooks 管理工具 Husky
前端·代码规范
携欢11 分钟前
portswigger靶场之修改序列化数据类型通关秘籍
android·前端·网络·安全
GuMoYu12 分钟前
npm link 测试本地依赖完整指南
前端·npm
代码老祖13 分钟前
vue3 vue-pdf-embed实现pdf自定义分页+关键词高亮
前端·javascript
未等与你踏清风13 分钟前
Elpis npm 包抽离总结
前端·javascript