ARM Cortex-M 的启动流程其实很简单:通过指令总线从地址 0x00000000 和 0x00000004 分别取一个字,放入 sp 和 pc 寄存器。这是 ARM 中非常常见的 ldm addr, {sp, pc} 跳转指令,我猜想的实现方式是让流水线寄存器复位到指令 ldm sp, {sp, pc} 的状态,并且让 sp 的复位状态为 0。
对于 STM32,在默认启动状态下从地址 0x08000000 开始的内存被映射到地址 0x00000000。因此在启动文件中,堆栈指针被放在 0x08000000,Reset_IRQHandler 指针被放在 0x08000004。 |