0 启动流程
- 复位
- 通过boot引脚选择启动模式
- 从地址0x00000000读取 __initial_sp 初始栈顶值到MSP
- 从地址0x00000004读取 Reset_Handler 地址到PC
- 指向复位向量的内容
- 执行SystemInit函数, 初始化系统时钟
- 执行__main, 软件设置SP指针, 初始化栈空间, 清除bss段, 最后跳转到mian函数
1 启动模式
BOOT0BOOT1启动模式0X从FLASH启动0x0800 000010从系统存储器启动(bootROM)11从RAM启动0x2000 0000
- pc指针在硬件复位后会自动指向0x0000 0000, 而Flash实际起始地址:0x0800 0000, RAM实际起始地址: 0x2000 0000, 硬件会自动将0x0000 0000映射到对应的地址
2 启动流程
2.1 Reset_Handler 复位向量
2.1.1 Reset_Handler 源代码:
- ; Reset handler
- Reset_Handler PROC
- EXPORT Reset_Handler [WEAK]
- IMPORT SystemInit
- IMPORT __main
- LDR R0, =SystemInit
- BLX R0
- LDR R0, =__main
- BX R0
- ENDP
复制代码 2.1.2 代码分析:
导入 SystemInit 和 __main 两个符号,并LDR数据到R0寄存器,跳转执行(BLX/BX)
2.2 SystemInit
2.2.1 SystemInit源代码:
2.2.1.1HAL库中的SystemInit
[code]void SystemInit(void){ /* FPU settings ------------------------------------------------------------*/ #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) SCB->CPACR |= ((3UL |