3. 上电复位与时钟初始化

航电计算平台上电后,最先发生的不是“跑程序”,而是“把芯片拉到一个确定的初始状态”。复位负责把处理器核、总线、外设和时钟模块置于已知状态;时钟初始化负责把外部晶振或参考时钟转换成 CPU、总线和外设所需的多路频率。两者顺序错乱,轻则启动时间变长,重则取指失败、外设误动作,甚至出现“偶发不启动”的隐蔽故障。

一、复位类型与复位源

航电计算平台常见的复位类型可按作用范围与触发源划分。按范围分:上电复位(POR)由电源监控电路在电源电压越过阈值后产生,覆盖全芯片;系统复位通常由外部复位引脚、看门狗或软件触发,复位除备份域外的全部逻辑;局部复位只作用于某个外设或某个核,用于故障隔离。按触发源分:电源监控、外部复位引脚、看门狗超时、软件复位、时钟失效检测(CSS)等。

工程上要区分“复位源”和“复位类型”。复位源是触发原因,复位类型是作用范围。例如看门狗超时通常触发系统复位,而时钟失效可能只触发时钟安全系统切换并产生中断。启动代码应读取复位状态寄存器,判断本次复位来源,再决定是否记录故障、是否进入安全模式。示例:某平台复位状态寄存器 RSTSR 的位定义如下(示例参数,非实测):

RSTSR[0] POR    上电复位
RSTSR[1] PIN    外部复位引脚
RSTSR[2] WDG    看门狗复位
RSTSR[3] SW     软件复位
RSTSR[4] CSS    时钟失效复位
RSTSR[5] LOCKUP 内核锁定复位

启动时先读 RSTSR,再写 1 清零对应位,避免下次误判。若 RSTSR[4] 置位,说明上次启动后发生过时钟失效,应检查晶振起振电路与负载电容,而不是简单重启了事。

二、复位向量与启动入口

复位向量是处理器在复位释放后取第一条指令的地址。Cortex-M 类处理器从地址 0x0000_0000 处取初始主栈指针(MSP),从 0x0000_0004 处取复位向量(Reset_Handler 地址)。这个“0x0000_0000”是逻辑地址,实际映射到哪块存储器由启动模式决定:可从 Flash 启动、从系统存储器(Bootloader)启动,或从 SRAM 启动。航电平台通常固定从 Flash 启动,并通过选项字节或启动引脚锁定,防止误入 Bootloader。

复位向量表的前几项必须与链接脚本、启动文件一致。常见错误是向量表未对齐或未放到正确段,导致复位后取到非法地址,表现为“一上电就进 HardFault”。检查方法是查看映射文件,确认 .isr_vector 段起始地址与启动模式匹配。

三、时钟树配置

时钟树是本节最需要图形化理解的部分。典型航电计算平台的时钟树为:外部晶振(HSE,如 8 MHz 或 25 MHz)→ PLL 倍频/分频 → 系统时钟 SYSCLK → AHB 分频 → HCLK → APB 分频 → PCLK1/PCLK2。PLL 内部还有输入分频 M、倍频 N、输出分频 P/Q,输出频率公式为:

VCO = HSE / M × N
PLL_P = VCO / P   (供 SYSCLK)
PLL_Q = VCO / Q   (供外设,如 USB、SDIO)

示例:HSE=8 MHz,M=8,N=336,P=2,则 VCO=8/8×336=336 MHz,PLL_P=168 MHz,即 SYSCLK=168 MHz。若 AHB 不分频,HCLK=168 MHz;APB1 分频 4 得 PCLK1=42 MHz,APB2 分频 2 得 PCLK2=84 MHz。这些参数必须同时满足芯片手册的频率上限和 Flash 等待周期要求。

航电计算平台时钟树与PLL锁定路径 外部晶振 HSE 8 MHz 时钟源选择 HSI/HSE PLL M=8 N=336 VCO=336 MHz P=2 Q=7 LOCK 状态位 SYSCLK 168 MHz AHB /1 HCLK 168 MHz APB1 /4 PCLK1 42 MHz APB2 /2 PCLK2 84 MHz PLL 未锁定 → 禁止切换 等待 LOCK=1 后再切 SYSCLK 启动时序要求 POR释放 → HSE稳定 → PLL锁定 → 切SYSCLK → 配Flash等待 → 外设

四、PLL锁定与启动时序

PLL 从使能到输出稳定需要一段时间,硬件通过 LOCK 位指示锁定状态。启动代码必须轮询 LOCK 位,确认锁定后才能把 SYSCLK 切换到 PLL 输出。若在未锁定时切换,CPU 可能取到错误指令。切换前还要先配置 Flash 等待周期(Latency),因为 168 MHz 下 Flash 需要 5 个等待周期(示例值,需按手册确认)。顺序应为:使能 HSE → 等待 HSE 稳定 → 配置 PLL 参数 → 使能 PLL → 等待 LOCK → 配置 Flash 等待周期 → 切换 SYSCLK 到 PLL → 更新 SystemCoreClock。

启动时序还要求:复位释放后先使用 HSI(内部高速时钟)运行,因为 HSE 尚未起振;HSE 稳定后再切到 PLL。若 HSE 起振失败,应触发 CSS 并回退到 HSI,同时记录故障。整个启动过程可用 GPIO 翻转或时间戳测量,典型要求是上电到主程序运行不超过 100 ms(示例指标)。

注意:PLL 配置参数改变后必须重新等待 LOCK,不能只改分频系数就立即切换。Flash 等待周期不足会导致取指错误,表现为随机 HardFault。
调试建议:在切换 SYSCLK 前后各翻转一个 GPIO,用示波器测量 HSE 稳定到 PLL 锁定的时间,可快速定位启动慢或偶发不启动的问题。

综上,复位与时钟初始化是启动链的第一道关口。复位源决定“为什么重启”,复位向量决定“从哪里开始”,时钟树决定“跑多快”,PLL 锁定与启动时序决定“能不能稳定跑起来”。四者按正确顺序衔接,平台才能从确定状态进入可预期的运行状态。