单片机原理及应用系统设计
上QQ阅读APP看书,第一时间看更新

2.8.3 看门狗定时器(WDT)复位

单片机系统受到干扰可能会引起程序“跑飞”或“死循环”,使系统失控。为了解决这个问题,在单片机中采用了“看门狗”技术。

“看门狗”技术:使用一个专用的定时器来不断计数,监视程序的运行。当启动看门狗运行后,为防止看门狗的不必要溢出,在程序正常运行过程中,应定期地把看门狗清0,以保证看门狗不溢出。当由于干扰,使程序“跑飞”或“死循环”时,单片机也就不能定时地把看门狗定时器清0,看门狗定时器计满溢出时,将在RST引脚上输出一个正脉冲(宽度为98个时钟周期),使单片机复位,在0000H处安排一条跳向出错处理程序段的指令或重新执行程序,从而使程序摆脱“跑飞”或“死循环”状态,让单片机归复于正常的工作状态。

片内的“看门狗”部件包含一个14位定时器和一个看门狗控制寄存器(WDT_CONTR)。开启看门狗定时器后,14位定时器会自动对系统时钟12分频后的信号计数,即每16384(214)个机器周期溢出一次,并产生一个高电平复位信号,使单片机复位。看门狗通过WDT_CONTR来设置。该寄存器地址为E1H,格式如图2-13所示。

图2-13 看门狗控制寄存器格式

EN_WDT:看门狗允许位,当设置为“1”时,启动看门狗。

CLR_WDT:看门狗清“0”位,当设为“1”时,看门狗定时器将重新计数。硬件自动清“0”此位。

IDLE_WDT:看门狗“IDLE”模式位,当设置为“1”时,看门狗定时器在单片机的“空闲模式”计数,当清“0”该位时,看门狗定时器在单片机的“空闲模式”时不计数。

PS2、PS1、PS0:看门狗定时器预分频值,不同值对应预分频数见表2-7。

表2-7 12M晶振看门狗定时器预分频值

(续)

看门狗溢出时间与预分频数有直接的关系,公式如下:

看门狗溢出时间=(N×预分频数×32768)/晶振频率

式中,N表示STC单片机的时钟模式,STC单片机有两种时钟模式:12T和6T。表中给出的是12T模式,fosc=12MHz时的值。

用户只要向寄存器WDT CONTR写入相应的控制字,就可以实现启动看门狗、清除看门狗计数器、开始重新计数及空闲模式计数状态设置等。为防止看门狗启动后产生不必要的溢出和复位,在执行程序的过程中,应在设置的溢出时间内使看门狗计数器清0并重新计数。

例2-1】看门狗的使用举例。

只要程序一跑出while()循环,不执行复位看门狗的清0和重新计数命令,看门狗定时器就会溢出使单片机复位,使程序从main()处开始重新运行。