STM32F769双Bank启动 前言! D8 p3 M" G. H4 o& I STM32F769的双bank Flash,可以在执行程序的同时对另一个bank进行擦除和编程的操作。利用这个特性,可以实现在线程序更新,双bank启动的功能。本文将结合笔者在实际应用中遇到的问题,针对性的介绍nDBOOT分别设置为0和1时,两种不同的启动方式。同时你也可以参考AN4826和STM32F7 Cube库中的例程来进一步加深理解。( f3 `2 r4 N5 `: U 4 F3 A5 l) M# w0 v STM32F7双bank单bank配置 以2M字节Flash的F769为例," K+ G* \* q. t 当配置为单bank时,芯片的主FLASH分为:4个32K字节的扇区,1个128K字节的扇区,7个256K字节的扇区。AXI总线上的起始地址为0x08000000 ~0x081fffff; 当配置成双bank时,芯片的主FLASH分为两个1M字节的bank,每个bank分为:4个16K字节的扇区,1个64K字节的扇区,7个128K字节的扇区。AXI总线上,Bank1的起始地址为0x08000000~0x080fffff, Bank2的起始地址为0x08100000~0x081fffff。5 Z/ J$ j& _# k9 n4 J3 Y 见下图: 8 q! v, I2 _( v/ F; D/ i! f7 _7 \4 c 从单Bank切换到双Bank只需要将选项字中的nDBANK设置为0就可以了。# d% A3 Y7 s$ \" n 双bank启动的配置 阅读STM32F769的参考手册RM0410,知道它的启动地址是根据BOOT引脚的状态由选项字中的BOOT_ADD0或者BOOT_ADD1来决定的。可以在从地址0到0x3FFFFFFF的合法地址范围内,以16K字节为间隔从任何地址启动。也就是说,可以通过设置BOOT_ADD0或者BOOT_ADD1的值为0x08000000或者0x08100000来从Bank1或者Bank2启动。这个很好理解,但选项字里还有一个nDBOOT, 这个字段又有什么作用呢?它会怎样影响STM32F769的启动过程呢?SYSCFG_MEMRMP中SWP_FB字段又有什么用呢?除了修改BOOT_ADDx还有什么是要注意的吗?下面将一一进行解答。 nDBOOT和SWP_FB的说明 我们先来了解一下nDBOOT和SWP_FB。 nDBOOT位于选项字中,只有在nDBANK设置为0时才有效。 当nDBOOT为1时,双启动模式被禁止,根据BOOT_ADDx的值来决定启动地址。这也是默认的设置; 当nDBOOT为0时,双启动模式被启用,将始终从系统的bootloader启动(如果BOOT_ADDx的值在Flash范围内),或者从RAM启动(如果BOOT_ADDx的值在RAM范围内)。 ; S% y1 d* o/ \- z2 M SWP_FB位于SYSCFG_MEMRMP寄存器中,用来切换Flash bank1和bank2的地址映射。+ d0 o; _) P4 @6 ^2 p' Z 当SWP_FB的值为0时,Bank1映射到0x08000000的位置,从Bank1启动程序; n3 s, ]. |! P5 ^" b0 @- u- m 当SWP_FB的值为1时,Bank2映射到0x08100000的位置,从Bank2启动程序。 / w' E8 _' H) H2 p' H nDBOOT为1时的双Bank启动 nDBOOT默认值就是1,这时系统启动的地址由BOOT_ADDx决定。. B3 d8 U7 j8 j5 Z 这时通过修改BOOT_ADDx的值可以改变启动地址。使用这种方法的时候,要注意一个地方:4 R0 e7 T- N1 Y 中断向量表的位置,这里又要注意两个地方:6 x# }# E. ~9 [' C E 一个是link文件中的中断向量表位置的设置要和实际启动bank一致。也就是说,如果BOOT_ADDx设为0x08100000,在link文件中中断向量表的位置也应该设置为0x08100000。以IAR为例,BOOT_ADDx分别为0x08000000和0x08100000时,link文件中的设置对比见下图:1 Q% k7 e1 C, P3 K: [$ k5 L 另一个地方就是:system_stm32f7xx.c的函数SystemInit()中,有没有对中断向量表偏移寄存器进行设置,设置的值是否和实际启动的位置一致。注意:在SystemInit函数中,可以不对VTOR寄存器进行设置,MCU硬件会自动根据启动地址设置VTOR的值。如果在SystemInit函数中加了对VTOR寄存器进行设置的代码就必须保证和实际启动地址一致。 总之,当nDBOOT为1时,选项字中的BOOT_ADDx的值,Link文件中FLASH的起始地址,还有中断向量表的位置都必须一致,并且设置为想要启动的位置。* Z* ^2 l% S, G+ w2 T% d1 f6 { 修改选项字的内容可以通过ST-LINK Utility进行。 0 n; j0 D+ Y: o6 v$ a9 g7 { nDBOOT为0时的双Bank启动$ W7 e4 H, g$ y) e3 V. ?* k 选项字中的nDBOOT设置为0时,程序会从系统bootloader启动,然后会根据BOOT_ADDx的值决定从哪里启动。具体Bootloader的启动流程见下图(AN2606)。 在上图中,当BOOT_ADDx设定的启动地址在Bank2时,系统bootloader会将SWP_FB的值设为1,将Bank2映射到0x08000000的位置。从Bank2启动程序。当BOOT_ADDx设定的启动地址在Bank1时,系统bootloader会将SWP_FB的值设为0,将Bank1映射到0x08000000的位置。从Bank1启动程序。 使用这种方法时要注意的是:Link文件里的Flash起始地址,和中断向量表的位置都设置为0x08000000. system_stm32f7xx.c的函数SystemInit()中对中断向量表偏移地址的设置(如果有的话)要与Link文件一致。! V X0 u% [9 M9 R% E7 c) p3 | % X3 Y0 L& |. F" V) Q7 L 总结 说到这里,现在也可以看出这两种方式的区别了。都是通过修改BOOT_ADDx来切换启动从两个Bank启动。第一种方法,同一个应用程序,从不同的Bank启动时,中断向量表的位置必须在程序中(link文件中)进行修改。所以实际的bin文件是不同的。也就是说,编程的时候就必须明确程序是放在哪个Bank的。而第二种方法,可以将同一个bin文件烧写到不同的Bank。只需要保证文件烧写的位置和BOOT_ADDx设置的地址一致就可以了。! |% i$ K& U' K : w. G1 x* ^. ]. y 资料下载8 b( j7 `- }5 E* G* c2 D3 W( t 更多实战经验% \0 H3 e: g+ R1 A" N. ^ |
双BANK的确带来好处。 |
学习。。。。了 |
你好,我想问下如果代码大小超过了1MByte是不是就不能用双bank了 ,有没有文档说明的。谢谢。 |
基于STM32F746G-Discover的扩展电路板
【合集】STM32F7教程、资料大集合
F769 Discovery实现播放U盘音乐的播放器
STM32 VS Code Extension (在Ubuntu上开发STM32,ST官方vscode插件使用指南)
STM32F765@216MHz跑NES模拟器【代码】【视频】
基于STM32F7实现ADC软件触发+轮询采集
基于STM32F7进行ADC采集解决更新问题
基于STM32F7使用定时器经验分享
实现基于STM32F7中周期采集
基于STM32F7中实现采集和中断