打印
[信息]

【实战经验】STM32F7与STM32F4的复位序列比较

[复制链接]
4821|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 香水城 于 2017-8-17 14:34 编辑

STM32F7与STM32F4的复位序列比较
前言
初次接触到STM32F7,总会有个疑惑,为什么0地址变成了ITCM RAM的起始地址。系统复位还是从地址0处开始执行吗?如果是,那这似乎看起来是冲突的。实际上,STM32F7基于Cortex-M7内核,Cortex-M7和Cortex-M3/M4的复位序列有了一些不一样。在本文中,将针对这个问题做详细讲解。

STM32F4的复位序列
STM32F4基于Cortex-M4。对于基于Cortex-M3/M4的芯片,复位后总是从0x00000000地址处,取主堆栈指针(MSP)的值,从0x00000004处,取出PC的初始值(这个值是复位向量),然后从这个值对应的地址处取指。


这两个值,就是中断向量表里的第一个和第二个表项的值。



在Cortex-M3/M4里,复位后默认中断向量表在0地址开始的位置。之后,可以通过修改VTOR寄存器的值,重定位中断向量表。在IAP的应用中,我们会遇到这种情况,如下图:


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

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决定的。

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里面跑别的程序的话,就要注意向量表不要与其他程序的地址重叠了。

对应PDF: STM32F7与STM32F4的复位序列比较
更多实战经验请看: 【ST MCU实战经验汇总贴】





沙发
zchong| | 2015-7-16 11:10 | 只看该作者
BOOT_ADD0 [15:0] 只有16bits,如何能够实现一个32bits的地址呢?难道只是高16bits?

使用特权

评论回复
板凳
zchong| | 2015-7-16 19:17 | 只看该作者
香版主,能够回应一下我的问题

使用特权

评论回复
地板
戈卫东| | 2015-7-16 21:20 | 只看该作者
很高大上的样子。。。。。。。。

使用特权

评论回复
5
一清如水| | 2015-7-16 21:37 | 只看该作者
Mark

使用特权

评论回复
6
一清如水| | 2015-7-16 21:38 | 只看该作者
Mark

使用特权

评论回复
7
米尔豪斯| | 2015-7-16 22:03 | 只看该作者
在Cortex-M3/M4里,复位后默认中断向量表在0地址开始的位置

使用特权

评论回复
8
mmuuss586| | 2015-7-16 22:31 | 只看该作者

还没有F7的板子呢,只能先看看;

使用特权

评论回复
9
ticomi| | 2015-7-17 10:12 | 只看该作者
F7,很高大的样子,期待可以有个样板!

使用特权

评论回复
10
香水城|  楼主 | 2015-7-17 16:37 | 只看该作者
zchong 发表于 2015-7-16 11:10
BOOT_ADD0 [15:0] 只有16bits,如何能够实现一个32bits的地址呢?难道只是高16bits? ...

BOOT_ADDx里不是直接写的地址的值。它的最小变化粒度是16KB。

使用特权

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

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:STM32技术专家

596

主题

17108

帖子

289

粉丝