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锁定与启动时序
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 锁定与启动时序决定“能不能稳定跑起来”。四者按正确顺序衔接,平台才能从确定状态进入可预期的运行状态。