AVR&Arduino|看门狗定时器(Watch Dog Timer)的使用

AVR&Arduino|看门狗定时器(Watch Dog Timer)的使用

看门狗的作用:

一般我们给看门狗一个数值,程序开始运行后看门狗就开始倒计时。 如果程序运行正常,过一段时间CPU应该发出指令让看门狗复位,令其重新开始倒计数。 如果看门狗计数减到0,它就认为程序没有正常工作(因为没有及时复位),就强制整个系统复位(单片机重启)。所以,当你开启看门狗后,需要在看门狗超时(计数减到0)前,对其进行 喂狗(复位)操作,否则看门狗会强制你的单片机重启,从头运行程序。

下面我们以arduino为例来看一下看门狗的简单应用

看门狗其实就是一个计数器,Arduino的ATmega328p芯片关于看门狗定时器的介绍在datasheet的10.6章节讲到的。具体我们就不看寄存器的设置了,我们直接看一下看门狗在arduino的应用了。

1.虽然Arduino核心库并未提供看门狗相关的API,但AVRGCC提供了相应的API支持。我们常用的就这几个:

使用看门狗需要引用头文件 【 avr/wdt.h 】,在wdt.h中,提供了3个看门狗API:

  • wdt_enable(timeout) //看门狗启动,并设置超时时间

wdt_enable(timeout) 中timeout可使用如下常量:

AVR&Arduino|看门狗定时器(Watch Dog Timer)的使用

  • wdt_disable() //看门狗停止

  • wdt_reset() //看门狗复位(喂狗)

2.在arduino中的使用也非常的简单,只需要做下面三步即可:

  • 引用头文件 #include avr/wdt.h

  • Setup函数中启动看门狗,并设置超时时间为两秒:wdt_enable(WDTO_2S);

  • Loop函数中喂狗,防止饿死(重启): wdt_reset();

AVR&Arduino|看门狗定时器(Watch Dog Timer)的使用

3.说到这里,我们知道还有一个软启动:这个要区分一下

软启动来解决系统启动问题,效率比看门狗要高,只是启动后,寄存器和内存变量的值不变:

  • asm volatile (" jmp 0");

就一条指令。这个也会用到的。

看门狗中断的应用

利用看门狗进行休眠唤醒,我们不喂狗。当看门狗超时后,执行唤醒函数,而不是重启单片机。

看一下看门狗的中断入口:

AVR&Arduino|看门狗定时器(Watch Dog Timer)的使用

我们来实现一个1s一次的闪烁:

AVR&Arduino|看门狗定时器(Watch Dog Timer)的使用

跑一个试试,其实就是一个计数器了,led一秒一次闪烁了。其实吧,也不需要把寄存器弄的特别清楚,我们知道怎么用就好了,核心代码知道怎么灵活的移植就好了。当然要了解ATmega328p相关寄存器,可以去看我以前的ATmega328p系列教程。


分享到:


相關文章: