新聞中心

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

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

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

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

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

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

下面這個程序就是一個看門狗定時器的實例。該程序就是正常的跑馬燈程序,但加了一個看門狗定時器。我們設(shè)置的看門狗定時器超時時,只會觸發(fā)中斷,不會引起系統(tǒng)復(fù)位。在中斷函數(shù)內(nèi),蜂鳴器會響。我們設(shè)置看門狗定時器的超時期限為4秒,為了不讓程序進(jìn)入看門狗中斷,必須在該期限內(nèi),往寄存器WTCNT內(nèi)寫數(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,時鐘頻率為12.5kHz
//禁止看門狗復(fù)位
rWTDAT = 50000;//設(shè)置看門狗定時器超時時間為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秒鐘,蜂鳴器會響一下。如果我們使能看門狗定時器超時復(fù)位,則一定要加上這一句,否則系統(tǒng)會每隔4秒鐘復(fù)位一次。


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

評論


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

關(guān)閉