4. 复位管理基础与复位源分类

复位管理是航电计算平台可靠运行的“最后一道保险”。它要解决的核心问题是:当平台处于未知状态、电源异常、软件跑飞或外部强制干预时,如何让处理器、外设和总线回到一个确定的初始状态,并且保证这个“回到初始”的过程本身是可控、可观测、可追溯的。理解复位管理,首先要区分两个层面:一是复位源,即“谁触发了复位”;二是复位域与复位树,即“复位被送到哪里、以什么顺序生效”。

一、六类典型复位源

航电计算平台常见的复位源可以归纳为六类,它们触发原因不同、作用范围不同,处理策略也不同。

上电复位(Power-On Reset, POR):当供电电压从 0 上升到工作范围时,电源监控电路在电压未达到安全阈值前持续输出复位有效信号,直到电压稳定并经过一段去抖延时后才释放。POR 的关键参数是复位阈值和释放延时。例如某 3.3V 电源域设定阈值为 2.9V,释放延时 20ms,意味着电压超过 2.9V 后仍需保持 20ms 才允许 CPU 启动。这样做的目的是等待晶振起振、PLL 锁定和电源纹波稳定。

掉电复位(Power-Down Reset, PDR):与 POR 相反,当电压跌落到阈值以下时立即触发复位,防止处理器在欠压状态下执行错误指令或写坏非易失存储器。掉电复位通常要求响应极快,因为电源跌落可能只有几百微秒。工程上常把 POR 和 PDR 做在同一颗电源监控芯片里,形成“欠压即复位”的窗口保护。

看门狗复位(Watchdog Reset):由片内或片外看门狗定时器产生。软件必须在规定时间内“喂狗”,否则计数器溢出并输出复位。看门狗复位用于捕获软件死循环、任务阻塞、中断丢失等异常。典型配置是超时时间 500ms,软件在 100ms 周期任务中喂狗;若连续 5 个周期未喂狗,则判定为软件失效并复位。

外部复位(External Reset):来自平台外部的手动按钮、测试设备或上级系统。外部复位通常经过滤波和电平转换后接入复位树,用于地面维护、故障隔离或强制重启。它必须与内部复位源做“或”逻辑合并,避免相互抵消。

软件复位(Software Reset):由软件写复位控制寄存器触发,用于模式切换、固件升级后重启或故障恢复。软件复位可以指定复位范围,例如只复位某个子系统而不影响整个平台。但软件复位不能用于“软件已经跑飞”的场景,因为跑飞的软件无法可靠执行复位指令,此时必须依赖看门狗或外部复位。

复位源分类小结:POR/PDR 属于电源类,看门狗属于监控类,外部复位属于人工/系统类,软件复位属于程序类。四类来源最终都要汇聚到复位树,由复位控制器统一仲裁。

复位源分类与复位树汇聚关系 复位源(按来源分类) 电源类 上电复位 POR 掉电复位 PDR 监控类 看门狗复位 WDR 人工/系统类 外部复位 EXTRST 程序类 软件复位 SWRST 复位控制器 复位源仲裁 复位原因锁存 复位脉冲展宽 复位域分配 RST_CTRL 复位树(按域分发) 全局复位域 CPU / DDR / 总线 / 时钟 子系统复位域 显示 / 通信 / 存储 外设复位域 UART / SPI / GPIO / 定时器 调试复位域 JTAG / 跟踪 / 调试接口 复位源经仲裁后,按复位域沿复位树逐级分发;全局域优先释放,子系统与外设域按依赖顺序释放

二、复位域与复位树

复位域是指“共享同一个复位信号、必须同时复位或同时释放”的一组逻辑单元。航电计算平台通常划分四个层次:全局复位域覆盖 CPU、DDR 控制器、系统总线和主时钟;子系统复位域覆盖显示、通信、存储等独立功能模块;外设复位域覆盖 UART、SPI、GPIO、定时器等低速接口;调试复位域覆盖 JTAG、跟踪和调试接口,通常要求独立控制,以便在系统复位时保持调试连接不中断。

复位树描述的是复位信号从复位控制器到各复位域的分发路径和释放顺序。它不是简单的并联,而是有依赖关系的树状结构。例如,DDR 控制器必须在 CPU 之前完成复位释放,否则 CPU 启动时访问 DDR 会失败;PLL 必须在总线复位释放前锁定,否则总线时钟不稳定。因此复位树通常规定:全局域先释放,子系统域次之,外设域最后释放,调试域可独立保持。

复位控制器是复位树的根节点,它完成四件事:仲裁(多个复位源同时有效时按优先级处理)、锁存(记录复位原因,供启动后读取)、展宽(保证复位脉冲宽度满足器件最小要求)、分配(按复位域输出多路复位信号)。启动后,软件通过读取复位原因寄存器可以判断本次复位是 POR、看门狗还是外部复位,从而决定是正常启动、记录故障还是进入维护模式。

三、复位管理的工程要点

在实际设计中,有几个容易出问题的细节值得注意。第一,复位释放必须与时钟稳定同步。异步复位、同步释放是常用做法:复位信号异步拉低,释放时经过两级触发器同步到目标时钟域,避免亚稳态。第二,看门狗复位后要保留复位原因,否则软件无法区分“正常上电”和“看门狗超时”,故障定位会变得困难。第三,软件复位要限定范围,避免误复位全局域导致正在执行的固件升级中断。第四,外部复位需要去抖,典型去抖时间为 10ms~50ms,防止按钮抖动产生多次复位。

复位原因寄存器通常按位定义,例如 bit0=POR、bit1=PDR、bit2=WDR、bit3=EXTRST、bit4=SWRST。启动后软件读取该寄存器并清零,即可实现“一次复位原因只被消费一次”。

下面给出一个复位原因判读的示例逻辑,用于启动阶段区分复位来源:

rst_cause = read_reg(RST_CAUSE);
if (rst_cause & POR_BIT) {
    boot_mode = COLD_BOOT;      // 冷启动,加载完整固件
} else if (rst_cause & WDR_BIT) {
    boot_mode = WDT_RECOVERY;   // 看门狗恢复,记录故障日志
} else if (rst_cause & EXTRST_BIT) {
    boot_mode = MAINTENANCE;    // 外部复位,进入维护模式
} else if (rst_cause & SWRST_BIT) {
    boot_mode = WARM_BOOT;      // 软件复位,保留部分上下文
}
write_reg(RST_CAUSE, 0);        // 清除复位原因,避免重复判读

复位管理的目标不是“让系统重启”,而是“让系统以可预期的方式回到已知状态,并且让这次复位的原因可被追溯”。只有把复位源分类清楚、把复位域和复位树设计正确,航电计算平台才能在电源波动、软件异常和外部干预下保持可控的启动行为。