启动流程:上电先取栈顶和复位向量,再进main

短文标题:启动流程:上电先取栈顶和复位向量,再进main

你有没有想过一个问题:单片机通电后,执行的第一条指令是什么?不是main,甚至不是Reset_Handler。第一步是取栈顶地址,第二步是取复位向量。 这是硬件固化的行为,不依赖任何代码。上电后硬件自动完成的两件事

  1. 从地址0x00000000读取栈顶地址(__initial_sp)→ 写入MSP(主栈指针)
  2. 从地址0x00000004读取复位向量(Reset_Handler地址)→ 跳转执行

在STM32中,0x08000000被映射到0x00000000。实际烧录地址是0x08000000,但CPU通过地址映射访问。没有栈,C语言无法运行(局部变量、函数调用都需要栈)。所以硬件第一步必须设栈。中断向量表的结构,向量表存放在Flash起始地址(0x08000000):

**栈顶地址写错(比如指向ROM),压栈操作会覆盖代码区,立即HardFault。Reset_Handler里面做了什么?**启动文件中的Reset_Handler(汇编):

Reset_Handler:

LDR R0, =SystemInit

BLX R0 ; 调用SystemInit,配置时钟

LDR R0, =__main

BX R0 ; 跳转到C库入口

SystemInit:配置Flash等待周期、设置PLL、切换系统时钟。

__main(不是main):C库入口函数,负责:

  • 初始化.data段(从Flash复制已初始化的全局变量到RAM)
  • 清零.bss段(未初始化全局变量)
  • 最后调用main

没有 __main**,全局变量初值不生效,未初始化全局变量不为0。**

数据段(.data)和零初始化段(.bss)

  • .data段:已初始化的全局变量(如int x = 5;),初始值存在Flash中,启动时复制到RAM
  • .bss段:未初始化的全局变量(如int y;),启动时清零

如果手动编写启动文件(跳过__main),必须自己实现段初始化和清零,否则全局变量值不确定。VTOR:向量表重定位,通过VTOR(向量表偏移寄存器)可以把向量表重定位到RAM:

SCB->VTOR = 0x20000000; // 向量表搬移到RAM

用途:

  • 运行时动态修改中断处理函数(热补丁)
  • Bootloader跳转到APP前,必须重设VTOR(否则APP的中断向量仍指向Bootloader区)

常见启动失败原因

  • 栈顶地址超出RAM范围 → 压栈破坏代码区,HardFault
  • 复位向量地址未对齐(奇数地址)→ 总线错误
  • 启动文件中断处理函数弱符号被覆盖但未正确声明 → 链接错误
  • VTOR未正确设置(如APP在Flash中偏移运行时)→ 中断向量找不到

这个故事的启示, main不是CPU执行的第一个函数。栈顶地址和复位向量,在main之前就已经被硬件加载。启动文件写错,main永远跑不起来。写在最后, 调试"上电没反应",最先检查中断向量表。查看0x08000000:第一个字是不是RAM地址?第二个字是不是Reset_Handler地址?这两个地址对了,单片机才有可能"活"过来。


(本文灵感源于于振南《新概念ARM32单片机》教程第5.5节"ARM32启动流程与中断控制器配置"。)

觉得有用?点赞、转发,让更多人看懂启动文件和向量表的底层逻辑。

相关推荐
华清远见IT开放实验室11 小时前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设
AI的探索之旅14 小时前
AI辅助原理图评审:电源去耦、BOOT引脚、VCAP——19项逐一核查,遗漏?不存在的
人工智能·vscode·嵌入式硬件
茯苓gao14 小时前
嵌入式开发笔记:EtherCAT协议从硬件到软件完整配置指南——从零搭建一套EtherCAT通信系统
笔记·嵌入式硬件·学习
GeekArch14 小时前
第24讲:Vibe模式代码风格控制——适配Keil/STM32工程规范
人工智能·stm32·单片机·嵌入式硬件·mcu·决策树·ai编程
Freedom_my15 小时前
STM32项目3
stm32·单片机·嵌入式硬件
国科安芯16 小时前
星间光链路:AS32S601型抗辐射MCU在空间激光通信终端控制中的技术实现
服务器·网络·单片机·嵌入式硬件·物联网·安全·信息与通信
执迷不悟82316 小时前
ARM--按键/中断
arm开发
小李不困还能学17 小时前
基于 51 单片机的8 路抢答器设计教程
单片机·嵌入式硬件·mongodb·抢答器
CedarQR17 小时前
万字长文:从零在 RK3588 上部署 PaddleSpeech 中文 TTS 全流程(FastSpeech2 + HiFiGAN)
开发语言·c++·嵌入式硬件·ubuntu·json
维基框架17 小时前
汽车座舱开发上云 Google的Arm实例解决了什么实际问题
arm开发·人工智能·汽车