您的位置 首页 厂商

s3c2440看门狗定时器的使用

看门狗定时器的主要作用是在程序因为干扰而跑飞后,能够使系统复位,不至于使系统永远的死下去。它的原理与一般的定时器没有多大区别,就是…

看门狗守时器的首要作用是在程序由于搅扰而跑飞后,能够使体系复位,不至于使体系永久的死下去。

它的原理与一般的守时器没有多大差异,便是先要设置好一段时刻,当超越这段时刻后,就从当时运转的程序中跳出进入中止处理程序中。但两者的首要差别是,一般的守时器中止是咱们期望它产生的,因而咱们不会在守时器中止产生前的那个时刻段内干涉它;而看门狗守时器中止是咱们不期望它产生的,因而咱们要想方设法地避免其产生。首要的办法便是在中止产生前,从头对看门狗守时器的寄存器进行赋值,使它的守时器从头开始计时。这种办法俗称喂狗,形象地比方便是一条看门狗每隔一段时刻(比如说一个小时)就会饿,所以就要叫唤,仅有使它不叫的办法便是给它喂养,那么下次叫唤的时刻便是从当时喂养起的一个小时后。因而只需在前次喂养后的一个小时内再给它喂养,它就永久不会叫唤。

s3c2440的看门狗守时器不只能够引起体系复位,还能够引起一般的中止,因而s3c2440的看门狗守时器能够当作一般的守时器运用。

s3c2440看门狗守时器的时钟频率的公式为:
PCLK÷(Prescaler + 1)÷Division
其间Prescaler的取值规模为0~255,Division的取值为16,32,64和128。例如,当PCLK为50MHz时,设置Prescaler为249,Division为16,则看门狗守时器的时钟频率为12.5kHz。这两个参数由寄存器WTCON供给,除此以外,该寄存器还能够设置是否有用看门狗守时器的超时复位,是否有用看门狗守时器的超时中止等。看门狗守时器还有两个寄存器WTDAT和WTCNT,WTDAT用于确认超时期限,WTCNT为当时看门狗守时器的计数值,在第一次设置看门狗超不时刻时,这两个寄存器都要被写入超不时刻的初始值。当要发动超时中止时,还要设置必要的中止寄存器,

下面这个程序便是一个看门狗守时器的实例。该程序便是正常的跑马灯程序,但加了一个看门狗守时器。咱们设置的看门狗守时器超不时,只会触发中止,不会引起体系复位。在中止函数内,蜂鸣器会响。咱们设置看门狗守时器的超时期限为4秒,为了不让程序进入看门狗中止,必须在该期限内,往寄存器WTCNT内写数,迫使看门狗守时器从头开始计时。

#define _ISR_STARTADDRESS 0x33ffff00
#define pISR_WDT_AC97(*(unsigned *)(_ISR_STARTADDRESS+0x44))
#define U32 unsigned int

#define rGPBCON(*(volatile unsigned *)0x56000010)//Port B control
#define rGPBDAT(*(volatile unsigned *)0x56000014)//Port B data
#define rGPBUP(*(volatile unsigned *)0x56000018)//Pull-up control B
#define rSRCPND(*(volatile unsigned *)0x4a000000)//Interrupt request status
#define rINTMSK(*(volatile unsigned *)0x4a000008)//Interrupt mask control
#define rINTPND(*(volatile unsigned *)0x4a000010)//Interrupt request status
#define rSUBSRCPND(*(volatile unsigned *)0x4a000018)//Sub source pending
#define rINTSUBMSK(*(volatile unsigned *)0x4a00001c)//Interrupt sub mask

#define rWTCON(*(volatile unsigned *)0x53000000)//Watch-dog timer mode
#define rWTDAT(*(volatile unsigned *)0x53000004)//Watch-dog timer data
#define rWTCNT(*(volatile unsigned *)0x53000008)//Eatch-dog timer count

void delay(int a)
{
int k;
for(k=0;k;
}

void __irq watchdog(void)
{
rGPBDAT |= 1;//蜂鸣器响

//清中止标志位
rSRCPND = 0x1<<9;
rSUBSRCPND = 0x1<<13;
rINTPND = 0x1<<9;
}

void Main(void)
{
int light;
int temp;
int i;
rGPBCON = 0x015551;//B0输出,给蜂鸣器;B5~B8输出,给LED
rGPBUP= 0x7ff;

rWTCON = 0xf9<<8;//Prescaler = 249,Division = 16,时钟频率为12.5kHz
//制止看门狗复位
rWTDAT = 50000;//设置看门狗守时器超不时刻为4秒(50÷12.5)
rWTCNT = 50000;
rWTCON |= (1<<5)|(1<<2);//舱位看门狗守时器中止
rSRCPND = 0x1<<9;
rSUBSRCPND = 0x1<<13;
rINTPND = 0x1<<9;
rINTSUBMSK = ~(0x1<<13);//翻开中止子屏蔽
rINTMSK = ~(0x1<<9);//翻开中止屏蔽 pISR_WDT_AC97 = (U32)watchdog; light = 0x10;
light = light<<1;
temp = light | 1;
rGPBDAT = ~temp;
delay(500000);
while(1)
{
for (i=0;i<3;i++)
{
light = light<<1;
temp = light | 1;
rGPBDAT = ~temp;
delay(500000);
}

rWTCNT = 50000;//喂狗,从头赋值,避免中止

for (i=0;i<3;i++)
{
light = light>>1;
temp = light | 1;
rGPBDAT = ~temp;
delay(500000);
}
}
}

假如咱们把程序中赤色的那条查办注释掉,则看门狗守时器能够被看成是一个一般的守时器,即每隔4秒钟,蜂鸣器会响一下。假如咱们使能看门狗守时器超时复位,则一定要加上这一句,不然体系会每隔4秒钟复位一次。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部