STM32八股【1】-----启动流程和startup文件理解
启动流程
知识点
- MCU 上电复位。
- MSP从向量表第0个地址读取一个32位(2字节)的值并保存,该值为栈顶地址。
- PC计数器从第1个地址读取一个两字节的值并保存,该值为程序入口,一般是Reset_Handler。
- 想了解FLASH地址映射可以看STM32八股【4】-----AHB地址映射
__Vectors DCD __initial_sp ; Top of StackDCD Reset_Handler ; Reset HandlerDCD NMI_Handler ; NMI HandlerDCD HardFault_Handler ; Hard Fault Handler
- 执行Reset_Handler,初始化中断向量表。
Reset_Handler为[WEAK],可以自定义修改。
Reset_Handler PROCEXPORT Reset_Handler [WEAK]IMPORT __mainIMPORT SystemInitLDR R0, =SystemInitBLX R0LDR R0, =__mainBX R0ENDP
在Reset_Handler中执行:
- SystemInit():
初始化系统时钟、PLL、外设时钟、Flash 延时等。 - C 运行时环境初始化:
- 调用
__main
- 初始化 .data 段、具体来讲就是把FLASH已初始化的数据拷贝到RAM对应的.data段区域。
- RAM .bss段未初始化的全部清零
- 不熟悉FLASH和RAM构成的可以看STM32八股【3】------RAM和片上FLASH
- 调用
- 进入 main():
完成上述初始化后,调用 main() 进入用户程序。 - 程序运行,
如果发生中断,CPU 根据矢量表跳转到对应中断服务函数 (xxx_IRQHandler) 处理。
问题
-
请解释STM32微控制器的启动过程,从上电到用户主程序的执行,包括主堆栈指针(MSP)和程序计数器(PC)的初始化。
-
在STM32的启动文件中,向量表的作用是什么?它通常位于存储器的哪个区域,为什么?
-
启动文件中定义了堆栈和堆的大小。请解释它们在嵌入式系统中的作用,以及如何根据应用需求确定它们的大小。
-
在启动文件中,Reset_Handler的作用是什么?它通常执行哪些关键任务来准备系统运行?