STM32F4复位序列与STM32F7复位序列

前言当我第一次接触STM32F7时,我可能想知道为什么0地址成为ITCMRAM的起始地址。

系统重置仍从地址0执行吗?如果是这样,那么这似乎是矛盾的。

实际上,STM32F7是基于Cortex-M7内核的,并且Cortex-M7和Cortex-M3 / M4的复位顺序有所不同。

在本文中,我们将详细解释此问题。

STM32F4的复位序列STM32F4基于Cortex-M4。

对于基于Cortex-M3 / M4的芯片,复位后,主堆栈指针(MSP)的值始终取自地址0x00000000,PC的初始值取自0x00000004(此值是复位向量) ,然后从该值中获取相应地址处的指令。

这两个值是中断向量表中第一个和第二个条目的值。

在Cortex-M3 / M4中,默认中断向量表在复位后从地址0开始。

之后,您可以通过修改VTOR寄存器的值来重新定位中断向量表。

在IAP的应用中,我们会遇到这种情况,如下图所示:上电复位,首先执行IAP程序。

此时,使用地址为0的IAP程序的向量表(尽管图中的VTOR值此时等于0x08000000,实际上,因为ST通过配置引导引脚,位于0x08000000的存储空间已重新映射到地址0,因此从0x08000000和地址0x00000000开始的存储空间是相同的物理空间,其内容当然是相同的,因此无需修改VTOR,VTOR = 0相同)。

上电回家后,首先要从IAP重置中断程序中执行IAP程序。

执行IAP程序后,您需要跳转到用户程序。

此时,您需要将向量表重新定位到用户程序的向量表位置(修改VTOR寄存器)到用户向量表的起始地址)。

M3 / M4就是这种情况,STM32F7之前的所有芯片都是相同的。

前面提到的STM32F7复位序列,在STM32F7中有所不同。

在ARMCortex-M7的GenericUserGuide中,有如下描述:“在系统复位时,向量表是在实现时配置的地址处,通常为0x00000000”。

从这段文字中我们可以看到,在M7中,复位后向量表的位置并不固定在地址0,而是可以由每个芯片制造商定义。

对于STM32F7,它由两个选项字节BOOT_ADD0 [15:0]和BOOT_ADD1 [15:0]确定。

当引导引脚= 0时,由BOOT_ADD0 [15:0]的值确定,ST的默认值为0x00200000。

这是ITCM-FLASH(通过ART加速器访问FLASH)的起始地址;当引导引脚= 1时,由BOOT_ADD1 [15:0]的值确定,ST的默认值为0x00100000。

这是systemBootloader的起始地址。

*如果写入BOOT_ADDx的地址值超出内存映射范围或达到保留的地址空间,则系统将自动转换为以下值:BOOT_ADD0 = 0x00200000; BOOT_ADD1 = 0x00000000(与出厂时的ST默认值0x00100000不同) )也就是说,只要您配置了引导地址,stm32F7芯片的硬件就会自动修改向量表的偏移地址寄存器VTOR以匹配引导地址。

无需通过软件修改VTOR寄存器。

回到本文开头的问题。

对于STM32F7,在默认状态下,它不是从复位后的地址0开始,而是从0x00200000或0x00100000开始,因此它与地址0的ITCM-RAM不冲突。

如果必须将向量表放在地址的开头0(修改VTOR寄存器),这不是不可能的。

但是此时,如果要在ITCM-RAM中运行其他程序,则必须注意向量表不要与其他程序的地址重叠。

联系方式

采样电阻一般根据具体线路板的要求,分为插件电阻、贴片电阻。采样电阻,阻值低,精密度高,一般在阻值精密度在±1%以内,更高要求的用途时会采用0.01%精度的电阻。国内工厂生产的大部分都是以康铜、锰铜为材质的插件电阻,但是,广大的用户更需要的是贴片的高精密电阻来实现取样功能,这是为了满足产品小型化产品生产的自动化的要求。能够生产在低温度系数,高精密度,超低阻值上做到满足用户要求电阻的厂商并不多见。

查看详情

在线咨询