在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称“看门狗”(watchdog)。
看门狗电路的应用,使单片机可以在无人状态下实现连续工作,其工作原理是:看门狗芯片和单片机的一个I/O引脚相连,该I/O引脚通过程序控制它定时地往看门狗的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,写看门狗引脚的程序便不能被执行,这个时候,看门狗电路就会由于得不到单片机送来的信号,便在它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位,即程序从程序存储器的起始位置开始执行,这样便实现了单片机的自动复位。
在以前传统的8051往往没有内置看门狗,都是需要外置看门狗的,例如常用的看门狗芯片有Max813、5045、IMP706、DS1232。例如芯片DS1232在系统工作时如图13.1-2,必须不间断的给引脚ST(----)输入一个脉冲系列,这个脉冲的时间间隔由引脚TD设定,如果脉冲间隔大于引脚TD的设定值,芯片将输出一个复位脉冲使单片机复位。一般将这个功能称为看门狗,将输入给看门狗的一系列脉冲称为“喂狗”。这个功能可以防止单片机系统死机。
图13.1-2 DS1232看门狗电路
虽然看门狗的好处是很多,但是其成本制约着是否使用外置看门狗抉择。不过幸运的是,现在很多单片机都内置看门狗,例如AVR、PIC、ARM,当然现在的M051系列单片机也不例外,其已经内置了看门狗,而且基本上满足了项目的需要。
看门狗定时器用于在软件运行至未知状态时执行系统复位功能,可以防止系统无限制地挂机,除此之外,看门狗定时器还可将CPU由掉电模式唤醒。看门狗定时器包含一个18位的自由运行的计数器,可编程其定时溢出间隔。
设置WTE(WDTCR[7])使能看门狗定时器,WDT计数器开始向上计数. 当计数器达到选择的定时溢出间隔,如果看门狗定时器中断使能位WTIE置位,看门狗定时器中断标志WTIF被立即置位,并请求WDT中断,同时,跟随在时间溢出事件之后有一个指定延时(1024 * TWDT),用户必须在该延时时间结束前设置WTR(WDTCR[0]) (看门狗定时器复位)为高,重置18位WDT计数器,防止CPU复位。WTR在WDT计数重置后自动由硬件清零。通过设置WTIS(WDTCR[10:8])可选择8个带有指定延时的定时溢出间隔. 如果在特定延迟时间终止后,WDT计数没有被清零,看门狗定时将置位看门狗定时器复位标志(WTRF)并使CPU复位. 这个复位将持续63个WDT时钟,然后CPU重启,并从复位向量(0x0000 0000)开始执行程序. 看门狗复位后WTRF位不会被清除。用户可用软件查询WTFR来识别复位源。WDT还提供唤醒功能。当芯片掉电,且看门狗唤醒使能位 (WDTR[4])置位时,如果WDT计数器达到由WTIS (WDTCR [10:8])定义的时间间隔时,芯片就会由掉电状态唤醒。第一个例子,如果WTIS被设置为000,CPU从掉电状态被唤醒的时间间隔是24* TWDT。当掉电命令被软件设置,CPU进入掉电状态,在24* TWDT时间过后,CPU由掉电状态唤醒。第二个例子,如果WTIS被设置为111,CPU从掉电状态被唤醒的时间间隔是218* TWDT。当掉电命令被软件设置,CPU进入掉电状态,在218* TWDT时间过后,CPU由掉电状态唤醒。注意,如果WTRE (WDTCR [1])被置位,再CPU被唤醒之后,软件应当尽可能的通过置位WTR(WDTCR [0])来清零看门狗定时器计数器,否则,如果在从CPU唤醒到软件清零看门狗定时器计数器的时间超过1024 * TWDT之前看门狗定时器计数器没有通过置位WTR(WDTCR [0])被清零,CPU将通过看门狗定时器复位。