STM32启动代码分析

STM32启动代码分析
上电后从中断向量表中取出栈顶指针的内容0x20008EB0,取出ResetHandler的地址0x08000179,之后跳转至了复位中断函数。
STM32启动代码分析
从0x08000194的地址内取出SystemInit函数的地址(0x08003DC4)给了r0(0x08003DC5,因为最低位必须是0代表Thumb指令),BLX进行跳转并将0x0800017C保存的LR寄存器,实际保存为0x0800017D(最低位置1)
STM32启动代码分析
到了SystemInit函数,首先将r4和lr寄存器压栈,然后赋值一些寄存器,执行到子函数时通过BL.W间接跳转到SetSysClock()函数,
STM32启动代码分析
执行后将返回地址0x08003DFB保存到了LR寄存器。又通过B.W跳转到里边的子函数SetSysClockTo72()
STM32启动代码分析
进SetSysClockTo72()后先将r2,r3和lr进行压栈
STM32启动代码分析
执行完SetSysClockTo72()通过POP返回SetSysClock()函数
STM32启动代码分析
SetSysClock()函数最后通过POP指令返回SystemInit函数
STM32启动代码分析
回到SystemInit函数后SP又指向了栈顶,恢复了现场。
STM32启动代码分析