WatchDog看门狗程序是一个我们经常会用到的程序。这里基于自己的理解和查阅相关的资料来对其进行一下说明。
1、为什么要使用看门狗?
由于单片机的工作有可能会受到来自外界电磁场的干扰,造成程序的跑飞,从而陷入死循环,程序的正常运行被打断,由单片机控制的系统便无法继续工作,这样会造成整个系统陷入停滞状态,发生不可预料的后果。
2、看门狗的大体原理(自己理解的)
经过使用看门狗后,我说一下我对对看门狗的理解。看门狗其实就类似一个计数器,启动看门狗后,它就开始自己计数,如果计数到了一个值或时间(这个可以自己设定)它就会溢出,溢出同时它就会给系统一个复位信号,这时系统程序就会从头开始运行。
为了不让看门狗的值溢出,我们需要在程序运行中喂狗(也就是手动把看门狗的计数值清零)确保它不会溢出。如果你的程序中用了延时函数那请注意一下延时时间的设置不要和看门狗的溢出时间冲突了,这个我就不细说了需要大家动手练习才更容易理解。
最后在补充一句。其实溢出的同时看门狗的溢出标志位也会置一,如果你设置了看门狗相关的中断,它就会进入中断程序。(进入中断程序后别忘了手动清除看门狗的溢出标志位)
3、看门狗的使用(基于STC15W204S单片机、Keil 5环境、C语言)
在这里只给出整个程序的一部分,为了讲解使用。
void main(void)
{
UART1_Init(); //这时串口1的初始化函数
EA = 1; //开启总中断
SendString("Ready! rn"); //通过串口1向计算机发送一个字符串
WDT_CONTR = 0x36; //这一句里包含了启动看门狗、清零看门狗、设置其为128分频
while(1)
{
/*------------喂狗,也就是清零看门狗计数器------------*/
WDT_CONTR = 0x36; //这一句里包含了启动看门狗、清零看门狗、设置其为128分频
}
}
上图为STC官方手册截图
通过STC-ISP程序烧写代码,这里要注意红框部分,选择自己的分频数(这里为128)
下面开始说明上面代码,很简单。
如果while(1)中没有喂狗程序,上电后串口会一直间隔接受到“Ready!”,这里就是看门狗溢出导致系统复位所产生的效果,系统会每隔一会就从头跑。
如果在while(1)中加上喂狗程序,上电后串口只接受到一条“Ready!”,这就是喂狗程序起作用了,不停的给看门狗清零,确保看门狗不会溢出,系统也就不会复位。
(转帖来自网络)