新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > s3c2440看門狗定時(shí)器的應(yīng)用

s3c2440看門狗定時(shí)器的應(yīng)用

作者: 時(shí)間:2016-11-19 來源:網(wǎng)絡(luò) 收藏
看門狗定時(shí)器的主要作用是在程序因?yàn)楦蓴_而跑飛后,能夠使系統(tǒng)復(fù)位,不至于使系統(tǒng)永遠(yuǎn)的死下去。

它的原理與一般的定時(shí)器沒有多大區(qū)別,就是先要設(shè)置好一段時(shí)間,當(dāng)超過這段時(shí)間后,就從當(dāng)前運(yùn)行的程序中跳出進(jìn)入中斷處理程序中。但兩者的主要差別是,一般的定時(shí)器中斷是我們希望它發(fā)生的,因此我們不會(huì)在定時(shí)器中斷發(fā)生前的那個(gè)時(shí)間段內(nèi)干預(yù)它;而看門狗定時(shí)器中斷是我們不希望它發(fā)生的,因此我們要想方設(shè)法地避免其發(fā)生。主要的方法就是在中斷發(fā)生前,重新對(duì)看門狗定時(shí)器的寄存器進(jìn)行賦值,使它的定時(shí)器重新開始計(jì)時(shí)。這種方法俗稱喂狗,形象地比喻就是一條看門狗每隔一段時(shí)間(比如說一個(gè)小時(shí))就會(huì)餓,所以就要叫喚,唯一使它不叫的方法就是給它喂食,那么下次叫喚的時(shí)間就是從當(dāng)前喂食起的一個(gè)小時(shí)后。因此只要在上次喂食后的一個(gè)小時(shí)內(nèi)再給它喂食,它就永遠(yuǎn)不會(huì)叫喚。

s3c2440的看門狗定時(shí)器不僅可以引起系統(tǒng)復(fù)位,還可以引起一般的中斷,因此s3c2440的看門狗定時(shí)器可以當(dāng)作一般的定時(shí)器使用。

器的時(shí)鐘頻率的公式為:
PCLK÷(Prescaler + 1)÷Division
其中Prescaler的取值范圍為0~255,Division的取值為16,32,64和128。例如,當(dāng)PCLK為50MHz時(shí),設(shè)置Prescaler為249,Division為16,則看門狗定時(shí)器的時(shí)鐘頻率為12.5kHz。這兩個(gè)參數(shù)由寄存器WTCON提供,除此以外,該寄存器還可以設(shè)置是否有效看門狗定時(shí)器的超時(shí)復(fù)位,是否有效看門狗定時(shí)器的超時(shí)中斷等。看門狗定時(shí)器還有兩個(gè)寄存器WTDAT和WTCNT,WTDAT用于確定超時(shí)期限,WTCNT為當(dāng)前看門狗定時(shí)器的計(jì)數(shù)值,在第一次設(shè)置看門狗超時(shí)時(shí)間時(shí),這兩個(gè)寄存器都要被寫入超時(shí)時(shí)間的初始值。當(dāng)要啟動(dòng)超時(shí)中斷時(shí),還要設(shè)置必要的中斷寄存器,

下面這個(gè)程序就是一個(gè)看門狗定時(shí)器的實(shí)例。該程序就是正常的跑馬燈程序,但加了一個(gè)看門狗定時(shí)器。我們設(shè)置的看門狗定時(shí)器超時(shí)時(shí),只會(huì)觸發(fā)中斷,不會(huì)引起系統(tǒng)復(fù)位。在中斷函數(shù)內(nèi),蜂鳴器會(huì)響。我們設(shè)置看門狗定時(shí)器的超時(shí)期限為4秒,為了不讓程序進(jìn)入看門狗中斷,必須在該期限內(nèi),往寄存器WTCNT內(nèi)寫數(shù),迫使看門狗定時(shí)器重新開始計(jì)時(shí)。


#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;//蜂鳴器響

//清中斷標(biāo)志位
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,時(shí)鐘頻率為12.5kHz
//禁止看門狗復(fù)位
rWTDAT = 50000;//設(shè)置看門狗定時(shí)器超時(shí)時(shí)間為4秒(50÷12.5)
rWTCNT = 50000;
rWTCON |= (1<<5)|(1<<2);//開啟看門狗定時(shí)器中斷
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);
}
}
}

如果我們把程序中紅色的那條語句注釋掉,則看門狗定時(shí)器可以被看成是一個(gè)一般的定時(shí)器,即每隔4秒鐘,蜂鳴器會(huì)響一下。如果我們使能看門狗定時(shí)器超時(shí)復(fù)位,則一定要加上這一句,否則系統(tǒng)會(huì)每隔4秒鐘復(fù)位一次。


關(guān)鍵詞: s3c2440看門狗定時(shí)

評(píng)論


技術(shù)專區(qū)

關(guān)閉