講解下看門狗的定時中斷功能。既然提到了定時功能,那就需要先介紹下看門狗的時鐘系統(tǒng)。
看門狗定時器模塊使用兩個時鐘:PCLK和WDCLK。PCLK由系統(tǒng)時鐘生成,供APB 訪問看門狗寄存器使用。WDCLK由看門狗時鐘振蕩器中的wdt_clk生成,供看門狗定時器計數(shù)使用。wdt_clk時鐘可以從IRC和看門狗振蕩器中選擇一個作為時鐘源。
這兩個時鐘源之間存在一些同步邏輯。當MOD和TC寄存器通過APB操作更新時,新的值將由WDCLK時鐘設定并生效。當看門狗定時器處于WDCLK時鐘周期時,同步邏輯會先鎖定WDCLK上計數(shù)器的值,然后使其與PCLK同步,以作為TV寄存器的值供 CPU 讀取。
2、看門狗中斷
首先介紹下看門狗警告中斷比較值寄存器(WDWARNINT寄存器),它決定產(chǎn)生看門狗警告中斷的看門狗定時器值。當計數(shù)器的低10位與WARNINT的10位具有相同值,且計數(shù)器其余高位均為0時,便觸發(fā)看門狗警告中斷。如例圖所示,設置看門狗中斷比較值寄存器的定時值位0x3FF,當看門狗計數(shù)器到03FF時,看門狗中斷觸發(fā)。
圖1 看門狗中斷
除了看門狗警告中斷之外,還有看門狗超時中斷。這個是通過看門狗模式寄存器的WDRESET位置1,來選擇看門狗超時引發(fā)中斷。模式寄存器的WDTOF位就是看門狗超時標志位。在看門狗超時、發(fā)生喂狗錯誤或當 WDPROTECT=1 且嘗試向 WDTC 寄存器寫入時,便會設置看門狗超時標志。通過軟件向此位寫入 0 可將該標志清零。 WDTOF 位置 1,都可以觸發(fā)中斷。在任何情況下,非看門狗超時引起的看門狗超時標志置位都不會觸發(fā)系統(tǒng)復位。
3、看門狗中斷例程
接下來寫個小例程來測試下看門狗定時中斷功能的運行情況,程序源碼如下。
int main(void)
{
//初始化串口
PA_2_INIT(PA_2_TX0);
UART_Open(UART0,9600,UART_NO_PARITY,0);
UART_PutString(UART0,“System Reset.。。”);//Send System Inital String
WDT_Init ();//看門狗初始化
WDT_SetIntervalinMiliSec(4000);//設置看門狗超時時間4秒
WDT-》WARNINT_b.WARNINT = 0x3FF;//警告中斷定時值設置為最大值,方便演示
NVIC_EnableIRQ(WDT_IRQn);//設置看門狗NVIC中斷
WDT_Enable_Timer;//啟動看門狗
WDT_Feed();//喂狗
while(1);
}
void WDT_IRQHandler(void)//看門狗中斷服務子程序
{
if(WDT-》MOD_b.WDINT == 1)//警告中斷
{
WDT_Feed();
UART_PutString(UART0,“WDT Warning Int.。。”);
UART_ByteWrite(UART0,‘\n’);
}
if(WDT-》MOD_b.WDTOF == 1)//超時中斷
{
WDT_Feed();
UART_PutString(UART0,“WDT Timeout Int.。?!保?
UART_ByteWrite(UART0,‘\n}
WDT_ClearIntFlag();//清除看門狗中斷
return;
}
例程首先對串口進行初始化,然后串口輸出提示系統(tǒng)復位。隨后就是看門狗的初始化。將看門時間設置為4秒鐘,并且為中斷模式。并且使能看門狗中斷。在看門狗中斷服務程序中,根據(jù)觸發(fā)的中斷不同,輸出相應的提示信息。
程序編譯無誤后,便可以下載仿真調(diào)試了。首先全速運行,看下串口輸出的信息。根據(jù)輸出的信息我們發(fā)現(xiàn)只有看門狗警告中斷信息輸出,并沒有超時中斷信息。這是因為在警告中斷發(fā)生后及時進行了喂狗操作。所以看門狗并不會超時。
圖2 看門狗中斷實例1
接下來我們可以把看門狗警告中斷的喂狗函數(shù)WDT_Feed()屏蔽掉,然后再下載仿真看看效果。這時候我們就會看到看門狗超時中斷的信息輸出。因為警告中斷后沒有及時喂狗操作,導致看門狗超時發(fā)生。
圖3 看門狗中斷實例2
責任編輯人:CC
-
看門狗
+關注
關注
10文章
558瀏覽量
70707 -
定時中斷
+關注
關注
0文章
19瀏覽量
8541
發(fā)布評論請先 登錄
相關推薦
評論