您的位置 首页 元件

裸奔程序之看门狗定时器

WATCHDOG定时器简介:WATCHDOG定时器也可以像一般的16位定时器一样用于产生周期性中断,也可以用于发出复位信号以重启时常的系统。它的结…

WATCHDOG定时器简介:

WATCHDOG定时器也能够像一般的16位定时器相同用于发生周期性中止,也能够用于宣布复位信号以重启经常的体系。它的结构与PWM很类似,如下图所示:

从上图咱们能够发现,WATCHDOG 定时器先经过8位预分频将PCLK分频后,被再次分频得到4种频率,16分频、32分频、64分频、128分频,WATCHDOG 定时器能够经过设置 WTCON[4:3]来决议作业在哪种频率之下,WTCHT 寄存器依照其作业频率减1计数,当抵达0时,能够发生中止信号,能够输出复位信号。在第一次运用WATCHDOG 定时器时,需求往WTCNT 寄存器中写入初始计数值,今后在计数值抵达0时,主动从WATDAT 寄存器中装入,从头开端下一个计数值。

运用WATCHDOG定时器的“WATCHDOG 功用”时,在正常的程序中,有必要不断从头设置WTCNT 寄存器,使之不为0,这样能够确保体系不被重启,这便是所谓的“喂狗”啦。当程序溃散时不能正常“喂狗”,计数值抵达0后体系将被重启,这样程序将从头运转。

有关WATCHDOG 定时器的寄存器只要3个。咱们来简略介绍一下:

1、WTCON 寄存器(WATCHDOG TIMER CONTROL)

用于设置分频系数,挑选作业频率,决议是否使能中止,是否启用WATDOG 功用(即是否输出复位信号),WATCHDOG 定时器的作业频率能够经过下面这个公式核算:
WATCHDOG 定时器作业频率 = PCLK / {prescaler +1 } / {divider value }

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

2、WTDAT 寄存器(WATCHDOG TIMER DATA)

WTDAT 寄存器被用来决议WATCHDOG 定时器的超时周期,在定时器发动后,当计数抵达0时,WTDAT 寄存器的值会主动传入 WTCNT 寄存器。不过,第一次发动WATCHDOG 定时器时,WTDAT 寄存器的值不会主动传入WTNT寄存器,这就需求首要在WTNT装入初值啦。

3、WTCNT 寄存器(WATCHDOG TIMR COUNT)

在发动WATCHDOG 定时器前,有必要往WTCNT这个寄存器写入初始计数值。发动定时器后,它减1计数,当计数值抵达0时,假如中止被使能的话,就会宣布中止请求;如WATCHDOG功用被使能的话,将会宣布复位信号,装载 WTDAT寄存器的值并从头计数。

留意:

当使能中止的时分,WATCHDOG定时器中止是有次级中止源的,初始化中止的时分需求分外留意。

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

下面开端解说main.c程序:

#include “2440addr.h”
#include “Option.h”

#define LED1_ON (rGPBDAT &=~(1<<5))
#define LED1_OFF (rGPBDAT |=(1<<5) )
#define LED2_ON (rGPBDAT &=~(1<<6))
#define LED2_OFF (rGPBDAT |=(1<<6))
#define LED3_ON (rGPBDAT &=~(1<<7))
#define LED3_OFF (rGPBDAT |=(1<<7))
#define LED4_ON (rGPBDAT &=~(1<<8))
#define LED4_OFF (rGPBDAT |=(1<<8))

void __irq Wdt_Int(void);

void Delay(void)
{
int i;
for(i=0;i<1000000;i++);
}

void Main(void)
{
rGPBCON &=~((3<<10)|(3<<12)|(3<<14)|(3<<16)); //对GPBCON[10:17]清零
rGPBCON |=((1<<10)|(1<<12)|(1<<14)|(1<<16)); //设置GPB5~8为输出
rGPBUP &=~((1<<5)|(1<<6)|(1<<7)|(1<<8)); //设置GPB5~8的上拉功用
rGPBDAT |=(1<<5)|(1<<6)|(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 定时器的解说完毕啦。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/yuanjian/265094.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部