在STM32编程中,IAR在执行main函数前做了什么事?
1.CPU最简单的启动代码一般包括堆栈初始化,全局变量初始化,向量表初始化,最后跳转到用户主程序main执行;
2.cortex-m3的复位时序如下:
(1)、从地址0x00000000取出4bytes的数据作为MSP的值;
(2)、从地址0x00000004取出4bytes的数据作为复位的PC值;
(3)、PC跳到复位向量处开始往下执行程序代码。
cortex-m3规定,从0x00000004存放系统异常,接下来就是IC的外部中断(具体布局跟不同厂商设计有关)。由此定义个一维数组,按中断布局顺序对应存放不同的向量值。
首先系统复位时,Cortex-M3从代码区偏移0x0000'0000处获取栈顶地址,用来初始化MSP的值。接下来从代码区偏移0x0000'0004获取第一个指令的跳转地址。这个地址,是Cortex-M3要求放置中断向量表的地方。
这里是一个程序的启动区的反汇编:(该处是将0000‘0000映射到了0800‘4000处)
__vector_table:
08004000 2600
08004002 2000
08004004 7E1D
08004006 0800
这个程序是由IAP程序来启动的,IAP就存在在0x0800'0000这个地址上,IAP程序获取0x0800'4000处的MSP值(0x20002600),并设置为MSP的值,即主堆栈最大范围是0x2000'0000~0x2000'25FF。接下来IAP程序获0x0800'4004处的Reset_Handler的地址(0x0800'7E1D),并跳转到Reset_Handler()执行。
IAP在这里完全是模仿了Cortex-M3的复位序列,在没有IAP的系统上,CM3只能从0x0800'0000获取MSP,从0x0800'0004获取第一条指令所处地址。IAP的启动,已经消耗掉了这个复位序列,所以IAP要启动UserApp程序的时候,也是完全模仿Cortex-M3的复位序列的。
|