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