你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

经验分享 | STM32G4双BANK启动应用演示

[复制链接]
攻城狮Melo 发布时间:2026-3-16 09:24

STM32G47x系列支持Flash双bank 模式,在该模式下对FLASH 的操作支持RWW(Read-While-Write)特性,即在 Bank1 中可以针对 Bank2 进行Flash擦除或编程而不影响当前 Bank1 中应用程序的运行。反之亦然。

对于支持Flash 双 Bank模式的STM32G47X芯片,当使能了双 Bank模式后,片内FLASH便被划分为两个独立的 Bank,用户可以将应用程序放在任意一个 Bank 运行。顺便先声明下,下面都是默认芯片BOOT配置是从主FLASH启动为前提。

下图是片内FLASH为512KB的STM32G4芯片双BANK模型示意框图。

image.png

我们通过设置选项字节控制位BFB2 来决定从哪一个Bank 启动程序的运行。

BFB2 = 0,禁用从 Bank2 启动,系统复位后始终从 Bank1 启动运行;

BFB2 = 1,启用从Bank2 启动,系统复位后先尝试从 Bank2 启动运行,若 Bank2 中无正常程序可运行,接着检测 Bank1中是否有正常程序可以运行,若有,则从 Bank1启动运行;若BANK1也没有正常程序可以运行,就继续运行片内系统Bootloader程序。关于这个过程,在ST官方的AN2606应用笔记里有介绍,见下面STM32G4双BANK模式下的启动流程:

image.png

根据上面框图可知,当系统BOOTLOADER程序检测到BANK2存在可运行代码时,随即就做了一个操作---BANK SWAP。啥意思呢,就是将BANK1和BANK2的地址做了重映射,BANK1空间的地址映射到0x0804,0000开始的地方,BANK2空间的地址映射到0x0800,0000开始的地方,(注:本篇都以片内FLASH 为512KB的STM32G47X芯片为例),相当于BANK1和BANK2的地址映射关系彼此互换了。下图就是没做BANK SWAP与做了BANK SWAP 的地址映射示意。

image.png

由于STM32G4芯片每次复位后,系统总是从0x800,0000开始的空间启动运行,若做了BANK SWAP操作,程序就可以从BANK2启动运行,而不从BANK1启动运行了。

什么决定系统复位后从BANK2启动运行呢?

首先,该芯片要支持双BANK,这由选项字节的DBANK位决定:

image.png

其次,应用要求从BANK2启动,这由选项字节的BFB2位决定:

image.png

简言之,要想系统复位后从BANK2启动运行,必须选项控制位DBANK和BFB2同时置位。当然,BOOT配置是从主FLASH启动为前提。

我们在前面提到的从BANK2启动的流程图中,有个BANK SWAP操作,这个操作是用户手动干预的吗?不是,它只是系统启动程序的一个环节。这个操作涉及系统配置的寄存器控制位FB_MODE。它是干什么的呢?

image.png

它就是负责管理BANK1、BANK2作地址映射交换的,本质就是决定哪个BANK映射到0x0800,0000开始的程序执行空间。

FB_MODE= 0 ,Bank1 起始地址映射到0x08000000,Bank2起始地址映射到0x08040000;【默认配置】

FB_MODE= 1 ,Bank1 起始地址映射到0x08040000,Bank2 起始地址映射到0x08000000;

探讨STM32G4系列的双BANK启动应用时,对FB_MODE位了解下即可,即使对该位毫无了解也不影响我们针对双BANK启动的应用,我们在代码中也无须关心或操作这个寄存器位。

当然,如果说你想基于双BANK做升级,搞些花样玩法,这时FB_MODE可能就要上场了。不过,这不是今天重点,下面重点基于STM32G474RE芯片演示双BANK启动应用的实现过程。

我准备了两个工程,分别存放在BANK1和BANK2。两个工程代码几乎完全一样,仅相差一个字符,字符“1”与“2”的差别。运行BANK1和BANK2的代码时通过串口终端分别输出相应字符串“This is BANK-1”和“This is BANK-2”。

先使用STM32CubeProgrammer配置DBANK位,启用芯片的双BANK模式。

image.png

快速创建第一个工程,其运行结果就是周期性通过串口终端输出字符串“This is BANK-1”。工程的链接配置及VTOR偏移配置如下图所示:

image.png

代码被放在0x0800,00000开启的空间,即BANK1。先不置位BFB2,即不选择从BANK2启动,运行程序可以看到输出结果,见下图配置和串口终端输出:

image.png

在保持当前选项字节配置不变的前提下,创建第二个工程。相比前面第一个工程除了串口输出内容稍有不同外,其它完全一样,包括工程的链接配置及VTOR偏移配置。

我将基于第二个工程的BIN文件烧写到0x0804,0000开始的地方。见下图示意:

image.png

顺便提下,如果使用ARM MDK IDE的话,往往需要使用fromelf将AXF或HEX文件转换下。你也可以不转换,先通过STM32CubeProgrammer将生成的HEX文件读进来,然后另存为BIN文件也可以使用。如下图示意:

image.png

我们可以通过STM32CubeProgrammer看到0x804,0000开始的空间写进了程序代码,即在BANK2也有了可以运行的另外一套程序。提醒:注意下此时地址0x8043a34开始的那串字符内容,记住这里放的是“This is BANK-2”。

image.png

烧录完毕后,复位开发板,串口终端输出仍然是BANK1的程序运行结果。

image.png

显然这是正常的,因为当前配置里仅仅启用双BANK模式,但并没有启用从BANK2启动功能。

现在启用从BANK2启动功能进行测试。通过STM32CubeProgrammer勾选选项字节里的BFB2位。

image.png

当我们完成上面BFB2选项位的编程后,串口终端输出立即变成BANK2区的内容了。

image.png

此时,不论我们怎样复位开发板,程序始终运行BANK2的代码。

我们通过STM32CubeProgrammer的HOT Plug模式与开发板保持连接,再来看看地址0x8043a34开始的那串字符。

image.png

看到了吧,此时这个地址的内容竟然是“This is BANK-1”,显然跟刚烧录进去时看到的内容不一样了。我们不妨继续看看此时0x8003a34地址开始的那串字符的内容。

image.png

此时0x8003a34地址开始的字符串内容则是“This is BANK-2”。

这两个地址所对应字符串的内容“变化”,正是因为在启用从BANK2启动过程中做了两个BANK的地址交换的缘故。换言之,真正变的是地址编码。

如果说,保持双BANK模式不变,但取消BANK2启动,再来观察这两个地址的字符串内容,会发现0x8003a34地址开始的字符串内容回归为“This is BANK-1”,0x8043a34地址开始的字符串内容回归为“This is BANK-2”。不妨来验证下。 image.png

显然,因为此时BFB2=0,即取消了从BANK2启动,现在无论怎样复位芯片,MCU都仅从BANK1启动并执行其程序,串口终端输出总是“This is BANK-1”。

关于STM32G4系列双BANK启动应用的演示就聊到这里,供有需要的同仁参考。

文章出处:茶话MCU

收藏 评论0 发布时间:2026-3-16 09:24

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版