熊猫阿宝

中级会员
  • 主题:19
  • 回复:49
  • 金钱:317
  • 积分:376
本帖最后由 熊猫阿宝 于 2015-5-21 19:40 编辑

Arduino看门狗深入探索
    看门狗定时器WatchDog Timer)一般分为硬件看门狗和软件看门狗。硬件看门狗采用外部的看门狗芯片,利用单片机的定时器,若在规定时间内没有对定时器复位,看门狗芯片将使系统复位。而一般常用的是软件看门狗,AVR的单片机有看门狗定时器,用起来很方便。
    对于Arduino,首先我们要注意的是,Arduino的官方BootLoader不支持看门狗。笔者在初学Arduino的时候就看门狗问题纠结了很久,后来才发现是不兼容导致的,具体原因请看最后。虽然Arduino不支持看门狗,但是其底层的AVRGCC提供相应的API函数支持,我们可以直接调用。
    使用看门狗之前需要包含的头文件:
[C] 纯文本查看 复制代码
#include <avr/wdt.h>

    看门狗函数:
[C] 纯文本查看 复制代码
wdt_enable(timeout) //看门狗使能 并设置超时时间
                 wdt_disable() //看门狗禁止
                 wdt_reset() //看门狗复位

其中wdt_enable(timeout) 中timeout可使用如下常量:(支持ATmega8,168,328,1280,2560,其中ATmega8仅支持前8项)

序号
常量
定义
1
WDTO_15MS
看门狗定时器15ms超时
2
WDTO_30MS
看门狗定时器30ms超时
3
WDTO_60MS
看门狗定时器60ms超时
4
WDTO_120MS
看门狗定时器120ms超时
5
WDTO_250MS
看门狗定时器250ms超时
6
WDTO_500MS
看门狗定时器500ms超时
7
WDTO_1S
看门狗定时器1S超时
8
WDTO_2S
看门狗定时器2S超时
9
WDTO_4S
看门狗定时器4S超时
10
WDTO_8S
看门狗定时器8S超时


下面是一个简单的看门狗的例子:
   
[C] 纯文本查看 复制代码
#include <avr/wdt.h>
void setup()
{
   pinMode(13,OUTPUT);
   wdt_enable(WDTO_2S); //开启看门狗,并设置溢出时间为两秒
}
 
void loop()
{
   digitalWrite(13,HIGH);
   delay(100);
   digitalWrite(13,LOW);
   delay(100);
   wdt_reset(); //喂狗操作,使看门狗定时器复位
}
   以上就是Arduino看门狗的使用方法,但是使用看门狗会导致Arduino出现问题。
AVR单片机是使用ISP工具下载的,而Arduino则是先通过ISP下载BootLoader(这个一般出产都已经刷好了),我们给Arduino下载程序的时候是通过串口UART0来下程序的,当然这依赖于BootLoader。然而,当我们调用看门狗之后,就影响了BootLoader的正常运行,导致不能通过串口下载程序。这时候需要通过ISP方式重新刷入BootLoader即可,更方便的话直接用ISP下载器给Arduino下载程序。
在早期的BootLoader版本中,及时使用看门狗也会使单片机一直处于复位状态。因为BootLoader复位后没有对看门狗复位。当然这个Bug现在已经修复了,所以再有ISP下载器的条件下(或者自己用Arduino做一个ISP下载器),可以方便使用看门狗。有兴趣的读者可以自行分析ArduinoBootLoader的源码,可以在GitHub上找到。我们会发现BootLoader中又对看门狗定时器的操作,所以当我们使用看门狗时,势必会影响BootLoader!关于源码的讨论,这里不再细究,有兴趣可自行研究。

版权所有,转载请注明出处!
熊猫阿宝
Steven.Zhang