没见过这么丧失的竟然售价30 不过鼓励原创 |
本帖最后由 熊猫阿宝 于 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项)
下面是一个简单的看门狗的例子: [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下载器),可以方便使用看门狗。有兴趣的读者可以自行分析Arduino的BootLoader的源码,可以在GitHub上找到。我们会发现BootLoader中又对看门狗定时器的操作,所以当我们使用看门狗时,势必会影响BootLoader!关于源码的讨论,这里不再细究,有兴趣可自行研究。 版权所有,转载请注明出处! 熊猫阿宝 Steven.Zhang |