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

【经验分享】STM32F769 双 Bank 启动

[复制链接]
STMCU小助手 发布时间:2022-2-20 15:36
前言) ~$ w, n+ i5 |3 ?2 l3 f% F
STM32F769 的双 bank Flash,可以在执行程序的同时对另一个 bank 进行擦除和编程的操作。利用这个特性,可以实现在线程序更新,双 bank 启动的功能。本文将结合笔者在实际应用中遇到的问题,针对性的介绍 nDBOOT 分别设置为 0 和 1 时,两种不同的启动方式。同时你也可以参考 AN4826 和 STM32F7 Cube 库中的例程来进一步加深理解。
" o& V+ y$ P8 e2 A  S4 l3 i" S, `3 ]- j. ^
STM32F7 双 bank 单 bank 配置
0 X9 x# L( q* H0 A% I0 ^以 2M 字节 Flash 的 F769 为例,% u$ _! ]# E& y! |6 B; C
当配置为单 bank 时,芯片的主 FLASH 分为:4 个 32K 字节的扇区,1 个 128K 字节的扇区,7 个 256K 字节的扇区。AXI 总线上的起始地址为 0x08000000 ~0x081fffff;' C0 W7 w  ?. B0 f# {  O4 X7 Z
当配置成双 bank 时,芯片的主 FLASH 分为两个 1M 字节的 bank,每个 bank 分为:4 个 16K 字节的扇区,1 个 64K 字节的扇区,7 个 128K 字节的扇区。AXI 总线上,Bank1 的起始地址为 0x08000000~0x080fffff, Bank2 的起始地址为0x08100000~0x081fffff。+ f: f  h* x( R& `5 J
见下图:) p$ b* N4 W! G5 g5 n; q5 e

6 _6 v4 \  H6 K4 V7 G 3G0@PgC4_RN`[{UNV{5CO.png
0 d7 }$ m2 P* s) L# ?: g3 p1 y- ~( K, K- Y& Z; w5 q
从单 Bank 切换到双 Bank 只需要将选项字中的 nDBANK 设置为 0 就可以了。8 R  @0 @! a0 S- M3 w
; H; [2 d& p- Q$ e  M
_@)$N[ULY9~NVUJ3@TU})CB.png
. W7 S% ?: g/ @: v' C$ \! J  B0 Z7 X
双 bank 启动的配置
/ X  h% e7 W0 ]阅读 STM32F769 的参考手册 RM0410,知道它的启动地址是根据 BOOT 引脚的状态由选项字中的 BOOT_ADD0 或者BOOT_ADD1 来决定的。可以在从地址 0 到 0x3FFFFFFF 的合法地址范围内,以 16K 字节为间隔从任何地址启动。也就是说,可以通过设置 BOOT_ADD0 或者 BOOT_ADD1 的值为 0x08000000 或者 0x08100000 来从 Bank1 或者 Bank2 启动。这个很好理解,但选项字里还有一个 nDBOOT, 这个字段又有什么作用呢?它会怎样影响 STM32F769 的启动过程呢?$ ^& [! {* u$ u
SYSCFG_MEMRMP 中 SWP_FB 字段又有什么用呢?除了修改 BOOT_ADDx 还有什么是要注意的吗?下面将一一进行解答。
1 s$ n0 }. O  b3 T0 j
# }" E. n8 x/ f4 d# j2 J- [; M/ h8 N1 c( [, G+ z9 X  F8 z
nDBOOT 和 SWP_FB 的说明. m0 h& H4 v/ {1 @
我们先来了解一下 nDBOOT 和 SWP_FB。
% c& h% J( M1 c! |- J1 gnDBOOT 位于选项字中,只有在 nDBANK 设置为 0 时才有效。% T+ M' f7 V  Y1 o; D/ E% [4 L9 L
当 nDBOOT 为 1 时,双启动模式被禁止,根据 BOOT_ADDx 的值来决定启动地址。这也是默认的设置;
* S3 e, g) n: U当 nDBOOT 为 0 时,双启动模式被启用,将始终从系统的 bootloader 启动(如果 BOOT_ADDx 的值在 Flash 范围内),或者从 RAM 启动(如果 BOOT_ADDx 的值在 RAM 范围内)。
# n; ?! ?) A  S2 K
3 v1 @+ V" d% S& J* j J20{64Z4}NLM~Q(`LQ_XLB9.png ' [5 A4 s  u8 b9 ~2 o

/ {2 Y5 T. S2 q! YSWP_FB 位于 SYSCFG_MEMRMP 寄存器中,用来切换 Flash bank1 和 bank2 的地址映射。
3 \2 c1 q( @/ d. U$ S3 p当 SWP_FB 的值为 0 时,Bank1 映射到 0x08000000 的位置,从 Bank1 启动程序;
7 w$ |, e( O( v1 T0 f( R当 SWP_FB 的值为 1 时,Bank2 映射到 0x08100000 的位置,从 Bank2 启动程序。4 n" ?. a) l/ }$ y, z
; ^) ]& a' V* e9 C& N7 l
DI[{{O3NEX8YEUFB1}~~P_R.png : z+ h! S; `0 e1 m6 \

; H# w" t# T' w$ U- q/ a. f! pnDBOOT 为 1 时的双 Bank 启动7 \3 F6 v6 J8 A) `6 Y1 w
nDBOOT 默认值就是 1,这时系统启动的地址由 BOOT_ADDx 决定。
9 @( m8 Y3 Q9 C0 B3 B这时通过修改 BOOT_ADDx 的值可以改变启动地址。使用这种方法的时候,要注意一个地方:
- x& H) [+ l8 y中断向量表的位置,这里又要注意两个地方:
  n3 _5 ^6 ]8 k4 x' j7 d  U2 O一个是 link 文件中的中断向量表位置的设置要和实际启动 bank 一致。也就是说,如果 BOOT_ADDx 设为 0x08100000,在link 文件中中断向量表的位置也应该设置为 0x08100000。以 IAR 为例,BOOT_ADDx 分别为 0x08000000 和 0x08100000时,link 文件中的设置对比见下图:
3 s/ v* {1 w/ ]2 r" G4 M  ^, X5 z+ D1 n- J, e0 M. A6 S
X@T~CZ0YMG@L5FME30[C8UG.png
- c: Z- \7 J* R8 r( ~1 c6 Y* e( v3 W! ~/ t0 |
另一个地方就是:system_stm32f7xx.c 的函数 SystemInit()中,有没有对中断向量表偏移寄存器进行设置,设置的值是否和实际启动的位置一致。注意:在 SystemInit 函数中,可以不对 VTOR 寄存器进行设置,MCU 硬件会自动根据启动地址设置VTOR 的值。如果在 SystemInit 函数中加了对 VTOR 寄存器进行设置的代码就必须保证和实际启动地址一致。
/ M% U0 k/ z0 B& r
  1. /* Configure the Vector Table location add offset address ------------------*/7 h3 O/ j( \- T2 ?6 s
  2. #ifdef VECT_TAB_SRAM
    . h  e' ]7 V3 n$ `$ B; I; Q3 m5 S
  3. SCB->VTOR = SRAM1_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM) G, Y& x, l! K# J2 m
  4. */4 S8 o" y1 d" z8 J, t
  5. #else1 ^, y' J2 Q: B7 a  D- S
  6. SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH; _5 H  z: J# X1 c/ ~* Q
  7. */
    3 O5 |* d" {5 o, t, A
  8. #endif
复制代码

: s% p" @7 P* Q' E总之,当 nDBOOT 为 1 时,选项字中的 BOOT_ADDx 的值,Link 文件中 FLASH 的起始地址,还有中断向量表的位置都必须一致,并且设置为想要启动的位置。
* U" E5 K, N" @+ o# O: P修改选项字的内容可以通过 ST-LINK Utility 进行。
2 v, Z1 c: d% t5 t4 H
1 p5 L* G( j. F6 f5 w% fnDBOOT 为 0 时的双 Bank 启动
  e& X8 C0 j& ]" q8 d选项字中的 nDBOOT 设置为 0 时,程序会从系统 bootloader 启动,然后会根据 BOOT_ADDx 的值决定从哪里启动。具体Bootloader 的启动流程见下图(AN2606)。  C# w% F$ X1 l, K1 c  V/ q
5 ?3 L* _& o$ x) @/ \
HY[8P{K9RFJ693SIEBA59JG.png 9 ~* t. R- Z; ?8 E! B
( [' i6 m4 L- a. C( Y
在上图中,当 BOOT_ADDx 设定的启动地址在 Bank2 时,系统 bootloader 会将 SWP_FB 的值设为 1,将 Bank2 映射到2 n! b& @3 Q; V3 T
0x08000000 的位置。从 Bank2 启动程序。当 BOOT_ADDx 设定的启动地址在 Bank1 时,系统 bootloader 会将 SWP_FB 的值设为 0,将 Bank1 映射到 0x08000000 的位置。从 Bank1 启动程序。使用这种方法时要注意的是:Link 文件里的 Flash 起始地址,和中断向量表的位置都设置为 0x08000000.system_stm32f7xx.c 的函数 SystemInit()中对中断向量表偏移地址的设置(如果有的话)要与 Link 文件一致。
% r- ^0 l. U7 [/ l9 t; I; j: {% V5 T* Z$ V# Y, h7 V- |

/ `4 Q1 j" F5 h: \% H9 u, y2 j; P% H" b/ a/ F( `/ l
总结
. l. I" T8 K; }0 I9 _1 x6 k" S: [说到这里,现在也可以看出这两种方式的区别了。都是通过修改 BOOT_ADDx 来切换启动从两个 Bank 启动。第一种方法,同一个应用程序,从不同的 Bank 启动时,中断向量表的位置必须在程序中(link 文件中)进行修改。所以实际的 bin 文件是不同的。也就是说,编程的时候就必须明确程序是放在哪个 Bank 的。而第二种方法,可以将同一个 bin 文件烧写到不同的Bank。只需要保证文件烧写的位置和 BOOT_ADDx 设置的地址一致就可以了。
( A9 \% ^/ B) j7 I3 a/ D; [) }- A$ W6 M) J$ C/ R, {

* h4 x9 Y9 ^7 d4 s5 K& ?
赞 收藏 1 评论0 发布时间:2022-2-20 15:36

举报

0个回答

所属标签

相似技术帖

官网相关资源

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