请选择 进入手机版 | 继续访问电脑版

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

【实战经验】STM32F769双Bank启动

[复制链接]
zero99 发布时间:2017-6-21 15:46
STM32F769双Bank启动
' m6 N, k3 y& S" F( |
前言( @) }0 a! b* t. k, d4 O6 s
STM32F769的双bank Flash,可以在执行程序的同时对另一个bank进行擦除和编程的操作。利用这个特性,可以实现在线程序更新,双bank启动的功能。本文将结合笔者在实际应用中遇到的问题,针对性的介绍nDBOOT分别设置为0和1时,两种不同的启动方式。同时你也可以参考AN4826和STM32F7 Cube库中的例程来进一步加深理解。  X4 u3 j$ y  U1 w
2 N6 m1 ^/ T) @0 v* y
STM32F7双bank单bank配置. C, h' s- L/ L
以2M字节Flash的F769为例,
* \4 p/ H' s( s- K& f, Z* A当配置为单bank时,芯片的主FLASH分为:4个32K字节的扇区,1个128K字节的扇区,7个256K字节的扇区。AXI总线上的起始地址为0x08000000 ~0x081fffff;: L8 q$ U( J0 V) h. {9 _
当配置成双bank时,芯片的主FLASH分为两个1M字节的bank,每个bank分为:4个16K字节的扇区,1个64K字节的扇区,7个128K字节的扇区。AXI总线上,Bank1的起始地址为0x08000000~0x080fffff, Bank2的起始地址为0x08100000~0x081fffff。
9 d; h6 r" k0 C5 E见下图:7 y0 i, r- c/ O1 a# K* R+ g
11.jpg + P2 G4 [9 r' f4 G

. I: I% T6 F* g从单Bank切换到双Bank只需要将选项字中的nDBANK设置为0就可以了。7 z. ?' L0 {0 \
12.jpg * a. v7 Z& Y- A

  k9 |) B8 k- ~- m3 y双bank启动的配置* ~9 ?& K; o! f" {* V! H( X! t5 T
阅读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还有什么是要注意的吗?下面将一一进行解答。5 V/ j4 M6 o' A

! t4 X" G/ _) DnDBOOT和SWP_FB的说明
$ F7 I7 ~7 P. @; ^我们先来了解一下nDBOOT和SWP_FB。5 X' U8 g0 v- i) C9 A3 I9 r
nDBOOT位于选项字中,只有在nDBANK设置为0时才有效。
. ?1 i1 ]- E/ F! [# M( g当nDBOOT为1时,双启动模式被禁止,根据BOOT_ADDx的值来决定启动地址。这也是默认的设置;6 f( R9 @( l, F- T: H5 y' _3 W
当nDBOOT为0时,双启动模式被启用,将始终从系统的bootloader启动(如果BOOT_ADDx的值在Flash范围内),或者从RAM启动(如果BOOT_ADDx的值在RAM范围内)。
$ ?- d( g  Z$ Q- b; U# `
13.jpg 9 v5 }' p: C, i* k$ P$ W; b0 B1 ?7 E

+ u) Q/ N; Y  [SWP_FB位于SYSCFG_MEMRMP寄存器中,用来切换Flash bank1和bank2的地址映射。
( g3 u+ s& C: i& e( m当SWP_FB的值为0时,Bank1映射到0x08000000的位置,从Bank1启动程序;3 w7 l$ l+ T  s9 H: ]" @0 \
当SWP_FB的值为1时,Bank2映射到0x08100000的位置,从Bank2启动程序。
3 ~) M# G- W! n8 i
14.jpg
! R4 e: S+ T- N0 q1 g+ U% B: B) P# S; i) O
nDBOOT为1时的双Bank启动
. d" d. w) [- A8 B; W, unDBOOT默认值就是1,这时系统启动的地址由BOOT_ADDx决定。
7 F+ k" B0 F) K% W这时通过修改BOOT_ADDx的值可以改变启动地址。使用这种方法的时候,要注意一个地方:( C; N' v3 P* A1 @' g+ k
中断向量表的位置,这里又要注意两个地方:
( \! R7 i; ^+ d( V# C1 }0 k一个是link文件中的中断向量表位置的设置要和实际启动bank一致。也就是说,如果BOOT_ADDx设为0x08100000,在link文件中中断向量表的位置也应该设置为0x08100000。以IAR为例,BOOT_ADDx分别为0x08000000和0x08100000时,link文件中的设置对比见下图:
8 D$ {. @& q; p+ W+ z2 y
15.jpg
. ^) r/ L0 Y) P* v) x& @( g5 |- d) z
8 d" M& O# k! {; E9 N另一个地方就是:system_stm32f7xx.c的函数SystemInit()中,有没有对中断向量表偏移寄存器进行设置,设置的值是否和实际启动的位置一致。注意:在SystemInit函数中,可以不对VTOR寄存器进行设置,MCU硬件会自动根据启动地址设置VTOR的值。如果在SystemInit函数中加了对VTOR寄存器进行设置的代码就必须保证和实际启动地址一致。
: O, x5 B/ A. C; |- f: _
16.jpg ; v" Q* z, }+ k# T* v( G
  y1 ^0 _% T) n0 B
总之,当nDBOOT为1时,选项字中的BOOT_ADDx的值,Link文件中FLASH的起始地址,还有中断向量表的位置都必须一致,并且设置为想要启动的位置。
) q# m1 Q- y( u$ c修改选项字的内容可以通过ST-LINK Utility进行。3 D: W9 o, A+ W; J" I4 f. o( E5 F
  Q+ d9 Q8 b) K4 M8 o; }1 n
nDBOOT为0时的双Bank启动
+ o9 }1 w/ e6 w& z) A, _选项字中的nDBOOT设置为0时,程序会从系统bootloader启动,然后会根据BOOT_ADDx的值决定从哪里启动。具体Bootloader的启动流程见下图(AN2606)。: v8 X* g8 U  Z, ^
17.jpg   n- \! X8 }+ W3 Z& T* t

7 r8 z9 G' s. T在上图中,当BOOT_ADDx设定的启动地址在Bank2时,系统bootloader会将SWP_FB的值设为1,将Bank2映射到0x08000000的位置。从Bank2启动程序。当BOOT_ADDx设定的启动地址在Bank1时,系统bootloader会将SWP_FB的值设为0,将Bank1映射到0x08000000的位置。从Bank1启动程序。
3 Q3 C1 R" _, @! j6 t: c0 r9 H使用这种方法时要注意的是:Link文件里的Flash起始地址,和中断向量表的位置都设置为0x08000000. system_stm32f7xx.c的函数SystemInit()中对中断向量表偏移地址的设置(如果有的话)要与Link文件一致。+ b. T8 m2 L3 z  X

" g) |9 c; z  }6 Y( D# w; w  ]9 V+ g总结4 C; ~/ c* D$ [2 F
说到这里,现在也可以看出这两种方式的区别了。都是通过修改BOOT_ADDx来切换启动从两个Bank启动。第一种方法,同一个应用程序,从不同的Bank启动时,中断向量表的位置必须在程序中(link文件中)进行修改。所以实际的bin文件是不同的。也就是说,编程的时候就必须明确程序是放在哪个Bank的。而第二种方法,可以将同一个bin文件烧写到不同的Bank。只需要保证文件烧写的位置和BOOT_ADDx设置的地址一致就可以了。2 D7 V/ ]/ N: |+ _
% O6 r4 C& T4 }$ a5 g3 K! w
* f( `/ I4 i" O4 h$ _& V8 N
资料下载9 O$ ~- L+ d) z& O2 s: p

' T- P( x/ T6 X7 l5 ?更多实战经验
, r. T, J* ]3 Z
收藏 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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版