S3C2440看門(mén)狗解析
S3C2440A的看門(mén)狗定時(shí)器是用于當(dāng)其由于噪聲和系統(tǒng)錯(cuò)誤引起的故障干擾時(shí)恢復(fù)控制器的工作。它可以被用作普通16位內(nèi)部定時(shí)器來(lái)請(qǐng)求中斷服務(wù)。看門(mén)狗定時(shí)器產(chǎn)生128個(gè)PCLK周期的復(fù)位信號(hào)
也就是說(shuō),在某些環(huán)境下,看門(mén)狗可以當(dāng)做定時(shí)器使用,當(dāng)他中斷的時(shí)候并不發(fā)生復(fù)位,只發(fā)生中斷,我看看圖
看門(mén)狗的中斷和復(fù)位信號(hào)是可以依靠wtcon來(lái)切斷的(看門(mén)狗的時(shí)鐘是無(wú)法切斷的)
使用看門(mén)狗主要靠這幾個(gè)寄存器
用來(lái)選擇時(shí)鐘源,分頻系數(shù),啟動(dòng)看門(mén)狗以及看門(mén)狗中斷和復(fù)位的連接
流程基本上就是,第一次對(duì)wtcnt賦值之后啟動(dòng)看門(mén)狗,看門(mén)狗自動(dòng)減,到達(dá)0的時(shí)候觸發(fā)中斷,如果連接了復(fù)位則觸發(fā)復(fù)位
未連接則觸發(fā)中斷,另外,看門(mén)狗定時(shí)器數(shù)據(jù)寄存器(WTDAT)的值不能被自動(dòng)重載到定時(shí)計(jì)數(shù)器(WTCNT)中。由于這個(gè)理由,必須在看門(mén)狗定時(shí)器啟動(dòng)前寫(xiě)入一個(gè)初始值到看門(mén)狗定時(shí)器計(jì)數(shù)寄存器(WTCNT)中
請(qǐng)看具體代碼,兩種看門(mén)狗的使用都有
#include"watchdog.h"u8wwdgUp=0;void__irqWdt_Int(void){rSRCPND"=BIT_WDT_AC97;rINTPND|=BIT_WDT_AC97;rSUBSRCPND|=BIT_SUB_WDT;//清除中斷標(biāo)志//WatchdogInit(0);wwdgUp=1;}//看門(mén)狗不連接系統(tǒng)復(fù)位//prescaler分頻系數(shù)8位//mux始終選擇0161322643128//countValue計(jì)數(shù)值voidWWDGInitForTimer(u8prescaler,u8mux,u16countValue){rWTCON&=~(1<<5);//看門(mén)狗禁止rWTCON&=0xff00;//清除預(yù)分頻系數(shù)rWTCON|=prescaler<<8;//設(shè)置預(yù)分頻系數(shù)rWTCON&=~(0x03<<3);rWTCON|=mux<<3;//設(shè)置時(shí)鐘選擇器rWTCON|=1<<2;//使能中斷]rWTCON&=~(1<<0);//禁止復(fù)位rWTDAT=countValue;rWTCNT=countValue;//初次使用,必須設(shè)置CNT的值rSRCPND|=BIT_WDT_AC97;//清除標(biāo)志rINTPND|=BIT_WDT_AC97;rSUBSRCPND|=BIT_SUB_WDT;//清除子中斷標(biāo)志rINTMOD&=~BIT_WDT_AC97;//設(shè)置中斷模式為IRQ模式rINTMSK&=~(BIT_WDT_AC97);//開(kāi)中斷rINTSUBMSK&=~(BIT_SUB_WDT);//開(kāi)子中斷pISR_WDT_AC97=(unsigned)Wdt_Int;//設(shè)置中斷程序入口rWTCON|=(1<<5);//看門(mén)狗啟動(dòng)}//看門(mén)狗連接系統(tǒng)復(fù)位//prescaler分頻系數(shù)8位//mux始終選擇0161322643128//countValue計(jì)數(shù)值voidWWDGInitForReset(u8prescaler,u8mux,u16countValue){rWTCON&=~(1<<5);//看門(mén)狗禁止rWTCON&=0xff00;//清除預(yù)分頻系數(shù)rWTCON|=prescaler<<8;//設(shè)置預(yù)分頻系數(shù)rWTCON&=~(0x03<<3);rWTCON|=mux<<3;//設(shè)置時(shí)鐘選擇器rWTCON&=~(1<<2);//禁止中斷]rWTCON|=(1<<0);//使能復(fù)位rWTDAT=countValue;rWTCNT=countValue;//初次使用,必須設(shè)置CNT的值rWTCON|=(1<<5);//看門(mén)狗啟動(dòng)}voidWatchfeed(u16count)//看門(mén)狗喂狗{rWTCNT=count;//喂狗}
#ifndef__WATCHDOG_H#define__WATCHDOG_H#include"2440addr.h"#include"def.h"voidWWDGInitForTimer(u8prescaler,u8mux,u16countValue);voidWWDGInitForReset(u8prescaler,u8mux,u16countValue);voidWatchfeed(u16count);//看門(mén)狗喂狗externu8wwdgUp;#endif