4. 启动流程与复位调试
在英飞凌 AURIX™ TC3xx 这类汽车控制平台上,调试启动失败往往比调试运行期故障更棘手:CPU 还没跑到用户代码,串口没有打印,CAN 没有报文,调试器一连接就停在某个未知地址。要高效定位这类问题,必须把“从上电到用户 main 函数”的完整链路拆开理解,并知道每一级用什么手段去观察。本节围绕上电复位、BootROM、SSW(Startup Software)、用户启动代码以及多核启动顺序展开,并给出用调试器观察启动阶段、定位启动失败的具体方法。
一、上电到用户代码的完整链路
TC3xx 的启动不是“复位向量直接跳到 main”,而是分阶段交接的。上电或复位释放后,首先由复位控制逻辑采样启动模式引脚(如 HWCFG 引脚组合),决定从内部 Flash、外部 Flash 还是 Bootstrap Loader(BSL)启动。随后 CPU 从 BootROM 的固定入口开始执行,BootROM 完成最基本的硬件自检、时钟与看门狗初始化,并根据启动模式把控制权交给 SSW。SSW 位于 Flash 的固定区域(TC3xx 中通常从 0xA0000000 附近的固件区开始),负责更完整的时钟/PLL 配置、Flash 等待周期设置、内存保护初始化,最后跳转到用户启动代码。用户启动代码(Cstart)再完成 C 运行时环境搭建、数据段搬运、栈指针设置,最终调用 main。
这条链路上任何一级失败,现象都不同:BootROM 阶段失败通常表现为调试器无法 halt 或反复复位;SSW 阶段失败常见于时钟配置错误导致后续访问超时;用户启动代码失败则可能停在异常向量或直接跑飞。因此定位的第一步是判断“卡在哪一级”。
二、BootROM 与 SSW 阶段的关键观察手段
BootROM 是芯片出厂固化的代码,用户无法修改,但可以观察。调试器连接后,如果能在 BootROM 入口地址(TC3xx 通常为 0x8FFF8000 附近的 BootROM 区)成功 halt,说明复位释放和基本时钟已经正常;如果连 halt 都失败,问题多半在供电、复位引脚、调试接口(DAP/JTAG)或启动模式引脚上。此时应先用示波器确认 PORST 释放时序、VDD 是否稳定、调试口 TCK/TMS 是否有活动。
SSW 阶段最值得观察的是时钟与 Flash 状态。SSW 会根据启动配置把 PLL 从备份时钟切换到目标频率,并设置 Flash 等待周期。如果 PLL 未锁定就继续执行,后续取指会超时并触发总线错误。调试时可在 SSW 出口处设断点,读取 PLL 状态寄存器(如 PLLSTAT)确认 LOCK 位,读取 Flash 等待周期寄存器确认与目标频率匹配。一个常见错误是外部晶振频率与配置不符,导致 PLL 锁定失败,表现为程序在 SSW 内反复循环或直接复位。
三、用户启动代码与多核启动顺序
用户启动代码是用户可完全控制的第一段代码。它通常完成:设置栈指针、初始化数据段(把 .data 从 Flash 搬到 RAM)、清零 .bss、配置必要的 MPU/时钟、然后调用 main。若这段代码出错,典型现象是 main 从未被调用,或调用后立即进入异常。调试时可在 Cstart 入口和 main 入口各设一个断点,观察是否能依次命中。若 Cstart 入口命中但 main 未命中,重点检查段搬运地址、栈指针是否落在合法 RAM 区域、以及是否有未初始化的指针被提前使用。
多核启动顺序是 TC3xx 调试中容易被忽视的一环。上电后只有 CPU0 主动执行 BootROM 和 SSW,CPU1/CPU2/CPU3 处于等待状态。CPU0 在完成自身 Cstart 后,通过写 CPU 释放寄存器或使用同步机制唤醒从核,从核再从各自的启动入口开始执行。如果从核没有被正确释放,现象是 CPU0 正常运行而其他核始终不工作;如果从核释放过早(CPU0 还没准备好共享资源),则可能出现从核访问未初始化外设导致总线错误。调试时可用调试器分别 halt 各核,查看各核 PC 指针:若从核 PC 停在等待循环,说明释放条件未满足;若从核 PC 跑飞,说明释放后初始化顺序有问题。
四、启动失败定位的实用检查表
下面给出一份可直接用于启动失败排查的检查表,按阶段组织,便于在调试现场逐项确认。
| 阶段 | 观察对象 | 正常判据 | 异常可能原因 |
|---|---|---|---|
| 上电复位 | PORST 释放、VDD、调试口活动 | 复位释放后调试器可连接 | 供电不稳、复位电路、调试口接线 |
| BootROM | BootROM 入口能否 halt | 可停在固定入口地址 | 启动模式引脚错误、BSL 模式误入 |
| SSW | PLLSTAT、Flash 等待周期 | PLL LOCK=1,等待周期匹配 | 晶振频率不符、时钟配置错误 |
| 用户启动代码 | Cstart / main 断点、栈指针 | 依次命中,SP 在合法 RAM | 段搬运错误、栈越界、异常向量 |
| 多核启动 | 各核 PC 指针 | 从核被释放后进入各自入口 | 释放条件未满足、共享资源竞争 |
实际调试时,建议按“先确认复位与调试口,再确认 BootROM 可 halt,再确认 SSW 时钟,最后确认 Cstart 与多核释放”的顺序推进。每一步都用断点和寄存器读取留下证据,而不是凭现象猜测。这样即使启动失败原因隐蔽,也能快速缩小范围,把问题定位到具体阶段和具体寄存器。