|
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模型示意框图。
我们通过设置选项字节控制位BFB2 来决定从哪一个Bank 启动程序的运行。 BFB2 = 0,禁用从 Bank2 启动,系统复位后始终从 Bank1 启动运行; BFB2 = 1,启用从Bank2 启动,系统复位后先尝试从 Bank2 启动运行,若 Bank2 中无正常程序可运行,接着检测 Bank1中是否有正常程序可以运行,若有,则从 Bank1启动运行;若BANK1也没有正常程序可以运行,就继续运行片内系统Bootloader程序。关于这个过程,在ST官方的AN2606应用笔记里有介绍,见下面STM32G4双BANK模式下的启动流程:
根据上面框图可知,当系统BOOTLOADER程序检测到BANK2存在可运行代码时,随即就做了一个操作---BANK SWAP。啥意思呢,就是将BANK1和BANK2的地址做了重映射,BANK1空间的地址映射到0x0804,0000开始的地方,BANK2空间的地址映射到0x0800,0000开始的地方,(注:本篇都以片内FLASH 为512KB的STM32G47X芯片为例),相当于BANK1和BANK2的地址映射关系彼此互换了。下图就是没做BANK SWAP与做了BANK SWAP 的地址映射示意。
由于STM32G4芯片每次复位后,系统总是从0x800,0000开始的空间启动运行,若做了BANK SWAP操作,程序就可以从BANK2启动运行,而不从BANK1启动运行了。 什么决定系统复位后从BANK2启动运行呢? 首先,该芯片要支持双BANK,这由选项字节的DBANK位决定:
其次,应用要求从BANK2启动,这由选项字节的BFB2位决定:
简言之,要想系统复位后从BANK2启动运行,必须选项控制位DBANK和BFB2同时置位。当然,BOOT配置是从主FLASH启动为前提。 我们在前面提到的从BANK2启动的流程图中,有个BANK SWAP操作,这个操作是用户手动干预的吗?不是,它只是系统启动程序的一个环节。这个操作涉及系统配置的寄存器控制位FB_MODE。它是干什么的呢?
它就是负责管理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模式。
快速创建第一个工程,其运行结果就是周期性通过串口终端输出字符串“This is BANK-1”。工程的链接配置及VTOR偏移配置如下图所示:
代码被放在0x0800,00000开启的空间,即BANK1。先不置位BFB2,即不选择从BANK2启动,运行程序可以看到输出结果,见下图配置和串口终端输出:
在保持当前选项字节配置不变的前提下,创建第二个工程。相比前面第一个工程除了串口输出内容稍有不同外,其它完全一样,包括工程的链接配置及VTOR偏移配置。 我将基于第二个工程的BIN文件烧写到0x0804,0000开始的地方。见下图示意:
顺便提下,如果使用ARM MDK IDE的话,往往需要使用fromelf将AXF或HEX文件转换下。你也可以不转换,先通过STM32CubeProgrammer将生成的HEX文件读进来,然后另存为BIN文件也可以使用。如下图示意:
我们可以通过STM32CubeProgrammer看到0x804,0000开始的空间写进了程序代码,即在BANK2也有了可以运行的另外一套程序。提醒:注意下此时地址0x8043a34开始的那串字符内容,记住这里放的是“This is BANK-2”。
烧录完毕后,复位开发板,串口终端输出仍然是BANK1的程序运行结果。
显然这是正常的,因为当前配置里仅仅启用双BANK模式,但并没有启用从BANK2启动功能。 现在启用从BANK2启动功能进行测试。通过STM32CubeProgrammer勾选选项字节里的BFB2位。
当我们完成上面BFB2选项位的编程后,串口终端输出立即变成BANK2区的内容了。
此时,不论我们怎样复位开发板,程序始终运行BANK2的代码。 我们通过STM32CubeProgrammer的HOT Plug模式与开发板保持连接,再来看看地址0x8043a34开始的那串字符。
看到了吧,此时这个地址的内容竟然是“This is BANK-1”,显然跟刚烧录进去时看到的内容不一样了。我们不妨继续看看此时0x8003a34地址开始的那串字符的内容。
此时0x8003a34地址开始的字符串内容则是“This is BANK-2”。 这两个地址所对应字符串的内容“变化”,正是因为在启用从BANK2启动过程中做了两个BANK的地址交换的缘故。换言之,真正变的是地址编码。 如果说,保持双BANK模式不变,但取消BANK2启动,再来观察这两个地址的字符串内容,会发现0x8003a34地址开始的字符串内容回归为“This is BANK-1”,0x8043a34地址开始的字符串内容回归为“This is BANK-2”。不妨来验证下。
显然,因为此时BFB2=0,即取消了从BANK2启动,现在无论怎样复位芯片,MCU都仅从BANK1启动并执行其程序,串口终端输出总是“This is BANK-1”。 关于STM32G4系列双BANK启动应用的演示就聊到这里,供有需要的同仁参考。 文章出处:茶话MCU |
STM32G4 LPTIM+DMAMUX 实现并行输出应用示例
实战经验 | LAT1578 SAU对NSC分区的影响
经验分享 | STM32G474 HRTIM Triggered-half模式实现两相交错电源180°相位同步方案
STM32大神笔记,超详细单片机学习汇总资料
经验分享 | 为什么重启ADC的DMA传输要先停掉ADC?
实战经验 | 基于STM32G474的三相LLC+SR PWM产出方案
STM32固件库分享,超全系列整理
经验分享 | STM32G4 双BANK Flash模式页擦除话题
经验分享 | STM32G4片内FLASH擦写实验笔记
经验分享 | STM32G4系列是否支持位带操作
微信公众号
手机版