yanniwang

ADuC7026单片机看门狗详解

0
阅读(17343)

 ADuC7026单片机集成了一个看门狗定时器,在系统中也成为定时器T3, 它有2种运行模式,正常定时器模式和看门狗模式。看门狗定时器常用于从非法的软件状态恢复,一旦被激活,它将要求周期性的“喂狗",防止它被处理器强制性复位。

 (1)定时器模式

定时器3的时钟源是来自PLL同步逻辑的32.768kHZ时钟频率,并可以按1,16,或256的比例进行分频,如下图所示。展示了其工作模式。


(2) 看门狗模式

通过置位T3CON存储寄存器的第5位可进入看门狗模式。定时器3从T3LD寄存器中的当前值开始递减至0。

T3LD被用于计时。选择1/256的比例分频时可得到最大的计时时间512秒,此时T3LD为满值。定时器3运行在看门狗模式时,由外部32kHZ晶振时钟控制。需要注意的是要成功的进入看门狗模式,T3CON 寄存器中的第5位要在向T3LD存储寄存器执行写操作之后置位。

如果定时器计时至值0,产生复位还是中断取决于T3CON寄存器中的第1位。若要避免复位或中断,则必须在终止周期之前向T3ICLR进行写操作。这样就重装了计数器中的T3LD,且开始了一个新的计时周期。

一进入看门狗模式,T3LD 和T3CON就被写保护了。这两个寄存器只有当复位信号清除看门狗使能位,导致定时器3退出该模式时才能被修改。

 

  下面演示的是看门狗溢出产生中断的例子程序。要注意的是,在看门狗中断执行之后,需要软件复位以便重新开始下一次代码执行。

#include<aduc7026.h>

void delay(int);

void IRQ_Handler(void)__irq;

/*********************************************************************

* 函数名称:main()

* 函数功能:配置输出及定时器3,使能中断

*******************************************************************/

int main(void){

char i;

GP1DAT = 0x01000000;                      // 将引脚P1.0设为输出引脚

GP4DAT = 0x04000000;                   //  将引脚P4.2设为输出引脚,指示灯LED点亮  

T3LD = 0x1000;                              //  设定计数器值0x1000/32768 = 125ms

T3CON = 0xE2;                           //  用IRQ 代替复位,仅用于测试

IRQEN = 0x00000020;                  // 定时器3中断使能

while (1){

       for (i=0;i<4;i++){

              delay(0x30000);            

              T3CLRI = 0xff;

              GP4DAT ^= 0x00040000;

              }

       delay(0xA0000);                      // 长时间延时=>提供看门狗中断t

       T3CLRI = 0xff;

       GP4DAT ^= 0x00040000;

      }                         

}

void delay (int length){

       while (length >=0)

           length--;

}

/*********************************************************************

* 函数名称:IRQ_Handler()

* 函数功能:中断服务程序

*******************************************************************/

void IRQ_Handler()__irq{                         

       if ((IRQSTA & WATCHDOG_TIMER_BIT)!= 0)       

 // 判断是否为定时器3中断

       {                                      // 看门狗中断允许需要时在复位前进行数据保存

              GP1DAT ^= 0x00010000;          //  引脚P1.0取补

              RSTSTA = 0x4;                     // 软件中断

       }                         

       return ;

}