单片机中所谓“看门狗”,本质上就是一个计时器,主要作用就是用来防止代码卡死或跑飞,在单片机的应用中十分重要,但使用时却是十分简单方便的。
按字面意思理解,跟看家护院的狗狗是一个意思,就是芯片内置的一个定时器,主要作用就是来保障程序正常运行的,所以叫做看门狗。知道了他就是个单纯的定时器后,就容易理解多了,定时器的唯一一个功能,就是定时,当定时器启动后,内部变量一直累加,当累加到设定值后,自己重启。所以当你在定时器的变量累加到设定值之前,手动把他的变量清零,让他重新累加,那他就一直到不了设定值,也就不会重启。而手动将他的变量置为0的操作,就被称之为“喂狗”。“看门狗”的运行就是用到了这个原理。
在使用“看门狗”时一般需要两步,第一步初始化看门狗,其实就是给看门狗设置计数时间,也就是变量的设定值,当看门狗达到这个设定值时,就会触发重启。但在程序的正常运行下,我们是不希望单片机重启的,所以这时候就需要第二步"喂狗",也就是手动给计数器清零。所以我们一般在程序运行完的末尾加入“喂狗”操作。
当单片机初始化时,声明“看门狗”,看门狗内部计时器开始累加。然后程序开始运行,当程序第一遍运行结束后,执行喂狗操作,给看门狗计时器清零,然后程序重新运行。如果这时程序陷入一个死循环或者代码卡死,那么程序就不能正常运行完,而放在程序最末尾的“喂狗”函数就不会被执行,看门狗的定时器也就不会被重置,当看门狗累加到设定值后,则会触发重启,单片机重新运行。
对于看门狗的使用,还是非常重要的,尤其是对需要长时间工作的硬件设备,当单片机不正常工作了,看门狗则会自动重启代码,就会给后期维护节省很多麻烦。下面的代码就是看门狗在arduino里的运用,stm32的使用也一样。
/*********
*不论是arduino还是stm32,使用看门狗都需要先加载库文件
**********/
#include <avr/wdt.h> //看门狗库文件
#define TIMEOUT WDTO_8S //设定喂狗时间8s 8s后如果收不到喂狗操作,看门狗触发重启。
//初始化函数
void setup()
{
wdt_enable(TIMEOUT);//开始看门狗 在代码初始化阶段启动看门狗
}
//主循环
void loop()
{
//需要运行的主程序
……
wdt_reset();//喂狗 在程序运行一遍之后执行喂狗操作
}