ARM规定,M3和M4处理器复位后,首先从0x00000000和0x00000004地址读取Main Stack Pointer(MSP)和reset vector(the starting address of the reset handler),分别赋值给MSP寄存器和PC寄存器,如下:
顺带说下,为什么STM32的Flash起始地址是0x08000000,而不是0x00000000,是为了处理器从不同的存储器启动:
1、从main Flash memory启动时,将0x08000000映射到0x00000000;
2、从system memory启动时,将0x1FFF0000映射到0x00000000;
3、从SRAM启动时,将0x20000000映射到0x00000000;
下面的memory map图中可以分别找到Flash memory、system memory和SRAM的起始地址。
在写入PC寄存器后,会触发跳转操作,从而执行reset handler函数,如下:
用手头的STM32L431验证:
Flash对应地址内容:
startup文件中堆和栈的大小定义:
Keil调试下寄存器的值:
startup文件:
map文件:
1、Flash 0x08000000和0x00000000地址处内容完全一样;
2、其他条件不变,Stack_Size增加0x100,栈顶地址增加0x100;
3、PC寄存器值为0x0800023C,map文件中Reset_Handler函数起始地址却为0x0800023D,是因为bit0置1表示Thumb Code。
下一篇,将分析startup文件和link文件,了解栈顶的地址和复位处理函数的地址是如何存到0x00000000和0x00000004地址上的。