看门狗计时器介绍:
看门狗计时器可以像常见的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 定时器的讲解结束啦。