[应用相关]

STM32F7 与 STM32F4 复位序列比较

[复制链接]
798|10
手机看帖
扫描二维码
随时随地手机跟帖
从此不早朝|  楼主 | 2021-11-11 21:17 | 显示全部楼层 |阅读模式
前言
初次接触到 STM32F7,总会有个疑惑,为什么 0 地址变成了 ITCM RAM 的起始地址。系统复位还是从地址 0 处开始执行
吗?如果是,那这似乎看起来是冲突的。实际上,STM32F7 基于 Cortex-M7 内核,Cortex-M7 和 Cortex-M3/M4 的复位序列
有了一些不一样。在本文中,将针对这个问题做详细讲解。

使用特权

评论回复
从此不早朝|  楼主 | 2021-11-11 21:32 | 显示全部楼层
STM32F4 的复位序列
STM32F4 基于 Cortex-M4。对于基于 Cortex-M3/M4 的芯片,复位后总是从 0x00000000 地址处,取主堆栈指针(MSP)的
值,从 0x00000004 处,取出 PC 的初始值(这个值是复位向量),然后从这个值对应的地址处取指。 41251618d1ad6a21b1.png
这两个值,就是中断向量表里的第一个和第二个表项的值。




使用特权

评论回复
从此不早朝|  楼主 | 2021-11-11 21:40 | 显示全部楼层
这两个值,就是中断向量表里的第一个和第二个表项的值。
62707618d1cf9e6e1b.png
28855618d1d15879e2.png
在 Cortex-M3/M4 里,复位后默认中断向量表在 0 地址开始的位置。之后,可以通过修改 VTOR 寄存器的值,重定位中断向
量表。在 IAP 的应用中,我们会遇到这种情况,如下图:
85523618d1d336af05.png

使用特权

评论回复
从此不早朝|  楼主 | 2021-11-11 21:40 | 显示全部楼层
上电复位,先执行 IAP 程序。此时用到的是位于 0 地址处的 IAP 程序的向量表(虽然图中说此时 VTOR 的值等于
0x08000000,实际上,因为 ST 提供了存储器地址重映射的功能,通过 boot 引脚的配置,已经将 0x08000000 处的存储空间
重映射到了地址 0 处,所以 0x08000000 和地址 0x00000000 处开始的存储空间是同一块物理空间,其内容当然也是一样
的。所以不用修改 VTOR 的值,VTOR=0 也是一样的)。言归正传,上电后,先从 IAP 复位中断程序开始执行 IAP 程序,执
行完 IAP 程序后,需要跳转到用户程序,这时就需要将向量表重定位到用户程序的向量表位置(修改 VTOR 寄存器的值到用
户向量表的起始地址)。
这是 M3/M4 的情况,STM32F7 之前的所有芯片都是一样的。
20859618d1d54aafe9.png

使用特权

评论回复
从此不早朝|  楼主 | 2021-11-11 21:41 | 显示全部楼层
STM32F7 的复位序列
前面讲的那些情况,现在在 STM32F7 中有些不一样了。在 ARM Cortex-M7 的 Generic User Guide 中,有一段如下描述:
“On system reset, the vector table is at the address configured at implementation, typically 0x00000000. ”从这段话,我们可
以看出,在 M7 中,复位后向量表的位置不是固定在地址 0 处,而是可以由各个芯片厂商自己定义。
对于 STM32F7 来说,它是由 BOOT_ADD0[15:0]和 BOOT_ADD1[15:0]这两个 option bytes 决定的。
16112618d1d8a18f62.png
Boot 脚 = 0 时,由 BOOT_ADD0 [15:0] 的值决定,ST 默认值为 0x0020 0000。这是 ITCM-FLASH 的起始地址(通过 ART
加速器,访问 FLASH); Boot 脚 = 1 时,由 BOOT_ADD1 [15:0] 的值决定,ST 默认值为 0x0010 0000。这是系统 Bootloader 的起始地址。
* 如果对 BOOT_ADDx 写入的地址值超出了存储器映射的范围或者到了保留地址空间,系统将自动转为下面的值:
BOOT_ADD0 = 0x0020 0000;
BOOT_ADD1 = 0x0000 0000(和出厂时 ST 默认的值 0x0010 0000 不一样)
也就是说,只要你配置好了 boot address, ST 的硬件会自动修改向量表的偏移地址寄存器 VTOR,使之与 boot address 相匹
配。不需要再通过软件修改 VTOR 寄存器。
回到本文开始的那个问题。所以对于 STM32F7 来说,默认状态下,复位后它并不是从 0 地址从开始执行,而是从 0x0020
0000 或者 0x0010 0000 开始执行,所以与 ITCM-RAM 从 0 地址处开始并不冲突。如果你非要将向量表放在 0 地址开始的位
置(修改 VTOR 寄存器),也不是不可以。只是这是,如果你还要在 ITCM-RAM 里面跑别的程序的话,就要注意向量表不要
与其他程序的地址重叠了。

使用特权

评论回复
wakayi| | 2021-12-6 19:54 | 显示全部楼层
没有关注过他的地址

使用特权

评论回复
wowu| | 2021-12-6 19:55 | 显示全部楼层
看来我是写不了汇编了

使用特权

评论回复
xiaoqizi| | 2021-12-6 20:01 | 显示全部楼层
内核变化 很大啊

使用特权

评论回复
tpgf| | 2021-12-6 20:06 | 显示全部楼层
请问什么是复位序列啊

使用特权

评论回复
木木guainv| | 2021-12-6 20:08 | 显示全部楼层
ITCM RAM是用于什么的呢

使用特权

评论回复
guanjiaer| | 2021-12-6 20:10 | 显示全部楼层
写入的地址值超出了存储器映射的范围 会报错吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

185

帖子

0

粉丝