1. 看門狗原理
Watchdog原理上就是一個(gè)定時(shí)器。定時(shí)器timer對時(shí)鐘進(jìn)行計(jì)數(shù),當(dāng)定時(shí)器溢出時(shí),產(chǎn)生復(fù)位信號(hào),使得整個(gè)系統(tǒng)復(fù)位。在程序或嵌入式系統(tǒng)中,需要定期的對看門狗timer進(jìn)行復(fù)位重新計(jì)數(shù),定時(shí)器不會(huì)溢出復(fù)位系統(tǒng),從而保證系統(tǒng)的正常運(yùn)行。當(dāng)某種原因(例如干擾)引起程序跑飛或者進(jìn)入死循環(huán)時(shí),程序不能定期的復(fù)位看門狗timer, 計(jì)數(shù)溢出產(chǎn)生復(fù)位信號(hào),導(dǎo)致系統(tǒng)復(fù)位。
設(shè)本系統(tǒng)程序完整運(yùn)行一周期的時(shí)間是T1,看門狗的定時(shí)周期為T2,T2>T1,在程序運(yùn)行一周期后就修改定時(shí)器的計(jì)數(shù)值,只要程序正常運(yùn)行,定時(shí)器就不會(huì)溢出,若因?yàn)槌绦颉芭茱w”或者進(jìn)入死循環(huán),那么系統(tǒng)不能在T1時(shí)刻修改時(shí)間的計(jì)數(shù)值,一直計(jì)數(shù)直到T2時(shí)刻溢出,引發(fā)系統(tǒng)復(fù)位,使系統(tǒng)重新運(yùn)行,從而起到監(jiān)控作用。
從上面的解釋中可以看出,Watchdog的作用就是為了防止系統(tǒng)因意外“跑飛”,導(dǎo)致整個(gè)系統(tǒng)癱瘓時(shí),恢復(fù)(reset)系統(tǒng)運(yùn)行。
2. S3C2410看門狗控制
1)作為常規(guī)定時(shí)器使用,并且可以產(chǎn)生中斷
2)作為看門狗定時(shí)器使用,期滿時(shí),它可以產(chǎn)生128個(gè)時(shí)鐘周期的復(fù)位信號(hào)
具體看下圖所示:輸入時(shí)鐘為PCLK(該時(shí)鐘頻率等于系統(tǒng)的主頻),它經(jīng)過兩級分頻(Prescaler和frequency division factor),最后將分頻后的時(shí)鐘作為該定時(shí)器的輸入時(shí)鐘,當(dāng)計(jì)數(shù)器期滿后可以產(chǎn)生中斷或者復(fù)位信號(hào)。
看門狗定時(shí)器計(jì)數(shù)值的計(jì)算公式如下:
1)輸入到計(jì)數(shù)器的時(shí)鐘周期
t_watchdog = 1/( PCLK / (Prescaler value + 1) / Division_factor )
預(yù)分頻器Prescaler及分頻因子Division factor的值由用戶在WTCON(看門狗時(shí)鐘控制寄存器)中設(shè)置。
2)看門狗的定時(shí)周期
T = 計(jì)數(shù)值(WTCNT初值-WTCNT當(dāng)前值) * t_watchdog
WTCNT為看門狗數(shù)據(jù)寄存器,用來設(shè)置計(jì)數(shù)多少個(gè)時(shí)鐘周期。乘以時(shí)鐘周期就是定時(shí)的總時(shí)間了。
3.看門狗在函數(shù)Delay()中的使用
void Delay(int time)
{
// time=0: adjust the Delay function by WatchDog timer.
// time>0: the number of loop time
// resolution of time is 100us.
int i,adjust=0;
if(time==0)
{
time = 200;
adjust = 1;
delayLoopCount = 400;
//PCLK/1M,Watch-dog disable,1/64,interrupt disable,reset disable
rWTCON = ((PCLK/1000000-1)<<8)|(2<<3);//使( PCLK / (Prescaler value + 1)為1M,最后使看門狗的計(jì)數(shù)頻率為1/64M,得到計(jì)數(shù)周期為64us。
rWTDAT = 0xffff; //必需在寄存器WTDAT里面存有一個(gè)值,在watchdog開啟之后這個(gè)值會(huì)被自動(dòng)加載進(jìn)寄存器WTCNT中
rWTCNT = 0xffff; //第一次寫初值時(shí),WTDAT不會(huì)自動(dòng)加載給WTCNT,所以必須手動(dòng)將WTCNT賦初值
rWTCON = ((PCLK/1000000-1)<<8)|(2<<3)|(1<<5);//看門狗啟動(dòng)定時(shí)
}
for(;time>0;time--)
for(i=0;i if(adjust==1) { rWTCON = ((PCLK/1000000-1)<<8)|(2<<3);//看門狗停止計(jì)時(shí)。 i = 0xffff - rWTCNT;//每過一個(gè)計(jì)數(shù)周期(64us),WTCNT中的值便減1,rWTCNT的初值為0xffff ,用for循環(huán)延時(shí)一段時(shí)間后讓看門狗停止計(jì)數(shù),通過i = 0xffff – rWTCNT(停止時(shí)當(dāng)前計(jì)數(shù)值),算出計(jì)數(shù)次數(shù),200*400(delayLoopCount的值)cycle runtime = 64*i us delayLoopCount=8000000/(i*64);//200*400/64*i=delayLoopCount/100us -> delayLoopCount=80000*100/(64*i),算出100us需要delayLoopCount值多少(8000000/(i*64)),最后如主程序調(diào)用Delay(10000)(在之前應(yīng)先執(zhí)行Delay(0)),執(zhí)行兩條for語句,相當(dāng)于10000×delayLoopCount=10000×1us=1s。 }