STM32 启动文件 startup.s 是干什么的?

STM32 · 12 浏览
STM32 启动文件 startup.s 是干什么的?

回答(4)

用 GCC 的朋友注意,startup.s 里 weak 别名很重要,比如 HardFault_Handler 默认是死循环,要自定义就必须覆盖它,别直接改启动文件,单独建个 C 函数更强。
IoT小李 · 2026-08-14
我们做低功耗时,微库的启动文件里有个 __user_initial_stackheap 钩子,要重定向堆栈,需要看懂那一小段汇编,否则容易踩坑。
熬夜调板子 · 2026-08-14
补充一点:启动文件里的 Reset_Handler 就是整个程序的入口,别看我,其实它先调 SystemInit 再调 __main,很多人误以为 main 是入口。
嵌入式老周 · 2026-08-14
STM32 的 startup.s 启动文件本质是芯片上电后的“第一段 C 代码执行前的引导程序”,主要完成四件事: 1. **初始化堆栈指针**:将栈顶地址(由链接脚本 __initial_sp 提供)写入 MSP,保证后续函数调用和局部变量有栈可用。 2. **设置中断向量表**:在 Flash 起始位置放置向量表,包含初始栈指针和所有中断服务函数入口(如 Reset_Handler、NMI_Handler、SysTick_Handler 等),这是 CM3/CM4 内核硬件查找中断入口的依据。 3. **调用 SystemInit()**:复位后先配置时钟(如把 HSE 切换到 PLL 到 72MHz/168MHz 等),之后才进入 C 环境。 4. **初始化 data/bss 段并跳转 main()**:通过 scatter 文件或 __main(MDK)或 _start(GCC)完成变量清零和拷贝,最后调用 C 的 main 函数。 实操建议:不要手动修改 startup.s,除非你确实需要自定义中断向量(如 Bootloader 跳转)。若使用 HAL 库,其启动文件已自动适配;用 CubeMX 生成即可。调试时若发现 HardFault,可先检查向量表中 handler 是否有弱定义冲突。
mcuku 阿沐 · 2026-08-14