看门狗(Watchdog Timer,WDT)是嵌入式系统里最经典的可靠性自保机制:一个独立运行的定时器,程序必须定期「喂狗」(复位计数器),否则定时器溢出时就把系统强制复位。它的目标是让跑飞、死锁的嵌入式设备自动恢复,而不是一直卡死。

一句话定位

看门狗 = 一个「你不按时喂我,我就重启你」的定时器,是嵌入式系统的安全气囊。

知识体系

flowchart TD
    A[看门狗] --> B[基本原理]
    A --> C[类型]
    A --> D[使用要点]
    A --> E[相关问题]

    B --> B1["独立定时器计数"]
    B --> B2["喂狗: 复位计数器"]
    B --> B3["超时: 触发系统复位"]

    C --> C1["独立看门狗 IWDG"]
    C --> C2["窗口看门狗 WWDG"]
    C --> C3["外部看门狗芯片"]

    D --> D1["喂狗时刻要合理"]
    D --> D2["多任务分别喂狗"]
    D --> D3["复位后记录原因"]

    E --> E1["喂狗太频繁形同虚设"]
    E --> E2["在主循环喂狗容易漏喂"]
    E --> E3["死循环导致反复复位"]

核心要点

  • 原理:看门狗内部有一个向下计数的定时器,只要在溢出前「喂狗」就清零重来;一旦程序跑飞没来得及喂,计数器溢出就触发复位。
  • 独立看门狗(IWDG):用独立时钟源(如 STM32 的 LSI),即使主时钟挂了它也能工作,是最可靠的兜底。
  • 窗口看门狗(WWDG):不仅要求「别太晚喂」,还要求「别太早喂」——喂狗必须在时间窗口内,能捕捉到程序跑得太快的异常。
  • 外部看门狗芯片:如 TPS3813、MAX6369,独立于 MCU 之外,可靠性更高,用于安全等级高的场合。
  • 正确用法:
    • 喂狗时间要略大于最坏情况下一个完整循环的耗时;
    • 推荐在多个关键任务都正常执行时才喂狗,避免「只要主循环活着就算健康」;
    • 在 STM32 上常用 RTOS 的空闲任务或独立任务喂狗。
  • 常见坑:把喂狗放在主循环里,一旦某段代码死循环但主循环没退出,看门狗反而被喂活了——这是设计缺陷。
  • 复位溯源:读 STM32 的 RCC_CSR 寄存器判断是否看门狗复位,便于现场诊断。

相关