STM32启动流程深度解析
启动流程
1.上电复位
2.系统初始化
3.跳转到 main 函数
启动入口:
初始化中断向量表
0x00000000存放的是中断向量表的起始位置
中断向量表的前4个字节是 _initial_sp, 表示 主栈指针(MSP) 的初始地址,用来设置堆栈指针(SP)
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
其中_initial_sp是一个标号,代表栈+堆,即栈顶
然后从下一个地址(0x08000004)读取复位处理程序的地址(Reset_Handler),并跳转到那里执行
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
Reset_Handler中主要:
SystemInit 是 ST 库提供的函数,负责初始化时钟、外设等,比如设置系统时钟为 72MHz。
__main 是 C 运行时库的入口,它会初始化全局变量(复制 .data 段到 SRAM,清零 .bss 段),然后跳转到用户写的 main 函数,至此头文件初始化完成。
stm32 ram和flash分布
作者:Invinciblenuonuo