看门狗定时器基础:工作原理、独立看门狗与窗口看门狗的区别、超时时间计算

各位工程师朋友,咱们今天聊聊看门狗。说实话,这玩意儿在嵌入式系统里就像个「保安」——平时你感觉不到它存在,但一旦系统跑飞了,它立马跳出来把系统拉回来。

我最早接触看门狗是在做一款输液泵的时候。那会儿刚入行,觉得看门狗就是个定时器,随便配配就行。结果呢?设备在临床测试时突然死机,护士怎么按都没反应。后来一查,是看门狗配置不当,系统卡死在某个循环里,但看门狗还在傻傻地喂狗。嗯,从那以后,我再也不敢小看这个「保安」了。

看门狗的工作原理

看门狗定时器,说白了就是一个会「咬人」的计数器。

它的工作流程很简单:

  • 启动后,计数器从某个值开始递减
  • 正常运行时,程序必须在计数器归零前「喂狗」(重置计数器)
  • 如果程序跑飞或卡死,没人喂狗,计数器归零
  • 归零那一刻,看门狗触发系统复位

你想想看,这就像你养了条狗,每隔一段时间得扔块肉给它。你要是忙忘了,它就咬你一口——当然,这里的「咬」是复位系统。

我个人习惯把看门狗看作系统的「最后一道防线」。它不负责诊断问题,只负责在问题发生时让系统重新来过。所以,看门狗的配置必须足够保守,不能太灵敏,也不能太迟钝。

核心要点:看门狗不是用来防止故障的,而是用来在故障发生后让系统恢复的。这是本质区别。

独立看门狗 vs 窗口看门狗

很多初学者搞不清这两种看门狗的区别。我当年也迷糊过一阵子。其实它们的区别很直观:

特性 独立看门狗(IWDG) 窗口看门狗(WWDG)
时钟源 独立的内部RC振荡器(约40kHz) 系统时钟(APB1)
喂狗时机 只要在超时前喂就行 必须在特定时间窗口内喂
精度 较低(RC振荡器有温漂) 较高(依赖系统时钟)
典型应用 对时间精度要求不高的场景 需要精确时序控制的场景
复位条件 计数器归零 计数器归零 或 过早喂狗

独立看门狗,我习惯叫它「懒人看门狗」。为什么?因为它只要求你在超时前随便什么时候喂狗都行。它的时钟来自内部RC振荡器,即使主时钟挂了,它照样能工作。这在主时钟失效的场景下特别有用。

我在做一款工业控制器时遇到过这种情况:现场强电磁干扰导致主晶振停振,系统直接瘫痪。但独立看门狗用的是内部RC,它检测到主时钟异常后,直接复位了系统。等复位完成,晶振又恢复正常了。你说巧不巧?

窗口看门狗就严格多了。它不光要求你不能喂得太晚,还要求你不能喂得太早。为什么会有这种设计?

你想想看,如果程序卡死在某个循环里,但这个循环恰好一直在喂狗,独立看门狗就失效了。窗口看门狗解决了这个问题——它规定了一个「窗口期」,你只能在窗口期内喂狗。喂早了算你违规,照样复位。

我的建议:如果系统对安全要求高(比如医疗设备),优先考虑窗口看门狗。如果系统可能面临主时钟失效的风险,再加一个独立看门狗做备份。两个一起用,效果最好。

超时时间计算

超时时间计算,说白了就是算「多久不喂狗,系统会被复位」。

对于独立看门狗,公式很简单:

超时时间 = (预分频系数 × (重装载值 + 1)) / 时钟频率

以STM32为例,独立看门狗的时钟频率通常是40kHz(内部RC)。预分频系数可选4、8、16、32、64、128、256。重装载值范围是0到4095。

举个例子:

预分频系数 = 64
重装载值 = 625
时钟频率 = 40kHz

超时时间 = (64 × (625 + 1)) / 40000
         = (64 × 626) / 40000
         = 40064 / 40000
         ≈ 1.0016秒

嗯,差不多1秒。我一般会留点余量,比如主循环执行时间约200ms,我会把超时时间设在500ms到800ms之间。太短了容易误复位,太长了又起不到保护作用。

对于窗口看门狗,计算稍微复杂一点:

超时时间 = (预分频系数 × (计数器值 + 1)) / 时钟频率

窗口看门狗的计数器是7位的(0到127),预分频系数通常是1、2、4、8。时钟来自APB1,一般是36MHz或42MHz。

举个例子:

预分频系数 = 8
计数器值 = 100
时钟频率 = 36MHz

超时时间 = (8 × (100 + 1)) / 36000000
         = (8 × 101) / 36000000
         = 808 / 36000000
         ≈ 22.44微秒

等等,22微秒?这也太快了吧!

别急,窗口看门狗的超时时间确实很短,它通常用于检测微秒级的时序异常。如果你需要更长的超时时间,可以增大预分频系数或计数器值。

我曾经踩过的坑:独立看门狗的时钟是RC振荡器,温度变化会导致频率漂移。在-40°C到85°C范围内,频率可能偏差±10%甚至更多。所以计算超时时间时,一定要留够余量。我一般会按最差情况(频率最高)来计算,确保即使在极端温度下也不会误复位。

实际配置建议

说了这么多理论,咱们来点实际的。我个人习惯的配置流程是这样的:

  1. 先测主循环执行时间——用GPIO翻转法,示波器一抓就知道
  2. 确定安全裕量——一般取主循环时间的1.5到2倍
  3. 选择看门狗类型——医疗设备我必用窗口看门狗
  4. 计算预分频和重装载值——按公式算,留余量
  5. 实测验证——故意制造死循环,看能不能正确复位

最后一步特别重要。我见过太多工程师配好看门狗就完事了,从来不验证。结果呢?要么看门狗根本没起作用,要么动不动就误复位。

嗯,今天就聊到这儿。下节课咱们讲讲看门狗在医疗设备中的具体应用案例,包括如何设计喂狗策略、如何处理看门狗中断等。到时候我会分享一个我在呼吸机项目中的实战经验,那个案例挺有意思的。

一句话总结:看门狗是系统的「最后一道防线」,独立看门狗保底,窗口看门狗保时序,两者配合使用效果最佳。超时时间计算要留余量,更要实测验证。