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 的核心职责可以概括为四件事:

  1. 采样启动模式:读取 BOOT_MODE 引脚、eFuse 或 PMIC 寄存器,判断从 eMMC、SD、SPI Flash、UART、USB 还是网络启动;
  2. 初始化最小外设:配置启动介质所需的时钟、引脚复用和控制器;
  3. 加载并校验下一级镜像:把 SPL/Preloader 或二级引导程序读入 SRAM,做校验和签名验证;
  4. 跳转到下一级:把控制权交给 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 阶段再打开。复位释放与电源稳定的关系可以用下面的信号链理解:

SoC 上电复位与启动信号链 电源域上电 VDD_CORE / VDD_IO PMU 电源管理 按序释放电源 RCU 复位控制 复位树释放 时钟初始化 晶振 → PLL 锁定 CPU 复位向量 0x00000000 / 0xFFFF0000 取第一条指令 片内 BootROM 采样启动模式 加载并校验 SPL 启动介质 eMMC / SD / SPI UART / USB 下载 调试要点:电源稳定 → 复位释放 → 时钟锁定 → 复位向量取指 → BootROM 采样启动模式 → 加载 SPL 任一环节异常,都会表现为“串口无输出”或“卡在 ROM 阶段”

五、案例与场景:一次“无输出”的排查

某 ARM 开发板上电后串口无任何输出。排查步骤如下:

  1. 测量各路电源,发现 VDD_CORE 正常,但 VDD_DDR 未上电;
  2. 检查 BOOT_MODE 引脚,发现被误拉高,BootROM 进入 USB 下载模式而非 eMMC 启动;
  3. 修正引脚后,串口出现 BootROM 日志,但停在“等待 PLL 锁定”;
  4. 测量晶振,发现 24MHz 晶振未起振,更换晶振后正常启动。

这个案例说明:上电复位流程中的电源、启动模式、时钟三者缺一不可,且故障现象高度相似,必须按信号链顺序逐级确认。

六、常见误区与复盘清单

误区 正确认识 调试动作
上电后 CPU 直接执行 Flash 代码 先执行片内 BootROM,再由 BootROM 加载下一级 确认复位向量映射到 BootROM
启动模式引脚可随意配置 复位时锁存,必须与目标介质一致 上电前测量 BOOT_MODE 电平
时钟不重要,先跑起来再说 PLL 未锁定会导致取指失败 示波器测晶振与 PLL 输出
电源全部同时上电即可 多电源域需按序上电,否则可能闩锁 核对 PMU 上电时序图
BootROM 可修改 BootROM 固化在芯片内,不可修改 通过启动模式选择绕过或进入下载模式

调试建议:把“电源 → 复位 → 时钟 → 复位向量 → BootROM → 启动介质”当作一条固定信号链。每次上电异常,都从链头开始逐级测量,而不是直接怀疑软件。多数“内核起不来”的问题,根源其实在 BootROM 之前的硬件阶段。

注意:不同 SoC 的复位向量地址、启动模式编码、PLL 配置寄存器差异很大,务必以芯片 TRM(技术参考手册)和 BootROM 手册为准,不要直接套用其他平台的经验值。

掌握本节内容后,你就能在串口无输出、卡在 ROM 阶段、启动介质识别失败等场景中,快速定位问题位于电源、复位、时钟还是启动模式选择环节,为后续深入 BootROM 调试和内核启动分析打下基础。