看门狗定时器(WDT:Watch Dog Timer)实际上是一个计数器。
一般给看门狗一个大数,程序开始运行后看门狗开始倒计数。
如果程序运行正常,过一段时间CPU应该发出指令让看门狗复位,令其重新开始倒计数。
如果看门狗计数减到0,就认为程序没有正常工作(因为没有及时复位),就强制整个系统复位(单片机重启)。
所以,当你开启看门狗后,需要在看门狗超时(计数减到0)前,对其进行 喂狗(复位)操作,否则看门狗会强制你的单片机重启,从头运行程序。
如果看门狗在休眠或空闲模式下超时,器件将唤醒并从PWRSAV指令执行处继续执行代码,同时“休眠”状态位(RCON<3>)或“空闲”状态位(RCON<2>)会置1,表示器件之前处于省电模式。
功能作用:看门狗可以在你的程序陷入死循环的时候,让单片机复位而不用整个系统断电,从而保护你的硬件电路。
使用看门狗需要引用头文件 【 avr/wdt.h 】,在wdt.h中,提供了3个看门狗API:
wdt_enable(timeout) //看门狗启动,并设置超时时间
wdt_disable() //看门狗停止
wdt_reset() //看门狗复位(喂狗)
wdt_enable(timeout) 中timeout为超时时间,当超过这个时间后没有喂狗,则单片机重启。
这个时间可使用如下常量:
// 0=15(16)ms, 1=30(32)ms,2=60(64)ms,3=120(128)ms,4=250ms,5=500ms
// 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
0、WDTO_15MS: 看门狗定时器15ms超时
1、WDTO_30MS: 看门狗定时器30ms超时
2、WDTO_60MS:看门狗定时器60ms超时
3、WDTO_120MS: 看门狗定时器120ms超时
4、WDTO_250MS: 看门狗定时器250ms超时
5、WDTO_500MS: 看门狗定时器500ms超时
6、WDTO_1S: 看门狗定时器1S超时
7、WDTO_2S: 看门狗定时器2S超时
8、WDTO_4S: 看门狗定时器4S超时
9、WDTO_8S: 看门狗定时器8S超时
使用看门狗很简单,只需要做下面三步即可:
1、引用头文件 #include avr/wdt.h
2、Setup函数中启动看门狗,并设置超时时间为两秒:wdt_enable(WDTO_2S);
3、Loop函数中喂狗,防止饿死(重启): wdt_reset();
代码如下:

#include <avr/wdt.h> 
int ledPin = 13;
void setup() { 
  pinMode(ledPin, OUTPUT);  
  //启动看门狗,设置喂狗时间不能超过2秒 
  wdt_enable(WDTO_2S);     
void loop() 

  digitalWrite(ledPin, HIGH);   
  delay(500);    
  digitalWrite(ledPin, LOW);   
  //喂狗。如果超过2S没有喂狗,则单片机重启。
  //也就是说,如果本循环执行时间超过2S的话,单片机就会自动重启。
  wdt_reset();   
}
其它应用:
【利用看门狗进行休眠唤醒】
用下面的代码,代替wdt_enable(),并且不要喂狗。
这样就实现了看门狗超时后,执行唤醒函数,而不是重启单片机。
void wdt_setup(int ii) {
      // ii为看门狗超时时间,支持以下数值:
      // 0=16毫秒, 1=32毫秒,2=64毫秒,3=128毫秒,4=250毫秒,5=500毫秒
      // 6=1秒 ,7=2秒, 8=4秒, 9=8秒
      byte bb;
      if (ii > 9 ) ii = 9;
      bb = ii & 7;
      if (ii > 7) bb |= (1 << 5);
      bb |= (1 << WDCE);
      //开始设置看门狗中断  
      MCUSR &= ~(1<<WDRF);  //清除复位标志
      WDTCSR |= (1<<WDCE) | (1<<WDE);
      //设置新的看门狗超时时间
      WDTCSR = bb;
      //设置为定时中断而不是复位
      WDTCSR |= _BV(WDIE);
      //别忘了设置【看门狗唤醒执行函数】
}
看门狗唤醒执行函数:
ISR(WDT_vect){
                  //唤醒后执行的代码
}

Arduino - 看门狗定时器(WDT:Watch Dog Timer)的更多相关文章

  1. N76E003之WDT(看门狗定时器)

    N76E003提供一个看门狗定时器(WDT),它可以配置成一个超时复位定时器用于复位整个设备.一旦由于外界干扰设备进入非正常状态或挂起,看门狗可以复位恢复系统.这有用于监测系统运行以提高系统可靠性.对 ...

  2. [ZigBee] 12、ZigBee之看门狗定时器——饿了就咬人的GOOD DOG

    引言:硬件中的看门狗,不是门卫的意思,而是一只很凶的狗!如果你不按时喂它,它就会让系统重启!这反而是我们想要的功能~ 1.看门狗概述 看门狗定时器(WDT,Watch Dog Timer)是单片机的一 ...

  3. 给NIOS II CPU增加看门狗定时器并使用

    给NIOS II CPU增加看门狗定时器并使用   配置看门狗定时器: 设置计时溢出时间为1秒 计数器位宽为32位 勾选No Start/Stop control bits 勾选Fixed perio ...

  4. 【小梅哥SOPC学习笔记】给NIOS II CPU增加看门狗定时器并使用

    给NIOS II CPU增加看门狗定时器并使用 配置看门狗定时器: 1. 设置计时溢出时间为1秒 2. 计数器位宽为32位 3. 勾选No Start/Stop control bits 4. 勾选F ...

  5. S5PV210时钟,看门狗定时器

    晶振:时钟源(操作主要有两个,倍频,分频) A8的时钟源: 时钟域,每个时钟域(不同的最高频率和最低频率)管理着不同的电路模块: 不同的时钟域对应不同电路模块表 时钟电路:懂得看时钟电路(时钟源选择开 ...

  6. 突然地心血来潮,为 MaixPy( k210 micropython ) 添加看门狗(WDT) C 模块的开发过程记录,给后来的人做开发参考。

    事情是前几天群里有人说做个看门狗不难吧,5分钟的事情,然后我就怼了几句,后来才发现,原来真的没有看门狗模块鸭. 那好吧,那我就写一下好了,今天是(2020年4月30日)想着最后一天了,不如做点什么有价 ...

  7. LPC1768的看门狗定时器使用

    void wwdg_init(void) { LPC_SC->PCLKSEL0 |= (3<<0);//分频数为八分频 LPC_WDT->WDCLKSEL &= ~(3 ...

  8. Arduino 看门狗使用

    1.需要调用 #include <avr/wdt.h> 2.设置看门狗复位时间 wdt_enable(WDTO_2S); 代码时间定义的底层查看 #define WDTO_15MS 0 / ...

  9. Tiny4412中断之看门狗

    一:看门狗(WDT watch dog timer) 看门狗其实是一个计数器,它的作用就是防止程序陷入死循环或者程序运行跑飞:看门狗是一个硬件,它的工作原理是,初始化给他一个值,它会过一段时间减一,直 ...

随机推荐

  1. 「SPOJ1487」Query on a tree III

    「SPOJ1487」Query on a tree III 传送门 把树的 \(\text{dfs}\) 序抠出来,子树的节点的编号位于一段连续区间,然后直接上建主席树区间第 \(k\) 大即可. 参 ...

  2. jstl.jar下载

    jakarta开源java项目 http://attic.apache.org/projects/jakarta.html 根据其官网信息项目已于2011年退休. 不过上面官方链接可以点击Downlo ...

  3. 110、Java中String类之字符串文本拆分

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  4. Linux centosVMware su命令、sudo命令、限制root远程登录

    一.su命令 Linux系统中有些事情只有root用户才能做,普通用户不能做,这时候就需要临时切换到root身份了. [root@davery ~]# whoamiroot [root@davery ...

  5. d3基本图形

                                             柱状图                                   散点图.气泡图               ...

  6. 【替代语法】PHP中冒号、endif、endwhile、endfor这些都是什么

    我们经常在wordpress一类博客程序的模板里面看到很多奇怪的PHP语法,比如: <?php if(empty($GET_['a'])): ?><font color=" ...

  7. 「BJWC2012」冻结

    传送门 Luogu 解题思路 分层图最短路,层与层之间的边的边权减半,然后就是板子了. 细节注意事项 咕咕咕. 参考代码 #include <algorithm> #include < ...

  8. WinCC V7.5安装过程截图

  9. 吴裕雄--天生自然JAVAIO操作学习笔记:内存操作流、管道流与打印流操作

    import java.io.* ; class Send implements Runnable{ // 线程类 private PipedOutputStream pos = null ; // ...

  10. gym 101911

    A. Coffee Break 题意:每天有m小时,你喝咖啡需要花一小时,你想在n个时刻都喝过一次咖啡,老板规定连续喝咖啡的间隔必须是d以上,求最少需要多少天才能喝够n次咖啡,并输出每个时刻第几天喝. ...