ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

STM32 启动流程

2026/8/7 21:41:55 拓冰建站 浏览量
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 件事:

  1. 设置栈顶 SP
  2. 设置中断向量表(复位、异常、中断入口)
  3. 初始化 RAM 数据
  4. 调用 main ()

四、最关键:中断向量表(启动核心)

Flash 开头固定放中断向量表

0x08000000: 栈顶地址 (第一个指令) 0x08000004: 复位函数地址 (第二个指令) 0x08000008: 硬fault地址 0x0800000C: 存储器管理fault ...

复位函数地址 = 程序真正的入口


五、超简洁流程图(秒懂)

上电 ↓ 读栈顶地址(SP) ↓ 读复位函数地址 ↓ 执行 Reset_Handler ↓ 初始化 .data 和 .bss ↓ 进入 main() ↓ while(1) 死循环

六、最核心的 3 个知识点(面试必考)

  1. STM32 程序入口不是 main (),而是 Reset_Handler ()
  2. 中断向量表放在 Flash 起始位置
  3. 启动文件负责初始化堆栈和 RAM,再跳转到 main

七、一句话终极总结

STM32 上电先找栈,再找复位函数,初始化 RAM 后才进入 main ()。