理解看门狗定时器:如何防止单片机死机卡死
组件与材料
- Arduino UNO × 1
软件与在线服务
- Arduino IDE
项目简介
单片机陷入死循环或因软硬件故障卡死时,常规排查只能按复位键。但能否让硬件自动复位?答案是看门狗定时器(Watchdog Timer, WDT)。
“看门狗定时器是一种硬件定时器,若主程序未按时喂狗(服务),自动触发系统复位,用于自动恢复因软硬件故障卡死的嵌入式设备。”(来源:os.mbed.com/cookbook/WatchDog-Timer)
喂狗原理
如同养狗需定时喂食,否则会咬人。主程序 loop() 循环运行,启用 WDT 并设定超时时间大于主循环最大耗时。每次循环调用 wdt_reset() 喂狗。若程序卡死未喂狗,WDT 计数归零触发复位中断,单片机重启。

Arduino UNO 搭载 ATmega328P,内置看门狗定时器。

库文件
#include <avr/wdt.h>
启用看门狗
wdt_enable(WDTO_时间);
可选超时:15ms、30ms、60ms、120ms、250ms、500ms、1s、2s、4s、8s(对应 WDTO_15MS 至 WDTO_8S)。

示例:wdt_enable(WDTO_4S); 启用 4 秒看门狗。
喂狗(复位计数器)
wdt_reset();
置于 loop() 中。若某 delay() 超过 WDT 超时,需在 delay 前喂狗,否则复位发生在 delay 完成前。
禁用看门狗
wdt_disable();
示例代码
#include <avr/wdt.h>
void setup() {
Serial.begin(9600);
Serial.println("Setup started :");
delay(2000); // 启动延时,完成初始化再喂狗
wdt_enable(WDTO_4S); // 启用 4 秒看门狗
}
void loop() {
Serial.println("LOOP started !");
for (int i = 0; i <= 5; i++) {
Serial.print("Loop : ");
Serial.print(i);
Serial.println();
delay(1000);
wdt_reset(); // 每秒喂狗
}
// 人为制造死循环,触发看门狗复位
while (1) {}
}
运行现象

程序运行 5 次循环后进入 while(1) 死循环,约 4 秒后看门狗触发复位,串口重复打印 “Setup started :” 与前 5 次循环,验证看门狗有效。
欢迎在评论区留下反馈、提问与讨论。
完整代码
#include <avr/wdt.h>
void setup() {
Serial.begin(9600);
Serial.println("Setup started :");
delay(2000);
wdt_enable(WDTO_4S);
}
void loop() {
Serial.println("LOOP started !");
for (int i = 0; i <= 5; i++) {
Serial.print("Loop : ");
Serial.print(i);
Serial.println();
delay(1000);
wdt_reset();
}
while (1) {}
}
制造工艺