STM32 启动流程
我用最容易理解的方式把 STM32 从上电 → 运行 main ()的全过程讲清楚Cortex‑M 内核通用STM32F1/F4/H7/L4 全都一样。一、一句话总结启动流程上电 → 从 Flash 读取栈顶地址 → 加载复位中断函数地址 → 跳转到复位函数 → 初始化硬件 → 跳转到 main () → 死循环二、详细 7 步启动流程必须掌握第 1 步上电 / 复位电源接通或复位键按下CPU 进入复位状态第 2 步从 0x08000000 读取栈顶地址 (SP)STM32 启动时强制从 Flash 起始地址 0x0800_0000 取第一个字这个字是栈顶指针Stack Pointer作用给程序运行准备堆栈空间第 3 步读取复位中断服务函数地址Flash 第 2 个地址0x0800_0004这里存放的是复位函数 Reset_Handler 的入口地址第 4 步跳转到Reset_Handler 复位函数这是程序真正执行的第一行代码由启动文件startup_stm32xx.s提供。第 5 步初始化数据段.data将初始化变量从 Flash 复制到 RAM例如int a 10;第 6 步清零未初始化数据段.bss把int b;这类未赋值变量全部清 0防止随机值导致程序异常第 7 步跳转到 C 语言的main () 函数main();三、启动文件startup_stm32xx.s到底干了什么它是汇编文件是 MCU 上电后第一个执行的代码。主要做 4 件事设置栈顶 SP设置中断向量表复位、异常、中断入口初始化 RAM 数据调用 main ()四、最关键中断向量表启动核心Flash 开头固定放中断向量表0x08000000: 栈顶地址 (第一个指令) 0x08000004: 复位函数地址 (第二个指令) 0x08000008: 硬fault地址 0x0800000C: 存储器管理fault ...复位函数地址 程序真正的入口五、超简洁流程图秒懂上电 ↓ 读栈顶地址(SP) ↓ 读复位函数地址 ↓ 执行 Reset_Handler ↓ 初始化 .data 和 .bss ↓ 进入 main() ↓ while(1) 死循环六、最核心的 3 个知识点面试必考STM32 程序入口不是 main ()而是 Reset_Handler ()中断向量表放在 Flash 起始位置启动文件负责初始化堆栈和 RAM再跳转到 main七、一句话终极总结STM32 上电先找栈再找复位函数初始化 RAM 后才进入 main ()。