按这几步走!搞定在AVR Arduino 板上配置看门狗定时器!

按这几步走!搞定在AVR Arduino 板上配置看门狗定时器!

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

本文详细介绍了在Arduino平台上如何使用看门狗定时器来增强嵌入式项目的可靠性和安全性。文章首先解释了看门狗定时器的基本原理,随后阐述了其在Arduino项目中的常见用途。针对AVR架构的Arduino板(如Uno),文章提供了具体的配置和使用方法。此外,还介绍了适用于跨平台开发的Adafruit SleepyDog库,该库简化了看门狗定时器的使用,提供了更精细的超时设置和统一的接口。

独立定时器(如 Arduino 的看门狗定时器)在嵌入式软件开发中发挥着关键作用。它们对于确保事件触发的准确性、系统的可靠性和安全性至关重要。本文将解释看门狗定时器的基本原理,以及如何利用它来构建更具韧性的 Arduino 项目。

什么是看门狗定时器?

在嵌入式系统中,看门狗定时器是一种由独立低频时钟驱动的轻量级电路。通过特殊的控制寄存器可以配置定时器是否激活以及超时时间。一旦启动,这些简单的单元会计数直到达到预设的超时值,此时会触发一个可配置事件,除非用户程序在此之前重置它。

该事件可以是自定义的中断函数,或更常见的是触发嵌入式应用的重启。看门狗定时器独立于 CPU 运行,即使 CPU 出现错误循环或故障状态,它也不会卡死,因此可以充当自动守护者,在系统挂起时重置系统。

Arduino 看门狗定时器的常见用途

看门狗定时器的经典应用是防止 CPU 因程序崩溃或卡死而无限停滞。在这种情况下,定时器像守护犬一样保护 CPU,避免无限挂起。程序必须定期重置定时器(俗称“喂狗”),以防止系统在达到超时阈值后自动重启。

在 Arduino 板上,看门狗定时器还可以作为相对精确、可配置的硬件定时器,用于触发用户定义的中断方法,独立于 CPU 时钟。实际应用包括定期发送消息或按特定间隔切换 GPIO 引脚。

一些 MCU 提供低功耗模式,大幅降低设备功耗,从而延长电池供电系统的运行时间。在这些设备中,可配置定时器常用于唤醒处于低功耗模式的设备。

在 AVR 板上使用 Arduino 看门狗

在大多数情况下,在自定义项目中使用看门狗定时器涉及底层硬件访问,因此具体方法可能因目标平台而略有不同。但基本流程包含三个步骤:

  1. 在程序启动时激活并配置看门狗。通常建议在程序启动后立即重置定时器,以防止无限重启循环。
  2. 在 AVR 架构的 Arduino 板(如 Uno)上,这一步尤为重要,因为它们的看门狗在激活或关闭时不会自动重置。
  3. 在主循环中,程序必须定期重置定时器,以防止自动重启。

示例代码:

#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

按照突出显示的步骤,在 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 WeChat QR Code

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

头像
得捷电子

评论已关闭。

Copyright©DigiKey Electronics