前言当我第一次接触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中运行其他程序,则必须注意向量表不要与其他程序的地址重叠。