深入STM32启动文件:从Reset_Handler到main(),揭秘Boot模式如何影响你的第一行代码
第一次按下STM32开发板的复位按钮时,你是否好奇过那片小小的芯片内部究竟发生了什么?当我们的main()函数开始执行前,处理器已经完成了数十个关键操作。本文将带你深入STM32的启动机制,揭示从芯片上电到main()函数执行之间的隐藏细节。
1. 启动流程全景解析
STM32的启动过程就像一场精心编排的交响乐,每个环节都紧密衔接。当电源稳定后,处理器首先会读取BOOT引脚状态,这个简单的硬件配置将决定整个启动路径的走向。
1.1 三种Boot模式的核心差异
| 启动模式 | 物理存储介质 | 典型应用场景 | 向量表初始位置 |
|---|---|---|---|
| Main Flash | 内部Flash | 正常程序运行 | 0x08000000 |
| System Memory | 内部ROM | 串口ISP下载 | 0x1FF00000 |
| Embedded SRAM | 内部RAM | 调试与临时程序执行 | 0x20000000 |
关键提示:无论选择哪种启动模式,ARM Cortex-M内核总是从0x00000000地址开始取指,这个地址通过别名机制映射到实际的存储区域。
1.2 启动文件的秘密使命
startup_stm32xxxx.s这个汇编文件承担着多项关键任务:
assembly复制Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
这段看似简单的代码背后隐藏着三个重要阶段:
- 硬件初始化:设置堆栈
