You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

STM32H7复位时VTOR寄存器的行为及软复位相关疑问

Cortex-M7向量表重定位后软复位与MSP处理详解

先理清核心前提:硬复位 vs 软复位的寄存器差异

ARM编程手册里提到的“复位后VTOR值为未知”,特指硬复位(比如上电复位、外部复位引脚触发的复位)——这类复位会重置几乎所有核心寄存器到默认状态。而软复位(比如通过SCB->AIRCR = 0x05FA0004;触发的系统复位)是完全不同的场景,它不会重置所有寄存器。


软复位时的向量表管理

  • 硬复位场景:VTOR被重置为“未知”(绝大多数MCU厂商会默认将此映射到Flash起始地址0x00000000),所以必然使用Flash中的原始向量表执行复位流程。
  • 软复位场景:VTOR寄存器不会被重置,它会保留你之前设置的重定位地址。此时处理器会严格按照VTOR的当前值,从重定位后的向量表中读取复位处理程序地址并执行。
  • 注意事项:少数MCU厂商可能会对软复位做特殊扩展(比如强制锁定VTOR到默认地址),这种情况一定要以你所用芯片的厂商参考手册为准,而不是仅依赖ARM架构手册。

重定位向量表中的栈指针(MSP)是否会被使用?

当然会!ARM手册里“复位时从0x00000000加载MSP”的描述同样只针对硬复位

  • 硬复位时:VTOR未知,处理器默认从0x00000000加载MSP,此时重定位向量表的MSP条目确实不会被用到。
  • 软复位时:因为VTOR保持重定位后的地址,处理器会先从VTOR + 0的位置(重定位向量表的第一个条目)加载新的MSP值,再从VTOR + 4的位置读取复位程序地址并跳转,完全使用重定位后的向量表配置。
  • 额外补充:运行时触发的异常/中断,其向量读取依赖VTOR指向的表,但MSP的初始加载仅发生在复位阶段(硬/软复位都算),运行时异常不会重新加载MSP,只会使用当前的MSP来保存栈帧。

举个实际例子:假设你把向量表重定位到SRAM的0x20000000,执行SCB->VTOR = 0x20000000;后触发软复位,处理器会先从0x20000000读取MSP值,再跳转到0x20000004指向的复位程序,全程使用重定位后的向量表。


内容的提问来源于stack exchange,提问作者Guillaume Petitjean

火山引擎 最新活动