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

【经验分享】STM32F769 双 Bank 启动

[复制链接]
STMCU小助手 发布时间:2022-2-20 15:36
前言1 C" o, }2 I, n1 `
STM32F769 的双 bank Flash,可以在执行程序的同时对另一个 bank 进行擦除和编程的操作。利用这个特性,可以实现在线程序更新,双 bank 启动的功能。本文将结合笔者在实际应用中遇到的问题,针对性的介绍 nDBOOT 分别设置为 0 和 1 时,两种不同的启动方式。同时你也可以参考 AN4826 和 STM32F7 Cube 库中的例程来进一步加深理解。
5 k: }* [' T! Q
( H; ?/ Z" a" |2 U2 `8 ]; _* ISTM32F7 双 bank 单 bank 配置
7 ?! c% j. p- [2 w以 2M 字节 Flash 的 F769 为例,
$ ~7 L' w$ [2 s- n* A* ]7 s当配置为单 bank 时,芯片的主 FLASH 分为:4 个 32K 字节的扇区,1 个 128K 字节的扇区,7 个 256K 字节的扇区。AXI 总线上的起始地址为 0x08000000 ~0x081fffff;" B0 E# e$ K3 K
当配置成双 bank 时,芯片的主 FLASH 分为两个 1M 字节的 bank,每个 bank 分为:4 个 16K 字节的扇区,1 个 64K 字节的扇区,7 个 128K 字节的扇区。AXI 总线上,Bank1 的起始地址为 0x08000000~0x080fffff, Bank2 的起始地址为0x08100000~0x081fffff。
  m' `& t& E) O# _' Z; M7 e见下图:" J! C, C6 g& [' g" L2 l

2 S8 x9 O3 I9 S( d" G1 N# N. W6 M 3G0@PgC4_RN`[{UNV{5CO.png ( x# o: K3 c! y" u7 ~

, Q/ B, @0 S' q& ]从单 Bank 切换到双 Bank 只需要将选项字中的 nDBANK 设置为 0 就可以了。% Q) X+ A, y( X' C& }

! Z. v! T3 F6 r- _ _@)$N[ULY9~NVUJ3@TU})CB.png
. ~; ^; t/ K  D7 p% u0 n& W+ F& }2 H; s6 h" C9 n  l% p" G" y, g
双 bank 启动的配置+ b* l" X! T+ P/ T6 Y% x, ~8 g
阅读 STM32F769 的参考手册 RM0410,知道它的启动地址是根据 BOOT 引脚的状态由选项字中的 BOOT_ADD0 或者BOOT_ADD1 来决定的。可以在从地址 0 到 0x3FFFFFFF 的合法地址范围内,以 16K 字节为间隔从任何地址启动。也就是说,可以通过设置 BOOT_ADD0 或者 BOOT_ADD1 的值为 0x08000000 或者 0x08100000 来从 Bank1 或者 Bank2 启动。这个很好理解,但选项字里还有一个 nDBOOT, 这个字段又有什么作用呢?它会怎样影响 STM32F769 的启动过程呢?" R! }4 K# S, g2 _/ c
SYSCFG_MEMRMP 中 SWP_FB 字段又有什么用呢?除了修改 BOOT_ADDx 还有什么是要注意的吗?下面将一一进行解答。  l( _/ G& i# o$ B8 q
# W: D" e+ T4 l( n# B: G( l

! v# ~' T+ q8 k; mnDBOOT 和 SWP_FB 的说明
9 m5 b6 K$ \7 c9 r: S, }% h4 N我们先来了解一下 nDBOOT 和 SWP_FB。
. g& a0 h( w# a7 L3 ~( Y( lnDBOOT 位于选项字中,只有在 nDBANK 设置为 0 时才有效。9 A# @, p5 B3 y% y: U9 T) N
当 nDBOOT 为 1 时,双启动模式被禁止,根据 BOOT_ADDx 的值来决定启动地址。这也是默认的设置;
* A2 n3 i' N7 V当 nDBOOT 为 0 时,双启动模式被启用,将始终从系统的 bootloader 启动(如果 BOOT_ADDx 的值在 Flash 范围内),或者从 RAM 启动(如果 BOOT_ADDx 的值在 RAM 范围内)。. Y; n, k9 a9 D; N
/ d- @8 e, m1 k$ M6 W; F1 {
J20{64Z4}NLM~Q(`LQ_XLB9.png
0 w% s1 U  I4 r% _' r. G) u, V6 |
SWP_FB 位于 SYSCFG_MEMRMP 寄存器中,用来切换 Flash bank1 和 bank2 的地址映射。
4 D! |) ?: I9 k4 P& H5 j+ x, Z5 D0 |当 SWP_FB 的值为 0 时,Bank1 映射到 0x08000000 的位置,从 Bank1 启动程序;3 m* ?$ Q$ l* Q4 T1 y6 k9 J. i* f9 o
当 SWP_FB 的值为 1 时,Bank2 映射到 0x08100000 的位置,从 Bank2 启动程序。
+ g) d$ m3 u' O" ~& b: p/ p
* X5 B6 l% t/ [( w0 S/ { DI[{{O3NEX8YEUFB1}~~P_R.png ( N( b( {* _8 C5 _5 Z
7 N+ Z. H4 ]1 c, e1 `! W, Z9 Y
nDBOOT 为 1 时的双 Bank 启动
6 J5 A) l- r( G* S9 @9 wnDBOOT 默认值就是 1,这时系统启动的地址由 BOOT_ADDx 决定。8 e4 A# W. b6 h7 C
这时通过修改 BOOT_ADDx 的值可以改变启动地址。使用这种方法的时候,要注意一个地方:
, Z: K. u& G- s* L" R  N中断向量表的位置,这里又要注意两个地方:
" f3 d& u8 C1 o8 E5 ]7 R一个是 link 文件中的中断向量表位置的设置要和实际启动 bank 一致。也就是说,如果 BOOT_ADDx 设为 0x08100000,在link 文件中中断向量表的位置也应该设置为 0x08100000。以 IAR 为例,BOOT_ADDx 分别为 0x08000000 和 0x08100000时,link 文件中的设置对比见下图:
( f& k1 w' {8 w( X* `# I
* x/ Z, }' i7 Q! s7 y( e X@T~CZ0YMG@L5FME30[C8UG.png
! S* t% d; \* [8 i3 A" g" t4 ~7 ]
另一个地方就是:system_stm32f7xx.c 的函数 SystemInit()中,有没有对中断向量表偏移寄存器进行设置,设置的值是否和实际启动的位置一致。注意:在 SystemInit 函数中,可以不对 VTOR 寄存器进行设置,MCU 硬件会自动根据启动地址设置VTOR 的值。如果在 SystemInit 函数中加了对 VTOR 寄存器进行设置的代码就必须保证和实际启动地址一致。
8 f' b) o8 U2 q
  1. /* Configure the Vector Table location add offset address ------------------*/
    6 b2 A; b+ n& O
  2. #ifdef VECT_TAB_SRAM
    ( T; c' Z( }0 E: R) Q( P
  3. SCB->VTOR = SRAM1_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM, a: k) E- K% `  ?6 W
  4. */
    , a3 V# ]( v8 p* ^& ~
  5. #else
    6 V/ \+ Y4 S* x0 L; C
  6. SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH
    / m  ~6 V' k& m
  7. */; R. S( O$ B. A9 b& Q
  8. #endif
复制代码
8 v  n. ~, ?  O4 P/ f" O/ m% H
总之,当 nDBOOT 为 1 时,选项字中的 BOOT_ADDx 的值,Link 文件中 FLASH 的起始地址,还有中断向量表的位置都必须一致,并且设置为想要启动的位置。1 I2 Y" ~0 K) M5 s0 m$ P
修改选项字的内容可以通过 ST-LINK Utility 进行。
; R& P% D! p8 R% d# g5 `/ y( |+ H5 \1 p* E7 c! {
nDBOOT 为 0 时的双 Bank 启动
2 ^7 E, q1 ~: M, C  d选项字中的 nDBOOT 设置为 0 时,程序会从系统 bootloader 启动,然后会根据 BOOT_ADDx 的值决定从哪里启动。具体Bootloader 的启动流程见下图(AN2606)。
$ Y% k2 x( @2 F; k9 Z; L# F
6 H% l9 S3 L" C1 f  ^# | HY[8P{K9RFJ693SIEBA59JG.png
* Q. f0 F- ]1 ^" O4 ~0 t
7 B5 Q% o+ X- l, K" K" `" S7 \在上图中,当 BOOT_ADDx 设定的启动地址在 Bank2 时,系统 bootloader 会将 SWP_FB 的值设为 1,将 Bank2 映射到
( j3 w' g( s7 ]9 r! K( J0x08000000 的位置。从 Bank2 启动程序。当 BOOT_ADDx 设定的启动地址在 Bank1 时,系统 bootloader 会将 SWP_FB 的值设为 0,将 Bank1 映射到 0x08000000 的位置。从 Bank1 启动程序。使用这种方法时要注意的是:Link 文件里的 Flash 起始地址,和中断向量表的位置都设置为 0x08000000.system_stm32f7xx.c 的函数 SystemInit()中对中断向量表偏移地址的设置(如果有的话)要与 Link 文件一致。
! G% Y  B' N9 O. I, {
& a! `; I! }, o/ I6 ?7 V$ ^! l: g+ u3 b7 k% O
0 W$ u+ C3 n: O2 g0 |
总结
3 w; @9 q) D$ h5 S说到这里,现在也可以看出这两种方式的区别了。都是通过修改 BOOT_ADDx 来切换启动从两个 Bank 启动。第一种方法,同一个应用程序,从不同的 Bank 启动时,中断向量表的位置必须在程序中(link 文件中)进行修改。所以实际的 bin 文件是不同的。也就是说,编程的时候就必须明确程序是放在哪个 Bank 的。而第二种方法,可以将同一个 bin 文件烧写到不同的Bank。只需要保证文件烧写的位置和 BOOT_ADDx 设置的地址一致就可以了。$ G- p' I2 ?$ y" W' W( q5 E
* x. ~% Z8 D  O
+ n. D# J* O  [4 z
收藏 评论0 发布时间:2022-2-20 15:36

举报

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