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

【实战经验】STM32F769双Bank启动

[复制链接]
zero99 发布时间:2017-6-21 15:46
STM32F769双Bank启动
! e: |; O" r$ v2 @- ^+ x" G
前言
( O6 H0 @# a' d$ ~* X) ^2 ISTM32F769的双bank Flash,可以在执行程序的同时对另一个bank进行擦除和编程的操作。利用这个特性,可以实现在线程序更新,双bank启动的功能。本文将结合笔者在实际应用中遇到的问题,针对性的介绍nDBOOT分别设置为0和1时,两种不同的启动方式。同时你也可以参考AN4826和STM32F7 Cube库中的例程来进一步加深理解。9 f9 n8 o! j6 m) Q0 B
8 t6 e9 o2 H' _/ z
STM32F7双bank单bank配置
' N& F9 d8 _# i1 T4 l; V" K以2M字节Flash的F769为例,4 }+ A0 o; X" p! ?# s, o
当配置为单bank时,芯片的主FLASH分为:4个32K字节的扇区,1个128K字节的扇区,7个256K字节的扇区。AXI总线上的起始地址为0x08000000 ~0x081fffff;
: u  X" X7 |: I  f当配置成双bank时,芯片的主FLASH分为两个1M字节的bank,每个bank分为:4个16K字节的扇区,1个64K字节的扇区,7个128K字节的扇区。AXI总线上,Bank1的起始地址为0x08000000~0x080fffff, Bank2的起始地址为0x08100000~0x081fffff。
+ F7 Q1 ^3 Z: G; \/ Q, I; a见下图:! r* X8 [- X/ y$ `6 r
11.jpg   Q  v3 j) v8 j; G6 s" \3 O" P
/ U8 s. W8 D  F- [- `3 N
从单Bank切换到双Bank只需要将选项字中的nDBANK设置为0就可以了。& _, [- ]2 d$ n) k& `, w4 G
12.jpg
9 ]2 S5 M4 G( m/ ^, H* ?& ~" x( X: |. S, i  O* g
双bank启动的配置
* x- N9 K5 e# O, a* [阅读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还有什么是要注意的吗?下面将一一进行解答。" N% b8 G. I. y# S9 g5 A

+ B" ^) M( g; D, JnDBOOT和SWP_FB的说明
( X" X+ `) ~) w9 N* G5 Q我们先来了解一下nDBOOT和SWP_FB。
( F: L) N; P" ?0 g7 O/ Z* mnDBOOT位于选项字中,只有在nDBANK设置为0时才有效。
3 T6 I0 X$ Q& z3 s8 f/ Y+ T5 |7 F9 K当nDBOOT为1时,双启动模式被禁止,根据BOOT_ADDx的值来决定启动地址。这也是默认的设置;" T$ E0 u# Y' m' b: R
当nDBOOT为0时,双启动模式被启用,将始终从系统的bootloader启动(如果BOOT_ADDx的值在Flash范围内),或者从RAM启动(如果BOOT_ADDx的值在RAM范围内)。
* Q: a3 e% c. v
13.jpg
4 X, S& ~0 ^. @% @1 ?
0 ~- X5 d/ `' |" |/ fSWP_FB位于SYSCFG_MEMRMP寄存器中,用来切换Flash bank1和bank2的地址映射。
; L" r9 q9 d" u' j* M当SWP_FB的值为0时,Bank1映射到0x08000000的位置,从Bank1启动程序;/ h1 {" K/ @; p8 g. h# x: Y( S1 n
当SWP_FB的值为1时,Bank2映射到0x08100000的位置,从Bank2启动程序。4 u/ }0 A4 V9 B4 I$ H0 E
14.jpg 3 f6 ]$ q& x2 f8 ?3 t; j/ d0 ?
/ Z- |# ?+ j" h' D5 \% G" w5 T
nDBOOT为1时的双Bank启动5 x7 r/ b7 e" a6 ]' j3 W, y
nDBOOT默认值就是1,这时系统启动的地址由BOOT_ADDx决定。3 s0 e/ v5 i9 a& ~( o9 Y
这时通过修改BOOT_ADDx的值可以改变启动地址。使用这种方法的时候,要注意一个地方:$ b9 X$ ]) y0 S0 O; D; d8 [
中断向量表的位置,这里又要注意两个地方:/ r% [  F( Q8 ^; A' x+ @$ W' F
一个是link文件中的中断向量表位置的设置要和实际启动bank一致。也就是说,如果BOOT_ADDx设为0x08100000,在link文件中中断向量表的位置也应该设置为0x08100000。以IAR为例,BOOT_ADDx分别为0x08000000和0x08100000时,link文件中的设置对比见下图:5 |( v4 w, h0 I. O
15.jpg
, v8 K1 P  {3 L' ^0 v& V
5 |& q* M8 o8 I+ U! R另一个地方就是:system_stm32f7xx.c的函数SystemInit()中,有没有对中断向量表偏移寄存器进行设置,设置的值是否和实际启动的位置一致。注意:在SystemInit函数中,可以不对VTOR寄存器进行设置,MCU硬件会自动根据启动地址设置VTOR的值。如果在SystemInit函数中加了对VTOR寄存器进行设置的代码就必须保证和实际启动地址一致。
4 C7 U* F) |1 `  p! z  H
16.jpg ' [- E, j" ~8 s  d

5 e. }6 r- a2 i/ }! ]' s$ l总之,当nDBOOT为1时,选项字中的BOOT_ADDx的值,Link文件中FLASH的起始地址,还有中断向量表的位置都必须一致,并且设置为想要启动的位置。8 p1 N7 V% h. ^
修改选项字的内容可以通过ST-LINK Utility进行。8 O. J/ a7 D& k& D6 @

+ p& U- V/ w8 WnDBOOT为0时的双Bank启动
4 r& H* j0 R+ X* j* {! C  f, w选项字中的nDBOOT设置为0时,程序会从系统bootloader启动,然后会根据BOOT_ADDx的值决定从哪里启动。具体Bootloader的启动流程见下图(AN2606)。
' f+ C) q% i0 _& f9 j
17.jpg
! R! Y0 ~+ U! I  `! @" P- p
" \3 l9 [% E, u! i在上图中,当BOOT_ADDx设定的启动地址在Bank2时,系统bootloader会将SWP_FB的值设为1,将Bank2映射到0x08000000的位置。从Bank2启动程序。当BOOT_ADDx设定的启动地址在Bank1时,系统bootloader会将SWP_FB的值设为0,将Bank1映射到0x08000000的位置。从Bank1启动程序。
+ r% ]( H9 P+ Q* K  M0 C- }% W( y, N使用这种方法时要注意的是:Link文件里的Flash起始地址,和中断向量表的位置都设置为0x08000000. system_stm32f7xx.c的函数SystemInit()中对中断向量表偏移地址的设置(如果有的话)要与Link文件一致。
' G& P9 v2 |5 C# _+ u$ v. ~
- k/ v" B) \" H3 v3 [4 R/ i0 A总结. ?0 D, D" o0 d( v( @9 T: o
说到这里,现在也可以看出这两种方式的区别了。都是通过修改BOOT_ADDx来切换启动从两个Bank启动。第一种方法,同一个应用程序,从不同的Bank启动时,中断向量表的位置必须在程序中(link文件中)进行修改。所以实际的bin文件是不同的。也就是说,编程的时候就必须明确程序是放在哪个Bank的。而第二种方法,可以将同一个bin文件烧写到不同的Bank。只需要保证文件烧写的位置和BOOT_ADDx设置的地址一致就可以了。& w% R+ \( Y! p# u

) ]- w7 w" l5 [! J3 |" c) E
5 r' |% H  l. u
资料下载& \# y- J, y1 }4 P# r2 o

& f5 n' S5 v# j- L- w6 a更多实战经验
% C& b! f5 h* m( j7 b- K
赞 收藏 2 评论4 发布时间:2017-6-21 15:46

举报

4个回答
wolfgang 回答时间:2017-6-21 16:16:46
双BANK的确带来好处。
Paderboy 回答时间:2017-6-22 08:45:03
学习。。。。了
ychlucky 回答时间:2017-6-24 10:37:51
RockDeng 回答时间:2021-8-27 16:43:24
你好,我想问下如果代码大小超过了1MByte是不是就不能用双bank了 ,有没有文档说明的。谢谢。

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版