只读分享解决方案文档原理方案设计📅 2026-10-14🔖 Rev 1.0⏳ 还有3日到期
🔧解决方案&应用市场分析 -> 原理方案设计 -> 电子设计&技术探讨 -> 复位系统与看门狗设计_技术探讨

复位系统与看门狗设计_技术探讨

同系列 · 原理方案设计
市场&调试推荐
扫码打开本页
微信扫码

复位系统与看门狗设计

复位来源与判决、看门狗纪律、软件配合、测试验证与核查清单 —— 一份从机制落到检查单的电路设计参考 | 编制日期 2026-10-14 | 版本号 Rev 1.0

3 类复位源
上电 / 欠压 / 外部
判决条件各不相同,不能一套参数包打天下
2 种看门狗
窗口 + 独立
喂狗合法区与超时动作分级是两条主线
4 道判决条件
阈值 · 脉宽 · 时钟 · 同步
任何一道不过,复位就不该释放
12 章 + 4 附录
从机制到核查清单
架构 · 软件配合 · 测试验证 · 故障速查

报告总结

报告总结

硬件调试里有一类故障特别折磨人:板子「不开机」「偶发复位」「跑一会儿自己重启」。示波器上电源明明正常,固件明明在跑,系统却一次又一次回到起点。把时间轴展开,这类故障几乎都能归结到同一件事:复位不是一个「按键」或「一个POR」,而是一条从判决到释放再到软件收敛的完整链路,链上任何一环的参数、顺序或纪律出了问题,都会以「系统失控」的形式回来。

这份文档把这条链路拆开讲透:复位有哪几类来源、各自凭什么判决(第 1 章);多源怎么仲裁、复位树怎么分配(第 2 章);上电复位与电压监控电路怎么设计(第 3 章);看门狗怎么配、怎么喂、超时了怎么办(第 4 章);外部复位与多主协商怎么处理(第 5 章);释放时序与同步怎么保证(第 6 章);软件侧怎么记录原因、判别状态、保存日志、收敛到安全态(第 7 章);最后落到测试方法(第 8 章)、故障速查(第 9 章)、设计建议与案例(第 10、11 章)、核查清单(第 12 章)。对象覆盖 MCU / SoC 类主芯片外挂存储的系统,也适用于纯主芯片系统。文中所有数值均为量级性示意,具体参数一律以器件 datasheet 与相应规范为准。

前言

做硬件的人迟早会遇到同一个噩梦:样片阶段明明好好的板子,到试产或现场开始「偶发复位」。事后复盘时,往往发现所有「该做的」都做了——复位引脚上了拉电阻、看门狗也开了、固件里也在喂狗——唯独没有回答一个问题:这次复位到底是谁触发的、判决条件是什么、释放时机对不对、软件知不知道发生了什么?

这个问题问的不是某一个器件,而是系统:复位源之间的仲裁、复位树的分配顺序、释放与时钟的配合、看门狗的喂狗纪律、软件侧的原因记录与安全收敛,每一环都合格,链路才合格;任何一环只满足「典型值」不满足「最坏值」,失效就会以间歇性的形式留给量产。这份文档把这条链路拆开,逐环给出机制、设计动作、测试方法与检查项。

结论: 复位系统的全部设计动作可以概括成两句话——判决要严:每一类复位源都有明确的判决条件(阈值、脉宽、时钟就绪、同步释放),任何一道不过就不释放;纪律要硬:看门狗的喂狗点、超时动作分级、复位原因记录必须写进设计文档并逐项测试。 所有数值为量级性示意,具体参数以正式 datasheet / 规范为准。

读者路径

  • 想先建立整体图景:第 1 章(问题本质与判决条件)+ 第 2 章(复位架构总览)。
  • 正在画原理图、选监控方案:第 3 章(上电复位与电压监控)+ 第 5 章(外部复位与监控芯片)+ 附录 A。
  • 正在配看门狗、写喂狗逻辑:第 4 章(看门狗机制)+ 第 7 章(软件配合)+ 附录 B。
  • 板子出问题要定位:第 9 章(故障速查)+ 第 11 章(案例)+ 第 8 章(测试方法)。
  • 关心释放时序与多时钟域:第 6 章(复位时序与释放)。
  • 只想要结论:第 10 章(设计建议)+ 第 12 章(核查清单)+ 附录 A~D 模板。

1. 问题本质:复位的来源与判决

这一章不涉及任何具体电路,只把「复位」还原成三个问题:复位从哪里来、凭什么判决、判决之后发生什么。后面所有章节的判断,都是这一章几条原理在具体器件与具体系统上的投影。

1.1 上电复位、欠压复位与外部复位

按来源划分,系统里的复位可以归纳成三类:上电复位(电源从无到有的过程触发)、欠压复位(运行中电源跌落触发)、外部复位(人为或外部器件驱动复位引脚触发)。三类的共同点是「把系统拉回已知初态」,不同点在于判决条件——凭什么认定「这是一次有效的复位」。

  • 上电复位(POR):判决依据是 VCC 穿越上电阈值。阈值是一个窗口而不是一条线,穿越窗口的瞬间复位开始释放,并起算一段上电延时。
  • 欠压复位(BOD / BOR):判决依据是「跌落深度」与「持续时间」同时满足——只看深度会被电源噪声误触发,只看时长会在真跌落时反应太慢。高位阈值通常还配一个早期预警(中断而非复位)。
  • 外部复位:判决依据是复位引脚的电平稳定并持续过消抖时间。按键、外部监控芯片、另一个主芯片都可以是驱动源。

三类的响应也有差别:上电与欠压复位由硬件电路自主完成,软件只能「等」;外部复位可以做到「立即进入、尽快释放」,是三类里唯一可由外部主动掌握节奏的。三类复位源在同一个系统里并存时,还需要仲裁——这是第 2 章的内容。

复位源触发事件判决条件(判据)典型响应软件可见性
上电复位 PORVCC 由零升起穿越上电阈值窗口保持复位并起算上电延时只能等,结束后记录原因
欠压复位 BODVCC 跌落到阈值以下跌落深度与持续时间同时满足拉复位;高位阈值先出预警中断预警中断可提前保存状态
外部复位(引脚)引脚被驱动为有效电平电平稳定且过消抖时间立即进入复位,释放由电路保证启动时读原因寄存器判别
看门狗复位计数器超时或窗口外喂狗计数条件满足(见第 4 章)先中断预警,再拉复位原因寄存器单独记录
软件复位固件写复位命令命令被确认执行立即进入复位原因寄存器单独记录,可留日志
三类复位源与判决条件:触发源决定「何时拉复位」,判决条件决定「算不算一次真复位」上电复位(POR)触发:VCC 由零升起穿越阈值判决:阈值窗口内穿越即算数响应:保持复位并起算上电延时欠压复位(BOD / BOR)触发:VCC 跌落到阈值以下判决:跌落深度与持续时间响应:拉复位,高位阈值先预警外部复位(引脚 / 监控片)触发:复位引脚被驱动有效判决:电平稳定并过消抖时间响应:立即进入复位,不等时钟复位释放前的四道判决(任何一道不过,复位就不释放)阈值判定VCC 在窗口内脉宽判定复位已拉够时间时钟就绪时钟已稳定同步释放过同步链再释放三类源的判决条件互不相同:POR 看阈值、BOD 看深度与时长、外部复位看电平与消抖用同一套参数覆盖三类复位源,是复位设计最常见的第一步错;阈值与脉宽参数以 datasheet 为准
图 1 · 三类复位源与判决条件

图 1 把三类复位源和四道判决画在了一起:上方三张卡片是「谁在拉复位」,下方四道判决是「凭什么放复位」。拉复位是容易的,放复位才是设计的重点——放早了,系统在半就绪状态启动;放晚了,只是慢一点,不会出事。这也是全篇反复出现的非对称性:判决可以严,释放必须稳。

最常见的误判:用一套参数「包打天下」

「我们 POR 和 BOD 用同一个阈值」「看门狗超时和外部复位用同一个消抖时间」——这类简化在原理图上很常见,但它把三类的判决条件搅在了一起:POR 要的是「起来就要放」,BOD 要的是「跌下去就要拉而且别误判」,外部复位要的是「人为节奏可控」。三类共用一个参数池的结果,通常是 BOD 被 POR 的参数带偏(噪声误触发)或外部复位被 BOD 的参数带偏(人为复位不响应)。设计动作是把三类的判决条件分别列进参数表(附录 A.2 给出模板),逐类核算。

1.2 复位阈值与迟滞

复位阈值首先是一个窗口而不是一条线:受工艺偏差与温度影响,同一型号不同批次、不同温度下,比较器的翻转点会分布在一个区间内。数据手册通常给出阈值的最小值与最大值,系统设计要按窗口核算,不能按标称值核算。

比窗口更容易出问题的是迟滞。没有迟滞(或迟滞不足)的监控电路,在 VCC 缓慢穿过阈值时会出现「 chatter 」——反复翻转、反复复位,表现就是系统在某个电压点附近「抽搐」,永远起不来。迟滞的判据很简单:释放阈值与再次拉复位的阈值之间要留出足够间距,间距要大于电源在该电压附近的正常波动幅度。间距不够,噪声就替你「判决」。

参数(口径)含义约束方向系统侧动作
上电阈值窗口POR 比较器的翻转区间窗口内穿越才算数核算电源斜坡,不依赖标称点
欠压拉复位阈值BOD 判定跌落的电压低于它即拉复位按负载瞬态核算跌落深度
欠压释放阈值BOD 放开复位的电压与拉复位阈值之差即迟滞迟滞间距大于电源正常波动
预警阈值早期预警中断的动作点高于欠压拉复位阈值给软件留出保存状态的时间
温度与批次修正全温全批次下的窗口变化端点温度可能显著漂移按最坏窗口核算,不用典型值
迟滞的本质:把「电压」判决变成「事件」判决

没有迟滞的监控器是对「电压值」做判决——VCC 只要在阈值附近抖动,判决就反复改。有迟滞的监控器是对「事件」做判决——只有明确穿越到另一侧才改判。电源是一个连续变化的模拟量,任何用单阈值对模拟量做判决的电路,都是在邀请噪声做判决。这条原则不止适用于 BOD:窗口看门狗的喂狗合法区(第 4 章)、外部复位的消抖(第 5 章),本质都是给判决加迟滞。

1.3 复位脉冲宽度

复位拉下去之后,要拉多久?答案是至少让所有受复位控制的寄存器都完成归位。触发器从「复位沿」到「稳定在复位态」需要时间,时钟沿与复位释放沿靠得太近还会遇到亚稳态(第 6 章展开)。工程上把「最短可靠复位时间」归纳成三个来源:

  • 电路保证的宽度:正规 POR / 监控芯片会在手册里给出「保证的最小复位脉冲宽度」,这是设计的下限依据。
  • RC 延迟的宽度:用阻容延时保持复位的电路,宽度由放电时间常数决定,还要考虑开关漏电流、温度漂移与批次分散——低温下电容容量变化、高温下漏电流增大,都会把宽度拉偏。
  • 人为操作的宽度:按键复位的宽度取决于人——几十毫秒量级,通常远大于电路需要,真正要处理的是消抖(第 5 章)。

宽度不足的后果是「部分复位」:大部分寄存器归位了,个别触发器停在旧值,系统带着一个不一致的初态启动——这类故障的表现是偶发的、与上电时刻相关的,极难复现。宽度的核算原则:取手册保证值、RC 电路按最坏时间常数核算、宁宽勿窄。宽了只是启动略慢,窄了就是潜伏故障。

宽度来源决定因素核算要点不足的后果
POR / 监控芯片保证值器件内部计数器取手册下限,不留侥幸上电即半就绪启动
RC 延时电路放电时间常数 + 漏电流按低温容量、高温漏电核算宽度随温度漂移,时好时坏
按键人为宽度人手操作消抖优先,宽度通常充裕抖跳多个沿,需专门处理
看门狗拉复位的宽度看门狗内部时序与系统复位路径合并核算存储类外设来不及归位
「示波器上看复位脉冲挺宽的」不等于宽度合格

宽度要在最坏情况下核算:低温(RC 容量变化、比较器变慢)、批次边缘(计数器最快与最慢两端)、电源边缘(斜坡最陡与最缓两端)。常温下量到几十微秒只能说「这一次是宽的」,判定类结论必须来自最坏值核算 + 边界温度实测(第 8 章给出测法)。把「典型条件够宽」当设计依据,是间歇性复位故障的经典源头。

1.4 复位释放与时钟稳定

复位有两个沿,两个沿的安全性完全相反:拉低沿是异步安全的——不管时钟处于什么相位,拉低复位总是能把系统带入已知态;释放沿是危险沿——释放瞬间,所有触发器同时「活过来」,如果此时时钟还没稳定,第一次时钟沿就可能采到未定义的中间态。

由此得到复位分配的第一条铁律:「异步拉低、同步释放」。拉低可以用异步方式(任何源有效立即拉低),释放必须经过同步链——确认时钟已稳定、再经过至少两级同步触发器、以「干净」的时钟沿释放。违反这条铁律的系统,故障形态是「大部分上电正常、偶尔一次启动后行为怪异」,而且怪异的形态每次都不一样,因为亚稳态的结果本身就是随机的。

释放时机时钟状态风险正确动作
时钟未起振即释放无时钟或频率未稳首沿采样未定义,行为随机等起振完成或稳定标志置位
时钟起振中即释放频率漂移中建立时间可能被违反等锁相环锁定或稳定标志
时钟稳定后同步释放频率已稳无(前提是同步链完整)过两级同步,单沿释放
释放沿与时钟沿对齐相位巧合恢复时间可能被违反同步链天然错开,无需人工干预
为什么受伤的总是释放沿而不是拉低沿

拉低复位时,系统目标是「归零」——异步信号强制所有触发器进复位态,这个动作不依赖时钟,永远有效。释放复位时,系统目标是「从零开始正确运行」——第一次时钟沿就要采到正确的电源、正确的总线电平、正确的存储器状态,任何一个前提没就绪,释放沿就把错误放进了系统。设计上的非对称对待就是:拉低可以「莽」,释放必须「稳」——第 6 章把这一点展开成多时钟域的释放顺序。

1.5 存储系统的复位画像

存储系统的复位对象比「处理器 + 内存」复杂:除了主芯片自身,还有存储控制器、物理层(PHY)、缓存与在写状态、以及可能独立供电的编程电压轨。把复位对象列全,是第 2 章复位树的设计输入;把每个对象的复位后果想清楚,才能定义哪些复位源可以碰它、哪些场景必须避开。

  • 主芯片数字逻辑:复位即归零,无状态损失,是最「耐复位」的部分。
  • 存储控制器与命令状态机:归零是安全的,但归零时机要紧——如果有命令在途、写在飞,一次不合时宜的复位会把「一次未完成的写」留在介质里。
  • 缓存与脏数据:写回型缓存里的脏数据是复位最怕的东西——复位不等人,脏数据不会因为「系统要重启了」就自动落盘。
  • 物理层与训练状态:高速接口(如 eMMC / UFS 一类)的链路训练状态归零后需要重新训练,这是启动时间的一部分,不是故障。
  • 独立供电轨(如编程电压轨):上电与关断有顺序要求,复位序列要避开「轨在写中途被撤」的组合。
复位对象归零是否安全要避开的情形设计动作
主芯片数字逻辑安全,无状态损失无(释放时机除外)同步释放即可
存储控制器状态机安全,但有时机要求命令在途、写在飞时复位写完成判据 + 复位前冲刷
缓存 / 脏数据不安全,可能丢数据任何非预期复位掉电预警中断内冲刷(第 7 章)
物理层训练状态安全,需重新训练训练中撤轨复位序列排在训练完成之后
独立编程电压轨危险,有顺序要求写中途撤轨、带电热插拔轨序与复位序列统一设计
带病复位:把一次偶发复位放大成数据事故

「复位只是重启一下」是存储系统里最危险的想当然。如果复位落在写中途,受损的不是「这次重启」,而是介质里那条没写完的数据——文件系统元数据写到一半、磨损均衡表没更新、坏块标记丢失,任何一样都足以让设备在下次启动时行为异常甚至无法挂载。设计动作有三条:其一,把「写进行中」作为复位禁忌,用软件在写关键结构前屏蔽非必要复位源;其二,给足掉电预警时间,让软件在欠压预警中断里完成冲刷(第 7 章);其三,关键元数据用冗余与校验保护,让「半条记录」可被识别和修复。注意:绝不允许为了「防止误复位」而关断看门狗或旁路欠压监控——那是把数据事故升级成安全事故(第 4、10 章)。

本章小结:复位的本质是「判决 + 释放」两件事——三类复位源各有判决条件,阈值要看窗口与迟滞,脉宽要按最坏值核算,释放要等时钟并过同步链,而存储系统的特殊之处在于:复位对象里藏着会丢数据的缓存与写在飞的状态。下一章把视角从单个复位源拉到系统级:多源怎么仲裁、复位树怎么分。

2. 复位架构总览

这一章把复位从「一个引脚」展开成「一张树」:复位源怎么仲裁成一个复位根、树怎么按域分配、释放顺序怎么定、不同规模的系统怎么选架构。核心观点:复位架构的目标不是「有复位」,而是「任何一个源都能让系统去已知态,且释放时机唯一」。

2.1 复位树与复位分配

复位树是复位架构的骨架,自顶向下分四层。根层:仲裁输出,任何源有效即拉低,是系统里唯一的「复位总闸」。分配层:从根分出若干分支,每个分支对应一个时钟域或一个功能域。同步层:每条分支末端是同步链(至少两级触发器),把「释放」变成目标域时钟的干净沿。叶层:最终消费者——寄存器、状态机、总线接口。

复位树的设计动作可以概括成「一根、分域、逐叶命名」:一根(唯一的仲裁根,杜绝多头拉复位);分域(每个时钟域一条分支,域内共享释放沿);逐叶命名(每个叶节点在设计文档里有名字、有归属域、有释放顺序)。树画不出来,说明架构还没想清楚——这是第 10 章「复位树清单化」的起点。

树的层内容设计要点常见缺陷
根层(仲裁输出)多源合成的复位总闸任何源有效即拉低多个源直接拉同一引脚却无仲裁
分配层(分支)按时钟域 / 功能域分支域不跨分支,避免 skew一根复位走遍所有域,不管频率
同步层(同步链)分支末端的两级同步释放过同步,拉低可异步释放沿没过同步,直接放行
叶层(消费者)寄存器 / 状态机 / 接口逐个登记,无一遗漏新模块忘了接复位,上电状态随机
「一根」原则:复位总闸只能有一个

允许「每个源各拉各的、最后用线与凑在一起」的系统,问题不在功能而在释放:线与拓扑下,任何一个源的误脉冲都会把已释放的系统重新拽回去,而释放条件「所有源都无效」在线与拓扑里是隐式的、不可判定的。把仲裁显式化(一个总闸 + 明确的释放条件),系统才「放得出去」。这与第 1 章「释放比拉低重要」是同一件事在架构层的表述。

2.2 复位源仲裁与优先级

多源并存就要仲裁。仲裁要回答三个问题:拉复位的条件(任一源有效即拉,通常是或逻辑)、释放的条件(所有源无效且释放条件满足——注意是「且」,不是「或」)、优先级(当多个源同时有效时,系统记录谁、响应对谁)。

优先级的设定没有万能答案,但有两条经验:电源类事件(上电、欠压)通常优先于命令类事件(看门狗、软件),因为电源类意味着硬件条件不成立,命令类的响应没有意义;用于诊断的事件(看门狗、软件复位)要能被单独记录,否则第 7 章的复位原因记录就成了无米之炊。优先级排定之后,必须写进设计文档——排而不写,等于没排。

复位树与仲裁:多个复位源经仲裁合成一个复位根,再按域分配、按同步链释放上电复位POR阈值判决欠压监控BOD深度加时长看门狗超时动作分级外部引脚按键或监控片电平判决软件复位命令触发原因可记录复位源仲裁与优先级拉复位:任一源有效即拉低;释放:所有源无效且释放条件满足(是与关系,不是或)优先级(示例):上电与欠压 > 看门狗 > 外部引脚 > 软件命令——可按系统要求重排,但必须写进设计文档复位根(仲裁输出)同步释放链异步拉低 · 同步释放处理器域内核 · 调试按同步链释放总线与外设域总线接口 · DMA按同步链释放存储控制器域命令状态机 · 缓存按同步链释放时钟与模拟域PLL · 模拟偏置按模拟时序释放复位树的每一个叶子都要有名字、有归属域、有释放顺序——说不清叶子,就说不清架构树形与优先级为示意;具体源的使能关系、优先级与释放条件以主芯片 datasheet 与系统设计为准
图 2 · 复位树与仲裁示意

图 2 的上半是仲裁:五个源汇入一个面板,输出唯一的复位根;下半是分配:复位根经同步释放链,分到四个域。注意释放条件的表述——「所有源无效且释放条件满足」是与关系:任何一个源还挂着,或释放条件(时钟就绪、脉宽达标)没满足,复位就不放。这个「且」是上电即反复重启与上电一次成功之间的分界线。

仲裁释放条件写错,标准故障是「上电即反复重启」

如果释放条件被写成「任一源无效即放」(或逻辑),系统会这样:POR 释放的瞬间,看门狗还没初始化完成、外部引脚的上拉还没建立、软件复位的标志位还是乱的——复位放了又被某个源拽回去,形成上电抽搐,现象是「反复重启、永远进不了主循环」。排障时容易误看成电源问题,实际是仲裁逻辑的条件写反。对策很朴素:把释放条件写成显式的「与」,并在第 8 章的测试里用「上电 100 次无抽搐」来验证。

2.3 复位延迟与顺序

复位从根到叶有延迟,不同分支的延迟不同,这就是复位 skew。skew 本身不是问题,问题是跨域的依赖关系:如果 A 域的逻辑要在复位释放后立即读 B 域的输出,而 B 域的复位放得比 A 晚,A 读到的就是旧值或未定义值。处理依赖关系的办法是定义释放顺序:被依赖的域先放,依赖方后放,顺序由「谁等谁」推导,不由布线的自然延迟决定。

典型顺序约束有四类:时钟域之间(快时钟域通常后放,让它看到稳定的慢域输出);存储相关域(存储控制器先于使用存储的执行单元释放,保证首条命令落在就绪的控制器上);总线主从之间(从设备先就绪,主设备后释放,避免上电即遇到无响应的总线);模拟与数字之间(模拟偏置、参考电压先稳,数字后放)。顺序定义完成后,用复位序列器或延时链实现,并在设计文档里画出「谁先谁后、依据是什么」。

顺序约束先释放方后释放方依据(推导逻辑)
时钟域之间慢时钟域 / 参考域快时钟域快域逻辑要读慢域的稳定输出
存储相关存储控制器域执行单元 / 取指逻辑首条访问必须落在就绪的控制器上
总线主从从设备域主设备域避免上电即遇无响应总线
模拟与数字模拟偏置 / 参考数字逻辑数字判决依赖稳定的模拟基准
看门狗与系统看门狗计数器域受监控域保证监控先就位,被监控后放行
顺序的实现:序列器、延时链与「等就绪」三种风格

顺序落地有三种风格,可靠性递增:固定延时链(每个域等一个设定时间,简单但把「最坏情况没出现」当依据,不推荐单独使用);复位序列器(按配置的次序逐个释放,次序可文档化,中规中矩);等就绪标志(每级释放前确认下级就绪,最稳但结构最复杂)。混合方案最常见:关键的存储与总线域用等就绪,不关键的域用序列器。选哪种要写进设计文档,第 10 章的设计评审要点会逐项核对。

2.4 决策树:按系统规模选复位架构

复位架构的选择可以按「系统规模 × 安全要求」两个维度决策。小系统(单 MCU、单时钟域、无高速存储接口):主芯片内部 POR / BOD + 复位引脚,全部搞定,重点是参数核算与引脚默认电平。中系统(单 SoC 多时钟域 + 一类存储接口):内部源 + 外部监控芯片(补盲区)+ 看门狗,重点是仲裁与释放顺序。大系统(多主、多供电域、高速存储):外部监控 + 复位序列器 + 分域同步链 + 多主协商(第 5 章),重点是顺序的可文档化与可测试性。安全相关系统(功能安全等级要求高的场景)还要加「监控独立性」——看门狗的时钟与复位路径要与被监控系统物理独立,避免共因失效。

系统规模典型复位源仲裁方式释放顺序实现设计重点
小系统(单 MCU)内部 POR / BOD + 引脚芯片内部仲裁内部时序保证参数核算 + 引脚默认电平
中系统(单 SoC 多域)内部源 + 外部监控 + 看门狗显式仲裁(总闸)序列器或等就绪仲裁释放条件 + 顺序文档化
大系统(多主多域)外部监控 + 序列器 + 多源序列器统一仲裁序列器逐级释放顺序可测试 + 多主协商
安全相关系统上述 + 独立监控独立监控路径等就绪优先监控独立性 + 故障覆盖率
选型的第一问不是「选哪个方案」,而是「谁能看到全局」

规模不同的系统,真正的差异是有没有一个器件能看到所有域的复位状态:小系统里主芯片自己就是全局;大系统里必须有一个「监控方」(外部监控芯片或专职主)掌握所有源的状态与释放节奏。没有全局视角的系统,仲裁只能退化成「谁都能拉、放了再看」——这正是上电抽搐与反复重启的架构级根源。决策树上先回答「谁看全局」,再选具体器件。

2.5 与上电时序设计的衔接

复位是上电时序的最后一环,也是两条链路的缝合点:电源链路回答「电什么时候来、按什么顺序来」,复位链路回答「什么时候算就绪、什么时候放行」。两者的接口只有三个:上电完成判据(最后一条轨建立 + 稳定,是复位释放的前提)、解复位时机(时钟稳定后,总线解复位)、掉电方向(掉电时复位要先于轨掉电拉低,避免半供电状态)。

本篇聚焦复位链路,电源链路(轨序、斜坡、去耦)由上电时序专题承接;但两个专题共享同一份时序图——轨建立事件、时钟稳定事件、复位释放事件、首条命令事件画在同一条时间轴上,各自标注出处。分画两张图的团队,迟早会在「我以为你等了我」的扯皮上浪费时间。

接口事件电源链路职责复位链路职责共享判据
上电完成各轨按序建立并稳定以上电完成为释放前提最后一条轨的稳定标志
解复位时机保证轨在释放前稳定时钟稳定后同步释放时钟稳定标志 + 同步链
掉电方向轨按反序掉电复位先于轨掉电拉低掉电预警 + 轨序反序
反复上下电静默期满足器件要求复位完全释放后再上电上电窗口无抖动(第 6 章)
缝合的检验方法:一张图、一条时间轴、四次事件

两个专题的缝合质量用一个动作检验:把「最后一条轨建立、时钟稳定、复位释放、首条命令」四个事件画在同一条时间轴上,每个事件标注出处(哪个手册的哪个参数)。画得出来,说明两个专题的口径统一了;画不出来,中间的空隙就是将来失效的地方——这个空隙在试产里叫「偶发不应」,在现场叫「莫名重启」。

本章小结:复位架构的要点是一根(唯一仲裁总闸)、分域(按时钟域分配)、逐叶命名(每个消费者有档案)、顺序有据(谁等谁可推导)。下一章进入电路层:上电复位与电压监控的具体实现,以及窗口检测、迟滞与掉电预警怎么落地。

3. 上电复位与电压监控

这一章把第 1 章的判决条件落到电路层:上电复位电路有哪几种形态、电压监控怎么从「只看低压」扩展到「窗口检测」、迟滞与抗噪怎么做、掉电预警怎么给软件争取时间、存储系统的多个供电轨各监控什么。核心观点:监控电路的职责不是「检测电压」,而是「把模拟量判决成可靠的事件」。

3.1 上电复位电路

上电复位电路有三种常见形态,按「精度与成本的权衡」展开。形态一:芯片内部的模拟 POR——比较器监测 VCC,越过阈值后启动内部计数器,计数结束释放复位。现代主芯片普遍内置,优势是阈值窗口与最小脉宽都有手册保证,系统侧只要核算斜坡与负载。形态二:外置 RC 延时电路——阻容网络保持复位引脚低电平一段时间,结构最简单、零成本,但宽度由 RC 时间常数决定,受温度、漏电、批次影响,且没有阈值精度可言,只适用于对复位时序没有苛刻要求的场合。形态三:外部监控芯片——专用 supervisor,提供精确阈值、多轨监控、手动复位输入,部分型号还带看门狗,是「内部 POR 不够用」时的标准答案。

电路形态阈值来源脉宽保证优势适用场合
内部模拟 POR内置比较器窗口内部计数器保证参数有手册保证,零外围多数主芯片系统的默认选择
外置 RC 延时无(依赖引脚阈值)RC 时间常数估算结构最简单、成本最低时序要求不高的简单系统
外部监控芯片精密基准 + 比较器器件内部保证多轨、精确、可带手动复位多轨系统 / 内部 POR 不满足时
监控 + 复位一体上述之一上述之一顺带解决看门狗与手动复位中大型系统的常见组合
RC 复位电路的宽度核算:三个最坏条件一个都不能少

RC 电路「看起来宽」是最常见的假象:常温下量到的宽度可能远超需求,但低温(电容容量变化、门阈值漂移)、高温(漏电流增大、放电加快)、批次边缘(阻容精度两端)任何一项都能把宽度吃掉一半以上。核算方法:取手册或实测的阻容精度极限,按最坏时间常数算最小宽度,再与系统要求的「最短可靠复位时间」比对。比对不过的 RC 电路不是「便宜」,是「把成本转成了故障率」——升级为监控芯片通常是最便宜的修复。

3.2 电压监控与窗口检测

电压监控按「看几个方向」分三档。单向下限检测:只看欠压(BOD 一类),覆盖绝大多数场景——系统怕的是「电不够」。窗口检测:同时看下限与上限,VCC 跌过低阈值或超过高阈值都判异常。窗口检测的价值在上限:存储系统的编程电压轨(如 VPP 一类)超过上限有过流与介质损伤风险,只测欠压等于放任过压。多阈值检测:在同一方向上设多级——高位阈值出预警(给软件留时间)、低位阈值拉复位(硬件保护),预警与复位之间的间距就是软件的「保存窗口」(3.4 节展开)。

监控功能监测方向动作典型配置层级
欠压预警VCC 低于预警阈值出中断,软件保存现场第一道(软件可见)
欠压复位VCC 低于拉复位阈值硬件拉复位第二道(硬件动作)
过压检测VCC 超过上限阈值拉复位 / 切断供电窗口检测必备
上电检测VCC 由上向下穿越释放复位并起算延时上电专用(POR)
多轨监控各轨独立检测分轨判决,统一仲裁多轨系统必备
窗口检测的真正难点不在电路,在「上限阈值设在哪」

下限阈值设低了误判、设高了灵敏,好歹有负载跌落深度做参照;上限阈值的参照是「器件能耐受的最高电压」,而这个值往往与「正常工作的最高电压」之间只有很小余量——设得太贴近工作上限,电源瞬态(负载突变、浪涌)会频繁误判;设得太宽松,又起不到保护作用。工程做法:先取手册的绝对最大值与工作上限,再把阈值放在两者之间偏向工作上限的一侧,用第 8 章的抗扰测试验证瞬态不误判。上限阈值是「保护动作」不是「判决动作」,宁可漏报不可误报的场合,优先用切断供电代替拉复位。

3.3 迟滞与抗噪

第 1 章讲了迟滞的原理,这里讲落地。迟滞的大小按「电源在该电压附近的正常波动」定:把负载切换、开关纹波、耦合噪声的最大峰峰值量出来,迟滞间距取它的若干倍,保证任何单一噪声事件都不足以跨越整个迟滞区。抗噪的第二个手段是消抖时间(判决延时):电压越限后不立即动作,持续一段时间才判有效——欠压判决尤其需要,因为真跌落不会自己恢复,而毛刺会。第三个手段是监控器本体的电源抑制:监控电路自己的供电要与被监控轨同源且干净,否则「用带噪声的基准测噪声」。

抗噪手段解决的问题设计规则副作用(过大时)
迟滞(双阈值)阈值附近反复横跳间距大于电源正常波动释放电压抬高,恢复变慢
判决延时(消抖)窄毛刺误触发时长大于最宽毛刺、小于真跌落持续时间真跌落时反应变慢
监控器供电质量基准自身被污染监控供电独立或强滤波电路复杂度上升
监测点选择测到的不是真实电压靠近负载端,走线短与电源端结论差异要能解释
迟滞、消抖、窗口合法区:同一个思想的三张脸

把这三件事放在一起看:迟滞让电压判决有「记忆」(不许反复改判),消抖让判决有「耐心(不许立即改判),窗口看门狗让喂狗判决有「节奏(不许提前也不许落后)。本质都是把「瞬时值判决」改造成「事件判决」——模拟世界是连续的,任何用单点、瞬时、无记忆的判决去切连续量的设计,都是在请噪声替你决策。做复位设计时遇到「要不要加个延时 / 加个间距」的犹豫,答案永远是:加,然后按最坏值核算。

3.4 掉电检测与预警

掉电是上电的逆过程,但软件的处境难得多:上电时可以等,掉电时每一毫秒都在流失。掉电保护的第一道设计是「预警早于复位」——欠压预警阈值设在欠压拉复位阈值之上,VCC 跌落时软件先收到预警中断,此时距离真正掉电还有一段由储能电容决定的时间。这段时间叫保存窗口:窗口内要完成冲刷缓存、落盘关键数据、记录现场。窗口时长按「电容量 × 跌落前后的电压差 / 负载电流」量级估算,核算时取最小电容量(批次下限)与最大负载(最坏电流)。

预警中断里的动作要有优先级:先停非必要活动(降低电流、延长窗口),再冲刷关键数据,最后记录现场。反过来做——先记录再冲刷——是现场最常见的顺序错误:日志还没写完,电已经没了。

事件触发条件软件动作设计核算点
欠压预警中断VCC 跌破预警阈值停非必要任务,进入保存流程窗口 ≥ 最坏保存时间
保存窗口内预警后到掉电前冲刷脏数据,写关键记录电容下限 × 负载上限
欠压拉复位VCC 跌破拉复位阈值硬件复位,软件已无机会阈值间距决定窗口长短
掉电完成VCC 归零无(系统已停)静默期满足再上电要求
再上电VCC 重新建立按冷启动流程走半启动状态一律按未定义处理
「预警时间是器件白送的」是掉电设计最常见的想当然

预警窗口不是器件参数表里的一行字,而是「阈值间距 × 电源跌落速度 × 储能容量」三者凑出来的系统参数:阈值间距由监控芯片配置决定,跌落速度由负载与电源决定,储能容量由电容与漏电决定。任何一环按典型值核算,窗口就会在最坏情况下不够用——表现是「掉电保护做了,但每次掉电都丢一段数据」。核算动作只有一件:按最坏值算出窗口下限,再对照最坏保存时间,窗口不够就加电容、降负载或精简保存内容。第 8.4 节的边界扫描就是验证这个窗口的。

3.5 存储供电轨的监控点

存储系统的供电往往不止一条轨:主供电(VCC 一类)、接口供电(VCCQ 一类,部分器件可与 VCC 共轨)、编程电压(VPP 一类,高层数介质与特定操作才升起)。每条轨的监控职责不同,用一个「总电源好」信号概括所有轨,是存储系统监控设计的高频疏漏——总信号好不代表每条轨都在窗口内,更不代表它们之间的相对关系正确。

  • 主供电轨:欠压预警 + 欠压复位,窗口检测视系统成本可选。掉电方向是保护重点(缓存冲刷)。
  • 接口供电轨:与主轨可以共轨或分轨;分轨时独立监控,因为总线电平的半途掉电会让挂在总线上的器件看到未定义电平。
  • 编程电压轨:过压(介质损伤风险)与欠压(写不完整)都要看;关键是时序联动——写操作进行中撤除编程电压,等于制造一条半写完的记录,复位序列必须避开这种组合。
供电轨监控重点不监控的风险复位序列注意
主供电轨欠压预警 + 复位缓存冲刷没时间,丢数据预警中断内完成冲刷再放行
接口供电轨独立欠压检测总线半途掉电,未定义电平与主轨的掉电顺序要定义
编程电压轨过压 + 欠压双向写中途撤轨,半条记录写完成判据先于一切复位
多轨相对关系轨序与轨间延时倒灌与部分上电与上电时序专题共享时序图
禁用欠压监控:把「可控重启」变成「带病写入」

有一种「经验」在调试期很常见:掉电时欠压监控老是误触发,干脆把它关了,「反正能重启」。这个操作的实质是把系统的最后一次掉电从「有预警的软着陆」改成「无预警的硬跌落」——缓存里的脏数据再也没有冲刷机会,写在飞的操作再也没有完成判据,半条记录直接进介质。重启不可怕,可怕的是带着不一致状态重启:轻则下次启动修复半天,重则元数据损坏、设备无法挂载。正确出路是修误触发(加迟滞、加消抖、查监测点),不是关监控;关闭任何电压监控都必须走正式的偏差流程并有替代措施——这与第 10 章「绝不允许关看门狗」是同一条纪律的两个侧面。

本章小结:上电复位与电压监控的要点是三句话——电路形态按精度与成本三选一(内部 POR / RC / 监控芯片)、监控从单向下限走向窗口与多阈值、掉电保护的核心是「预警早于复位」且窗口按最坏值核算。下一章进入看门狗:两种形态的区别、喂狗的时机与纪律、超时的动作分级。

4. 看门狗机制

这一章把看门狗从「一个会复位的计数器」讲成一套纪律:窗口看门狗与独立看门狗各抓什么故障、喂狗点怎么设计、超时之后动作怎么分级、饥饿与误喂两种失效怎么防、死锁怎么检出。核心观点:看门狗的价值不在「会复位」,而在「喂狗时机是系统健康的证据」。

4.1 窗口看门狗与独立看门狗

两种看门狗的本质区别在「喂狗的合法条件」。独立看门狗(IWDG 一类)是一个自由递减的计数器:从重装载值开始往下减,减到零之前喂狗(重装载)即可,超时则复位。它只抓一类故障——「程序跑飞后不再喂狗」。它的时钟通常独立于系统主时钟(内置低速源一类),主时钟挂了它照样计时,这是它最大的价值。窗口看门狗(WWDG 一类)在计数器之外加了一个「窗口」:只有当计数器减到窗口值以下时,喂狗才被接受;窗口开启前喂狗,与超时不喂一样,都按 Fault 处理。它抓的是另一类更隐蔽的故障——「程序跑飞了但还在喂狗」(跑进一个自带喂狗的循环、或卡在不停进中断的路径上)。

维度独立看门狗(IWDG 一类)窗口看门狗(WWDG 一类)
计数方式自由递减,减到零超时递减,但有喂狗窗口约束
喂狗合法条件超时点之前任意时刻窗口开启后、超时点之前
过早喂狗无害(只是重装载)Fault,立即复位
能抓的故障跑飞后停喂 / 主时钟失效跑飞后仍在喂 / 停喂(全覆盖)
时钟来源常为独立低速时钟常与系统时钟同源
适用定位兜底:软件完全不可信时过程:软件「看似活着」时取证
两种看门狗不是二选一,是「一个抓死、一个抓假活」

常见误解是「用了窗口看门狗就不用独立看门狗」。两者覆盖的故障集不同:独立看门狗在主时钟失效时仍然有效(它的时钟独立),窗口看门狗能识别「喂得太规律但其实跑飞」。安全性要求高的系统两个都用:窗口看门狗做过程监控(早发现、早动作),独立看门狗做兜底(时钟失效也能拉复位)。资源紧张只能选一个时,选独立看门狗——它覆盖的是「完全不喂」这个最大概率的故障形态,且不依赖被监控系统的时钟。

4.2 喂狗时机与任务划分

喂狗点的设计原则只有一条:喂狗必须发生在「健康检查通过」之后,而不是健康检查之前。健康检查的内容至少包括:所有关键任务自上次喂狗以来都运行过(心跳推进)、没有任务阻塞超过预算、关键资源(存储写入队列)没有卡死。检查不过,就不喂——让看门狗超时,这正是它存在的意义。

按「谁来喂」分三种组织方式。单一健康任务:一个专职任务做检查并喂狗,审计点唯一,是最推荐的结构。多点喂狗:每个任务喂一口,问题是任何一个点的喂狗都会掩盖其他任务的死亡——除非每个点只对自己负责的任务背书。中断里喂狗:最坏的结构,中断的触发与主循环的健康无关,主循环死透了我行我素,看门狗却被喂得饱饱的。

喂狗组织结构能发现的故障风险
单一健康任务一任务检查全部 + 喂狗任一关键任务停摆即停喂健康任务自身死亡要靠独立看门狗兜底
多点喂狗各任务喂各自一口单点故障可见互相掩盖:A 任务活着喂不着 B 的死
中断内喂狗周期性中断直接喂几乎什么都发现不了主循环死透仍被喂,看门狗形同虚设
健康任务 + 独立狗窗口狗查过程,独立狗兜底健康任务自身死亡也可发现两套配置都要核算与测试
「超时时间调大一点就好了」与「调试期先关掉」是同一条歧途

超时误报的第一反应常常是调大超时时间,或者调试期干脆禁用看门狗。调大超时的本质是用「发现得晚」换「不误报」:真故障时系统多失控几秒甚至几十秒,带存储写入的系统里这几秒足够毁掉一次操作;禁用看门狗更不用提——那是把最后一道硬件防线拆了去迁就软件缺陷。正确顺序是:先查误报的根因(喂狗点被阻塞?窗口太窄?健康检查太慢?),再决定是修结构还是调参数。确需临时放宽的场景(如固件升级、初始化长流程),要走「临时放宽 + 自动恢复 + 记录留痕」的正式机制,不允许留一个「反正关了也没事」的永久状态。

4.3 超时动作分级

看门狗超时之后做什么?答案是「分级」——从最软的动作到最硬的动作排成阶梯(图 5),按系统安全需求选一级作为主动作。分级的第一原则是「软的优先、早的优先」:能在软件还活着时做的事(记录、保存、收敛),不要留给复位之后;能在超时点之前做的事(早期预警中断),不要等到超时之后。

五级动作的大致形态:L0 仅记录——超时计数累加进诊断区,不干预运行,用于调试期摸清系统的真实裕量;L1 早期预警中断——在超时点之前出中断,软件保存现场并尝试恢复,是生产配置的常见主动作;L2 强制保存后交还——进非屏蔽中断,停掉非关键任务,冲刷关键数据,再让后续动作发生,带缓存写入的系统必配;L3 硬件拉复位——软件已不可信,交还硬件判决,这是看门狗存在的根本理由;L4 收敛到安全态——复位后若连续超限(复位计数器越限),不再无脑重启,而是进入安全模式:限制输出、点亮指示、等待人工或远程处置。升级可以跳级,降级不允许——从 L1 退回 L0 需要正式的偏差流程。

超时动作分级:从「只记录」到「保持安全态」五级,软的优先、早的优先、逐级升级L0仅记录并累加超时计数进诊断区,不干预运行调试期:先让故障「看得见」L1早期预警中断超时点前出中断,软件保存现场常规配置的第一道软件动作L2强制保存后交还进非屏蔽中断,冲刷关键数据带缓存写入的系统必配L3硬件拉复位软件已不可信,交还硬件判决看门狗存在的根本理由L4收敛到安全态复位后连续超限则进安全模式反复重启的终点必须是安全态分级原则:能用软的不用硬的,能早动作不晚动作;升级可以跳过,降级不允许「关看门狗」不在任何一级里——那是把系统失控当处置手段,详见第 10 章
图 5 · 超时动作分级
动作级触发时机软件参与度适用场景主要风险
L0 仅记录超时计数累加无调试期、裕量摸底不干预,只用于观测
L1 预警中断超时点之前保存现场常规生产配置中断里做事有自身时限
L2 强制保存超时判定后、复位前冲刷关键数据带缓存写入的系统保存窗口可能不够
L3 硬件复位超时判定后无(已不可信)所有系统的兜底丢失未保存状态
L4 安全态收敛连续复位越限后最小集合反复重启的场景安全态设计不当会变砖
L4 是「反复重启」的唯一正确终点

没有 L4 的系统,遇到「上电即超时」类故障会无限重启——表现为「一直重启、从不工作、日志什么都留不下」。L4 的判据是一个复位计数器:每次非预期复位累加,正常启动后清零;计数越限(说明重启解决不了问题)就进安全模式。安全模式的最小集合:限制危险输出(写到存储的请求、执行机构动作)、保持诊断通道(指示灯、串口、记录区)、等待处置。安全态不是「放弃治疗」,是把「失控」降级成「可控地停」——第 7.5 节讲软件侧怎么配合,第 10.3 节讲怎么设计。

4.4 喂狗饥饿与误喂

喂狗相关的失效是成对出现的,方向相反、都会毁掉看门狗的可信度。饥饿:系统是健康的,但喂狗点被阻塞——健康任务优先级不够被高负载饿死、喂狗语句排在一个被死锁任务持有的互斥量后面、写日志的通道满了把健康任务挂住。饥饿的后果是「假超时」:看门狗杀死了健康的系统,团队对看门狗的信任开始崩塌,接下来的动作往往是调大超时或关掉——恶性循环的起点。误喂:系统已经死了,但喂狗还在继续——中断服务程序里喂狗、或者跑飞的程序恰好走进一个带喂狗的循环。误喂的后果是「假健康」:看门狗默许了一个死系统,故障以「功能不动但看门狗不报警」的形式暴露,排查时所有人的第一反应都是「看门狗没开吧」。

失效模式系统真实状态看门狗表现根因(常见)对策
喂狗饥饿健康误超时(假故障)健康任务被阻塞 / 优先级倒挂喂狗路径最短化 + 独立狗兜底
喂狗误喂已死 / 跑飞不超时(假健康)中断内喂狗 / 跑进带喂狗的循环窗口看门狗 + 喂狗点审计
窗口过窄健康误判「过早喂狗」窗口窄于健康任务的最坏抖动窗口按最坏抖动核算后加余量
超时过松已死超时太晚才发现用调大超时掩盖误报查误报根因,不调参数
喂狗路径上的一切等待,都是看门狗的盲区

饥饿的教训可以浓缩成一句:喂狗语句到计数器之间的路径上,不允许有任何「等」——不等互斥量、不等队列、不等日志通道、不等任何可能被别的任务持有的资源。健康检查可以等(它本来就是检查),喂狗动作不能等。实现上常见的做法是把「检查」与「喂狗」分离:检查在任何上下文里做,喂狗只在一个最小的、优先级受保护的上下文里发生。评审喂狗代码时逐行问一句「这行会不会等」,问完饥饿问题就解决了一半。

4.5 死锁检测设计

比「任务挂死」更难发现的是「死锁」:两个或多个任务互相等待对方持有的资源,系统看起来每个任务都在运行(都在等待里挂着),看门狗如果只查「任务有没有跑过」,可能全部通过——死锁的任务们确实都「跑过」。死锁检测要在心跳之外加两层。第一层:任务时限监控——每个关键任务声明自己的执行预算(最坏完成时间),健康任务检查「上次完成到这次完成的间隔」是否超过预算的数倍;死锁的任务间隔会持续增长。第二层:资源持有监控——关键互斥量记录持有者与持有时长,超过预算即标记;这条能直接指向「谁拿着不放」。

存储系统还有专属的一层:在写操作监控——写操作从开始到完成有正常时长分布,一次写得异常久(远超最坏值)本身就是卡死信号,此时不仅要报看门狗,还要给「写完成判据」一个出口——决定这次写是等、是重试、还是放弃并标记介质。三层合起来,覆盖「挂死」「死锁」「卡在在写操作」三类软件故障形态。

检测层检查对象发现什么实现要点
任务心跳关键任务的运行计数任务停摆(挂死)心跳数组 + 健康任务巡检
任务时限完成间隔 vs 执行预算任务卡住(阻塞 / 死锁)预算按最坏路径核算
资源持有互斥量持有者与时长死锁的「持方」持有超时即标记并记录现场
在写监控存储写操作时长写流程卡死与写完成判据联动,给出口
死锁检测的实用近似:不建等待图,只测「该动的没动」

教科书式的死锁检测要建资源等待图、跑环路检测算法——在嵌入式系统里这套东西太重,而且它自己也可能成为故障源。工程近似更简单:每个关键实体(任务、队列、在写操作)配一个「该死线前必须推进」的检查,没推进就记一笔,连续多笔没推进就升级动作。这个近似抓不到所有死锁,但能抓到「导致系统不前进」的死锁——而那正是看门狗该管的那一类。检测逻辑自身要保持简单:监控系统的复杂度必须显著低于被监控系统,否则监控系统先死,是个黑色幽默。

本章小结:看门狗的要点是四句话——窗口狗抓「假活」、独立狗抓「真死」,喂狗必须发生在健康检查之后,超时动作分级且软的优先,饥饿与误喂都靠「喂狗路径无等待 + 喂狗时机有窗口」来防。下一章离开片内监控,讲外部复位:按键、监控芯片、引脚默认电平与多主协商。