2. 硬件上电与复位流程
当开发板接通电源的那一刻,SoC 并不会立刻执行你烧录在 Flash 里的应用程序。从上电到第一条用户代码运行,中间要经过一条由硬件状态机、复位逻辑、时钟树、电源管理单元和片内 BootROM 共同铺就的“隐形跑道”。理解这条跑道,是 BootROM 到内核启动调试工程的第一块基石。本节围绕 CPU 复位向量、时钟初始化、电源管理、BootROM 角色与启动模式选择五个关键点展开。
一、核心原理:上电不是“瞬间开始”,而是分阶段接力
SoC 上电后,最先动作的是电源管理单元(PMU)和复位控制单元(RCU)。PMU 负责按上电时序依次拉起各路电源域(VDD_CORE、VDD_IO、VDD_DDR 等),只有当某路电源达到阈值并稳定后,对应的复位才会释放。RCU 则把复位信号分发给 CPU 核、总线、外设和存储器控制器,形成“复位树”。
复位释放后,CPU 从复位向量(Reset Vector)取第一条指令。这个地址由芯片设计固定,常见形式是:
- ARM 类 SoC:复位向量通常位于
0x00000000或0xFFFF0000,由VINITHI等引脚/熔丝决定; - 部分 SoC 使用
0xFFFF_0000作为高向量基址,映射到片内 BootROM; - RISC-V 类 SoC:复位向量常由硬件配置寄存器指定,例如
0x1000或0x8000_0000。
关键点在于:复位向量指向的往往不是外部 Flash,而是片内 BootROM。BootROM 是一段固化在芯片内部、不可修改的只读代码,它承担了“第一段软件”的角色。
二、BootROM 在 SoC 中的角色与启动模式选择
BootROM 的核心职责可以概括为四件事:
- 采样启动模式:读取 BOOT_MODE 引脚、eFuse 或 PMIC 寄存器,判断从 eMMC、SD、SPI Flash、UART、USB 还是网络启动;
- 初始化最小外设:配置启动介质所需的时钟、引脚复用和控制器;
- 加载并校验下一级镜像:把 SPL/Preloader 或二级引导程序读入 SRAM,做校验和签名验证;
- 跳转到下一级:把控制权交给 SPL,由 SPL 继续初始化 DDR 并加载 U-Boot。
启动模式选择通常通过一组引脚在上电复位时被锁存。例如:
BOOT_MODE[2:0] = 000 -> eMMC
BOOT_MODE[2:0] = 001 -> SD/TF 卡
BOOT_MODE[2:0] = 010 -> SPI NOR
BOOT_MODE[2:0] = 011 -> UART 下载
BOOT_MODE[2:0] = 100 -> USB 下载
BOOT_MODE[2:0] = 101 -> NAND
如果引脚采样错误,BootROM 会去错误的介质寻找镜像,表现为“串口无输出”或“卡在 ROM 阶段”。这是调试中最常见的硬件级故障之一。
三、时钟初始化:从低频晶振到高频 PLL
复位后,SoC 通常先使用一个低频、稳定的晶振(如 24MHz 或 32.768kHz)作为初始时钟。BootROM 在早期会配置 PLL,把频率提升到 CPU 和 DDR 所需的工作频率。时钟初始化顺序一般如下:
- 使能外部晶振,等待稳定;
- 配置 PLL 倍频/分频参数,锁定 PLL;
- 切换 CPU、总线、DDR 时钟源到 PLL;
- 按需关闭未使用时钟,降低功耗。
如果 PLL 未锁定就切换时钟源,CPU 可能取指失败,表现为“跑飞”或“死机”。因此调试时可用示波器测量晶振和 PLL 输出,确认时钟树是否按预期工作。
四、电源管理与复位释放的配合
电源管理不是简单的“通电即全开”。现代 SoC 采用多电源域设计,BootROM 阶段通常只打开 CPU、SRAM、BootROM 和启动介质所需电源域,DDR 电源域往往由 SPL 阶段再打开。复位释放与电源稳定的关系可以用下面的信号链理解:
五、案例与场景:一次“无输出”的排查
某 ARM 开发板上电后串口无任何输出。排查步骤如下:
- 测量各路电源,发现 VDD_CORE 正常,但 VDD_DDR 未上电;
- 检查 BOOT_MODE 引脚,发现被误拉高,BootROM 进入 USB 下载模式而非 eMMC 启动;
- 修正引脚后,串口出现 BootROM 日志,但停在“等待 PLL 锁定”;
- 测量晶振,发现 24MHz 晶振未起振,更换晶振后正常启动。
这个案例说明:上电复位流程中的电源、启动模式、时钟三者缺一不可,且故障现象高度相似,必须按信号链顺序逐级确认。
六、常见误区与复盘清单
| 误区 | 正确认识 | 调试动作 |
|---|---|---|
| 上电后 CPU 直接执行 Flash 代码 | 先执行片内 BootROM,再由 BootROM 加载下一级 | 确认复位向量映射到 BootROM |
| 启动模式引脚可随意配置 | 复位时锁存,必须与目标介质一致 | 上电前测量 BOOT_MODE 电平 |
| 时钟不重要,先跑起来再说 | PLL 未锁定会导致取指失败 | 示波器测晶振与 PLL 输出 |
| 电源全部同时上电即可 | 多电源域需按序上电,否则可能闩锁 | 核对 PMU 上电时序图 |
| BootROM 可修改 | BootROM 固化在芯片内,不可修改 | 通过启动模式选择绕过或进入下载模式 |
调试建议:把“电源 → 复位 → 时钟 → 复位向量 → BootROM → 启动介质”当作一条固定信号链。每次上电异常,都从链头开始逐级测量,而不是直接怀疑软件。多数“内核起不来”的问题,根源其实在 BootROM 之前的硬件阶段。
注意:不同 SoC 的复位向量地址、启动模式编码、PLL 配置寄存器差异很大,务必以芯片 TRM(技术参考手册)和 BootROM 手册为准,不要直接套用其他平台的经验值。
掌握本节内容后,你就能在串口无输出、卡在 ROM 阶段、启动介质识别失败等场景中,快速定位问题位于电源、复位、时钟还是启动模式选择环节,为后续深入 BootROM 调试和内核启动分析打下基础。