3.8.2 看门狗设计原理
AT89S51/AT89S52提供了一个可编程看门狗定时器(WDT),可以防止软件跑飞并自动恢复,提高系统的可靠性。
由于系统干扰可能破坏程序指针(PC),一旦PC失控,程序就会“乱飞”,可能进入非程序区,造成系统运行错误。设置软件陷阱,可防止程序“乱飞”。
设置软件陷阱:在ROM或RAM中,每隔一些指令,就把连续几个单元设置成空操作(所谓陷阱)。在失控的程序调入“陷阱”,连续执行几个空操作后,程序自动恢复正常,继续执行后面的程序。
利用设置软件陷阱虽在一定程度上解决了程序“乱飞”的失控问题。但在程序执行过程中,因进入死循环,而无法撞上陷阱,就会使程序长时间运行不正常。因此,设置陷阱的办法并不能彻底有效地解决死循环问题。
设置程序监视器(又称为看门狗,Watchdog)可较有效地解决死循环问题。程序监视器系统有的采用软件解决,大部分都是采用软、硬件相结合的办法。下面以两种解决办法来分析其原理。
(1)利用单片机内部定时器进行监视。
在程序的大循环中,一开始就启动定时器工作,在主程序中增设定时器赋值指令,使该定时器维持在非溢出工作状态。定时时间要稍大于程序循环一次的执行时间。程序正常循环执行一次给定时器送一次初值,重新开始计数而不会产生溢出。但若程序失控,没能按时给定时器赋初值,则定时器就会产生溢出中断,在中断服务程序中使主程序回到初始状态。
(2)利用单稳态触发器构成程序监视器。
利用单稳态触发器构成程序监视器的电路很多。利用软件经常访问单稳电路,一旦程序有问题,CPU就不能正常访问,单稳电路则产生翻转脉冲使单片机复位,强制程序重新开始执行。
用户程序中如果使用了看门狗,那么必须在用户自定义的时间内刷新WDT,也称为“喂狗”。若在规定的时间没有刷新WDT,则产生内部硬件复位。WDT以系统时钟(XTAL1)作为自己的时基,WDT寄存器每隔344064个时钟就加1,看门狗定时器数据/重载寄存器(WDTD)的高位被用作WDT的重载寄存器。
WDT超时周期为
超时周期=(255-WDTD)×344064÷fclk(XTALI)
看门狗定时器控制寄存器(WDTC)如表3.12所示,看门狗定时器数据/重载寄存器(WDTD)如表3.13所示。
表3.12 看门狗定时器控制寄存器(WDTC)
表3.13 看门狗定时器数据/重载寄存器(WDTD)
这时复位值为00000000B。