关键词:看门狗定时器,嵌入式软件,MCU

本文详细介绍了在Arduino平台上如何使用看门狗定时器来增强嵌入式项目的可靠性和安全性。文章首先解释了看门狗定时器的基本原理,随后阐述了其在Arduino项目中的常见用途。针对AVR架构的Arduino板(如Uno),文章提供了具体的配置和使用方法。此外,还介绍了适用于跨平台开发的Adafruit SleepyDog库,该库简化了看门狗定时器的使用,提供了更精细的超时设置和统一的接口。
独立定时器(如 Arduino 的看门狗定时器)在嵌入式软件开发中发挥着关键作用。它们对于确保事件触发的准确性、系统的可靠性和安全性至关重要。本文将解释看门狗定时器的基本原理,以及如何利用它来构建更具韧性的 Arduino 项目。
什么是看门狗定时器?
在嵌入式系统中,看门狗定时器是一种由独立低频时钟驱动的轻量级电路。通过特殊的控制寄存器可以配置定时器是否激活以及超时时间。一旦启动,这些简单的单元会计数直到达到预设的超时值,此时会触发一个可配置事件,除非用户程序在此之前重置它。
该事件可以是自定义的中断函数,或更常见的是触发嵌入式应用的重启。看门狗定时器独立于 CPU 运行,即使 CPU 出现错误循环或故障状态,它也不会卡死,因此可以充当自动守护者,在系统挂起时重置系统。
Arduino 看门狗定时器的常见用途
看门狗定时器的经典应用是防止 CPU 因程序崩溃或卡死而无限停滞。在这种情况下,定时器像守护犬一样保护 CPU,避免无限挂起。程序必须定期重置定时器(俗称“喂狗”),以防止系统在达到超时阈值后自动重启。
在 Arduino 板上,看门狗定时器还可以作为相对精确、可配置的硬件定时器,用于触发用户定义的中断方法,独立于 CPU 时钟。实际应用包括定期发送消息或按特定间隔切换 GPIO 引脚。
一些 MCU 提供低功耗模式,大幅降低设备功耗,从而延长电池供电系统的运行时间。在这些设备中,可配置定时器常用于唤醒处于低功耗模式的设备。
在 AVR 板上使用 Arduino 看门狗
在大多数情况下,在自定义项目中使用看门狗定时器涉及底层硬件访问,因此具体方法可能因目标平台而略有不同。但基本流程包含三个步骤:
- 在程序启动时激活并配置看门狗。通常建议在程序启动后立即重置定时器,以防止无限重启循环。
- 在 AVR 架构的 Arduino 板(如 Uno)上,这一步尤为重要,因为它们的看门狗在激活或关闭时不会自动重置。
- 在主循环中,程序必须定期重置定时器,以防止自动重启。
示例代码:
#include <avr/wdt.h>
void setup() {
wdt_enable(WDTO_4S);
wdt_reset();
}
void loop() {
delay(2500); // Simulate some task
wdt_reset();
}
此示例导入 AVR 看门狗库,并在 setup 函数中启用看门狗定时器,超时时间设为 4 秒。注意,标准 AVR 库提供从 16 毫秒到 8 秒的预设超时值。
看门狗定时器也可以用于周期性调用中断服务程序(ISR):
#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>
volatile bool ledState = false;
ISR(WDT_vect) {
ledState = !ledState;
}
void createWatchdogInterrupt(void) {
cli();
wdt_reset();
WDTCSR |= (1 << WDCE) | (1 << WDE);
WDTCSR = (1 << WDIE) | (1 << WDP2) | (1 << WDP1);
sei();
}
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
createWatchdogInterrupt();
}
void loop() {
digitalWrite(LED_BUILTIN, ledState);
}
Arduino 看门狗定时器库
上述底层方法仅适用于基于 AVR 的 Arduino 板(如 Nano 和 Uno)。其他平台需要适配代码或使用现成的库,例如 Adafruit SleepyDog,它支持多种 MCU。
安装方法:在 Arduino IDE 的库管理器中搜索并安装 Adafruit SleepyDog。

该库提供与 AVR API 相同的基本功能,但允许更精细的超时设置,不需要在 setup 中重置,并且提供跨平台的统一接口。
示例代码:
#include <Adafruit_SleepyDog.h>
void setup() {
Watchdog.enable(4000);
}
void loop() {
delay(2500); // 模拟任务
Watchdog.reset();
}
需要注意的是,SleepyDog 不支持 ISR 回调,仅支持重置功能,并且受限于硬件的最大超时时间(如 AVR 平台的 8 秒)。
总结
看门狗是 MCU 内置的独立定时器,用于监控嵌入式程序。它主要用于防止程序卡死、运行周期性任务,以及在支持的情况下唤醒低功耗模式下的 MCU。
在 AVR Arduino 上,看门狗通过底层 API 控制,超时范围为 16 毫秒至 8 秒。启用后,程序必须在循环中定期重置它。对于跨平台开发,Adafruit SleepyDog 库提供了更简单的接口,但仅支持重置功能。
如有问题或想进一步交流,欢迎在 DigiKey 的 TechForum 技术社区继续讨论。
小编的话:
如文章所介绍,作为提升系统可靠性的“自动救生员”,看门狗定时器是一个独立的硬件级保险机制,用于监控程序运行状态,防止系统因软件故障(如死循环、程序跑飞)而永久挂起 。您是否也正在为项目配置使用文中提到的看门狗定时器?您对相关流程有哪些经验或疑问?欢迎留言,和DigiKey的朋友们一起分享交流!
******
如有任何问题,欢迎联系得捷电子DigiKey客服团队。
中国(人民币)客服
- 400-920-1199
- service.sh@digikey.com
- QQ在线实时咨询 |QQ号:4009201199
中国(美金)/ 香港客服
- 400-882-4440
- 8523104-0500
- china.support@digikey.com

到微信搜寻“digikey”或“得捷电子”
关注我们官方微信
并登记成会员,
每周接收工程师秘技,
赚积分、换礼品、享福利
