看门狗定时器的作用及原理,看门狗定时器程序

看门狗计时器介绍:

看门狗计时器可以像常见的16位计时器一样,用于产生周期性中断,也可以发出复位信号,重新启动日常系统。 结构与PWM非常相似,如下图所示。

从上图可以看出,看门狗计时器首先经过8位预分频对PCLK进行分频,然后再次分频得到4种频率,即16分频、32分频、64分频、128分频。 看门狗计时器可以通过设置WTCON[4:3]来确定工作在哪个频率,并且当WTCHT寄存器第一次使用看门狗计时器时将初始计数值写入WTCNT寄存器,从该工作频率减去1进行计数

使用看门狗计时器的“看门狗功能”时,在常规程序中,必须不断重置WTCNT寄存器,使其不变为0,这样才能避免系统重新启动。 这就是所谓的“喂狗”。 程序崩溃时无法正常“喂狗”,计数值为0后系统将重新启动,程序将重新运行。

只有三个关于看门狗计时器的寄存器。 让我简单介绍一下:

1、WTCON寄存器(WATCHDOG TIMER CONTROL )。

用于设定分频系数,选择动作频率,决定是否启用中断、是否启用WATDOG功能,即是否输出复位信号。 看门狗计时器的动作频率可以通过以下公式计算。

看门狗计时器的动作频率=pclk/{ prescaler1}/{ divider value }

{ prescaler value }=0至255,{ divider value }=16、32、64、128。

2、WTDAT寄存器(WATCHDOG TIMER DATA ) )。

WTDAT寄存器用于确定看门狗计时器的超时周期,计时器启动后,计数达到0时,WTDAT寄存器的值自动传递给WTCNT寄存器。 但是,第一次启动看门狗计时器时,WTDAT寄存器的值不会自动传递给WTNT寄存器,因此必须首先将初始值加载到WTNT中。

3、WTCNT寄存器(等待时间计数) )。

在启动看门狗计时器之前,必须向名为WTCNT的寄存器写入初始计数值。 启动计时器后,将计数减少1,计数达到0时,如果中断有效,则发出中断请求。 看门狗功能生效后,发出复位信号,加载WTDAT寄存器的值并重新计数。

注意:

启用中断时,看门狗计时器中断有二次中断源,初始化中断时需要特别注意。

————————————————————————————————————————————

介绍main.c程序。

#include ‘2440addr.h ‘

#include ‘Option.h ‘

#defineleD1_on(rgpbdat=~(15 ) )

#defineleD1_off(rgpbdat|=(15 ) )

#defineled2_on(rgpbdat=~~(16 ) ) ) ) ) ) ) ) 652

#defineled2_off(rgpbdat|=(16 ) )

#defineled3_on(rgpbdat=~~(17 ) ) ) ) ) ) ) ) 652

#defineled3_off(rgpbdat|=(17 ) )

#defineled4_on(rgpbdat=~(18 ) )

#定义led4_ off (rgpbdat|=(18 ) )

void__IRQwdt_int(void );

语音延迟(语音)。

{

int i;

for(I=0; i1000000; I;

}

语音主(语音) )。

{

RGPbcon=~~((310 )|(312 )|(314 )|(316 ); 清除GPBCON[10:17]

rgpbcon|=() (110 )|(112 )|(114 )|(116 ); 将GPB5~8设为输出

RGPbup=~(() ()|() ) ) ) ) ) (18 ); 设置GPB5~8的上拉功能

rgpbdat|=(15 )|(16 )|) 1

<<7)|(1<<8);   //关闭LED

     rGPBCON |=1; //输出
     rGPBUP |=0;
     rGPBDAT|=0; //关闭蜂鸣器

     rWTDAT=50000; //设置看门狗定时器超时时间为4秒(50÷12.5)
     rWTCNT=50000;
     rWTCON=(249<<8)|(1<<5)|(0<<3)|(1<<2);//预分频值为249,使能看门狗,分频系数为16,中断使能

     rSRCPND |=BIT_WDT_AC97;
     rINTPND |=BIT_WDT_AC97;
     rSUBSRCPND |= BIT_SUB_WDT; //清除中断标志
   
     rINTMSK &= ~(BIT_WDT_AC97);
     rINTSUBMSK &= ~(BIT_SUB_WDT);//开中断
  
     pISR_WDT_AC97=(unsigned)Wdt_Int;//设置中断程序入口
     while(1)
    {
          LED1_ON;Delay();LED1_OFF;
          LED2_ON;Delay();LED2_OFF;
          LED3_ON;Delay();LED3_OFF;
          LED4_ON;Delay();LED4_OFF;
          rWTCNT=50000; //喂狗 没喂狗蜂鸣器很响
   }
}

void __irq Wdt_Int(void)
{
      rSRCPND |=BIT_WDT_AC97;
      rINTPND |=BIT_WDT_AC97;
      rSUBSRCPND |= BIT_SUB_WDT; //清除中断标志
      rGPBDAT =1;
      Delay();                         //  from  2440lib.c
      rGPBDAT =0; //蜂鸣器响一段时间
}

—————————————————————————————————————————————

     我们首先来看main函数,进入main函数之后,首先是设置LED1~4对应管脚为输出、使能上拉、关闭全部LED。(前面四句)

     接着三句是设置蜂鸣器控制管脚GPB0为输出、使能上拉、关闭蜂鸣器。

     我们先来看这句  rWTCON=(249<<8)|(1<<5)|(0<<3)|(1<<2);//预分频值为249,使能看门狗,分频系数为16,中断使能

     通过WATCHDOG 定时器工作频率 = PCLK / {prescaler +1 } / {divider value }

     {prescaler value } = 0~255, {divider value} = 16,32,64,128。

     计算求得WATCHDOG工作频率为12500Hz,即每秒钟计数12500次。

     再回头来看看上面那二句就很清楚的知道是定时器4秒的意思啦。

     rWTDAT=50000; //设置看门狗定时器超时时间为4秒(50÷12.5)
     rWTCNT=50000;

     接下来是清除中断标志,注意WATCHDOG是有次级中断源的,所以需要清除二个中断挂起寄存器。

     rSRCPND |=BIT_WDT_AC97;
     rINTPND |=BIT_WDT_AC97;
     rSUBSRCPND |= BIT_SUB_WDT; //清除中断标志

     接下来是打开中断,也是打开二个中断允许寄存器。

     rINTMSK &= ~(BIT_WDT_AC97);
     rINTSUBMSK &= ~(BIT_SUB_WDT);//开中断

     接下来是设置中断的起始地址,将中断服务程序的起始地址映射到内存。

     pISR_WDT_AC97=(unsigned)Wdt_Int;//设置中断程序入口

     我们进入中断服务程序看看:

——————————————————————————————————————————————

void __irq Wdt_Int(void)
{
      rSRCPND |=BIT_WDT_AC97;
      rINTPND |=BIT_WDT_AC97;
      rSUBSRCPND |= BIT_SUB_WDT; //清除中断标志
      rGPBDAT =1;   //蜂鸣器响
      Delay();
      rGPBDAT =0; //蜂鸣器响一段时间
}

——————————————————————————————————————————————

      进入中断服务程序后,首先清楚中断标志,接着让蜂鸣器响一下,接着关闭。

      最后进入死循环,前面四句是循环点亮LED灯,接着重新赋值给WTCNT,实现喂狗功能。

      rWTCNT=50000; //喂狗 没喂狗蜂鸣器很响

——————————————————————————————————————————————

到这里,我们WATCHDOG 定时器的讲解结束啦。

快三大小单双买入法r> {
      rSRCPND |=BIT_WDT_AC97;
      rINTPND |=BIT_WDT_AC97;
      rSUBSRCPND |= BIT_SUB_WDT; //清除中断标志
      rGPBDAT =1;
      Delay();                         //  from  2440lib.c
      rGPBDAT =0; //蜂鸣器响一段时间
}

—————————————————————————————————————————————

     我们首先来看main函数,进入main函数之后,首先是设置LED1~4对应管脚为输出、使能上拉、关闭全部LED。(前面四句)

     接着三句是设置蜂鸣器控制管脚GPB0为输出、使能上拉、关闭蜂鸣器。

     我们先来看这句  rWTCON=(249<<8)|(1<<5)|(0<<3)|(1<<2);//预分频值为249,使能看门狗,分频系数为16,中断使能

     通过WATCHDOG 定时器工作频率 = PCLK / {prescaler +1 } / {divider value }

     {prescaler value } = 0~255, {divider value} = 16,32,64,128。

     计算求得WATCHDOG工作频率为12500Hz,即每秒钟计数12500次。

     再回头来看看上面那二句就很清楚的知道是定时器4秒的意思啦。

     rWTDAT=50000; //设置看门狗定时器超时时间为4秒(50÷12.5)
     rWTCNT=50000;

     接下来是清除中断标志,注意WATCHDOG是有次级中断源的,所以需要清除二个中断挂起寄存器。

     rSRCPND |=BIT_WDT_AC97;
     rINTPND |=BIT_WDT_AC97;
     rSUBSRCPND |= BIT_SUB_WDT; //清除中断标志

     接下来是打开中断,也是打开二个中断允许寄存器。

     rINTMSK &= ~(BIT_WDT_AC97);
     rINTSUBMSK &= ~(BIT_SUB_WDT);//开中断

     接下来是设置中断的起始地址,将中断服务程序的起始地址映射到内存。

     pISR_WDT_AC97=(unsigned)Wdt_Int;//设置中断程序入口

     我们进入中断服务程序看看:

——————————————————————————————————————————————

void __irq Wdt_Int(void)
{
      rSRCPND |=BIT_WDT_AC97;
      rINTPND |=BIT_WDT_AC97;
      rSUBSRCPND |= BIT_SUB_WDT; //清除中断标志
      rGPBDAT =1;   //蜂鸣器响
      Delay();
      rGPBDAT =0; //蜂鸣器响一段时间
}

——————————————————————————————————————————————

      进入中断服务程序后,首先清楚中断标志,接着让蜂鸣器响一下,接着关闭。

      最后进入死循环,前面四句是循环点亮LED灯,接着重新赋值给WTCNT,实现喂狗功能。

      rWTCNT=50000; //喂狗 没喂狗蜂鸣器很响

——————————————————————————————————————————————

到这里,我们WATCHDOG 定时器的讲解结束啦。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注