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

【经验分享】STM32F7 与 STM32F4 复位序列比较

[复制链接]
STMCU小助手 发布时间:2022-2-16 21:05
前言
+ G8 c9 e. X. m! |初次接触到 STM32F7,总会有个疑惑,为什么 0 地址变成了 ITCM RAM 的起始地址。系统复位还是从地址 0 处开始执行吗?如果是,那这似乎看起来是冲突的。实际上,STM32F7 基于 Cortex-M7 内核,Cortex-M7 和 Cortex-M3/M4 的复位序列有了一些不一样。在本文中,将针对这个问题做详细讲解。
7 n9 B! A5 _9 j& hSTM32F4 的复位序列
; R5 B  [; [8 y2 D- o: Q) S' w+ zSTM32F4 基于 Cortex-M4。对于基于 Cortex-M3/M4 的芯片,复位后总是从 0x00000000 地址处,取主堆栈指针(MSP)的值,从 0x00000004 处,取出 PC 的初始值(这个值是复位向量),然后从这个值对应的地址处取指。
$ @1 b5 T7 i. V) @) p+ p) `2 `2 M, Y" _0 U& P) G& R6 c& L+ t- T3 I
(UB]9A3JU{0ANZO[H5}@OBC.png
, z; r7 |: c4 f. O' ^9 ~
) ~) H& a1 P2 ]7 b! v# Q" K这两个值,就是中断向量表里的第一个和第二个表项的值。5 L/ y1 t6 Z* x% P( p9 F
8 @) W. F1 s% b. K
U4R9(%ONXHB~HPK1H~BLRL6.png
& s/ P# G9 v8 U3 `4 \3 D [V_YQT0[`EUPN7CIEJF@9.png - [6 G- g# }; {. |3 \, C, ~+ P
8 F6 @) j. u; D" e+ y, Y
在 Cortex-M3/M4 里,复位后默认中断向量表在 0 地址开始的位置。之后,可以通过修改 VTOR 寄存器的值,重定位中断向量表。在 IAP 的应用中,我们会遇到这种情况,如下图:5 ]# O& _. K) X9 R' _; W: ?+ }- t

9 I8 f4 P9 D) I OMG3L4GHUACGVA8DM]HD6.png : a. ~! p$ U3 p, r7 }! |0 |! y
0 h: q: c, m; J  n! L" q& K
上电复位,先执行 IAP 程序。此时用到的是位于 0 地址处的 IAP 程序的向量表(虽然图中说此时 VTOR 的值等于0x08000000,实际上,因为 ST 提供了存储器地址重映射的功能,通过 boot 引脚的配置,已经将 0x08000000 处的存储空间重映射到了地址 0 处,所以 0x08000000 和地址 0x00000000 处开始的存储空间是同一块物理空间,其内容当然也是一样的。所以不用修改 VTOR 的值,VTOR=0 也是一样的)。言归正传,上电后,先从 IAP 复位中断程序开始执行 IAP 程序,执行完 IAP 程序后,需要跳转到用户程序,这时就需要将向量表重定位到用户程序的向量表位置(修改 VTOR 寄存器的值到用户向量表的起始地址)。. Z  M! I; @9 C# C' p; C
这是 M3/M4 的情况,STM32F7 之前的所有芯片都是一样的。; D7 a1 l/ T( w1 O* d$ E  _

4 l7 _9 M% G# c+ ^7 m" bSTM32F7 的复位序列6 M8 t6 Y3 v8 _% J9 s
前面讲的那些情况,现在在 STM32F7 中有些不一样了。在 ARM Cortex-M7 的 Generic User Guide 中,有一段如下描述:“On system reset, the vector table is at the address configured at implementation, typically 0x00000000. ”从这段话,我们可以看出,在 M7 中,复位后向量表的位置不是固定在地址 0 处,而是可以由各个芯片厂商自己定义。' G; L! x6 c5 U+ k; ~9 u
对于 STM32F7 来说,它是由 BOOT_ADD0[15:0]和 BOOT_ADD1[15:0]这两个 option bytes 决定的。5 O- D% N2 u* d8 N9 U

1 h9 O5 w: O( n. V0 K, ~5 P% m/ X; n2 M/ p
SGDMKE2P(`2@X`C21`VRAP2.png 4 C/ D6 @. z' B4 ]  n

; o" _+ z' [8 f7 b& f6 j$ CBoot 脚 = 0 时,由 BOOT_ADD0 [15:0] 的值决定,ST 默认值为 0x0020 0000。这是 ITCM-FLASH 的起始地址(通过 ART加速器,访问 FLASH);- D3 F* q4 H' v8 f& o
Boot 脚 = 1 时,由 BOOT_ADD1 [15:0] 的值决定,ST 默认值为 0x0010 0000。这是系统 Bootloader 的起始地址。/ N( ^' }8 V& a

  M- E( K+ B+ s) g% G2 o5 z* 如果对 BOOT_ADDx 写入的地址值超出了存储器映射的范围或者到了保留地址空间,系统将自动转为下面的值:
* ^3 F+ P7 j& }4 v( D; F4 P  BOOT_ADD0 = 0x0020 0000;3 `/ }2 ]9 V7 {6 Q' ~) e
  BOOT_ADD1 = 0x0000 0000(和出厂时 ST 默认的值 0x0010 0000 不一样)6 [( I- Y0 O9 j/ }# i
7 B" X, T3 G8 n8 w8 f, a' B' Y+ p, O
也就是说,只要你配置好了 boot address, ST 的硬件会自动修改向量表的偏移地址寄存器 VTOR,使之与 boot address 相匹配。不需要再通过软件修改 VTOR 寄存器。
) n/ |/ q7 \4 e7 P- ]: r
( p9 H! g4 A7 S5 s: p4 @回到本文开始的那个问题。所以对于 STM32F7 来说,默认状态下,复位后它并不是从 0 地址从开始执行,而是从 0x00200000 或者 0x0010 0000 开始执行,所以与 ITCM-RAM 从 0 地址处开始并不冲突。如果你非要将向量表放在 0 地址开始的位置(修改 VTOR 寄存器),也不是不可以。只是这是,如果你还要在 ITCM-RAM 里面跑别的程序的话,就要注意向量表不要与其他程序的地址重叠了。; `  D6 d! r  ~: @3 E

7 S8 h: v- ?9 x6 E; ~! r) p3 e
赞 收藏 评论0 发布时间:2022-2-16 21:05

举报

0个回答

所属标签

相似技术帖

官网相关资源

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