STM32启动模式(自举模式)
M3/3/7等内核,复位后做的第一件事:
- 从地址0x0000 0000处取出栈指针MSP的初始值,该值就是栈顶地址。
- 从地址0x0000 0004处取出程序计数器指针PC的初始值,该值是复位向量。
芯片厂商会把0x00000000和0x00000004地址映射到其它的地址。
在系统复位后,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存。
STM32启动过程(内部FLASH启动)
- 初始化MSP:从0x0800 0000获取
- 初始化PC:从0x0800 0004获取
- 设置堆栈大小:Heap_Size(堆)、Stack_Size(栈)
- 初始化中断向量表:__Vectors定义
- 调用初始化函数:可选的,如调用:SystemInit函数
- 调用__main:标准C库函数,执行一系列设置,最终调用main函数
Reset_Handler函数介绍
c
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0,=SystemInit
BLX R0
LDR R0,=__main
BX R0
ENDP
EXPORT:标明全局属性,可被外部调用。
IMPORT:申明来自外部文件,类extern
PROC:表示子程序
ENDP:表示子程序结束
WAEK:弱定义
堆栈简介
- 栈:编译器自动分配和释放,存放函数参数、局部变量等。
- 堆:程序员分配和释放,如malloc、calloc、realloc等。
函数局部变量较多,嵌套关系复杂时,需要加大栈大小!