STM32启动过程分析

相关概念复习:
PC:程序计数器,指示当前程序运行到哪了,指向的是代码区。
SP:代表堆栈指针,指向当前堆栈栈顶。
中断向量表:表中的每一项存放是中断服务程序的入口地址。
STM32中断处理过程:
当中断发生后,CPU自动从中断向量表中找到对应的中断服务函数的地址并跳转进去执行。

相关汇编指令:

EQU:表示宏定义的伪指令,不会占用空间,类似于C语言的#define
AREA:定义一个代码段或数据段
SPACE:给一个段申请一段空间
PRESERVE8 指令指定当前文件保持堆栈八字节对齐
THUMB:告诉汇编器下面的指令是32位的Thumb指令
EXPORT:在程序中声明一个全局的标号,该标号可在其他的文件中引用 (这也就是为什么我们在定义自己的中断服务函数能使用EXPORT定义的函数名)
DCD:用于分配一片连续的字节存储单元,并用指定的数据初始化
IMPORT:通知编译器要使用的标号在其他的源文件中定义
LDR:从存储器中将一个32位的数据传送到目的寄存器中
BLX, BX ,B:跳转到指定地址中
PROC:汇编函数的开始
ENDP: 汇编函数的结束

STM32启动主要如下几个事情:
1, 初始化堆栈指针SP
CPU启动后PC的值指向的是代码的开始也就是0x0800 0000这个地址,而CPU启动后要做的第一件事就是初始化堆栈指针SP,SP的初始化值就存放在0x0800 0000这个地址里面。堆栈的大小在STM32的启动文件里面设置。

STM32启动过程分析
堆栈空间的首地址可以从编译后的MAP文件以及hex文件中可以看到,如下图

STM32启动过程分析

STM32启动过程分析

2.进入复位中断服务函数
初始化SP完成后, PC+1指向下一条指令即PC=0x0800 0004,这个地址就是中断向量表的起始地址,这个地址里面存放了复位中断的入口地址。

这个地址也可以从MAP文件和hex文件可以找到对应,如下图:

STM32启动过程分析

STM32启动过程分析

3.初始化时钟,进入用户main函数
进入复位中断服务函数,CPU会先配置系统时钟,然后调用C库中的__main函数,最终跳转到用户main函数。此过程可以在启动文件里面找到。

__main函数的具体功能可以参考这篇博客:https://blog.****.net/lushoumin/article/details/78886141

 

STM32启动过程分析

 

参考链接:

https://blog.****.net/u010761559/article/details/83538220

https://blog.****.net/zyl615110/article/details/79217407