概述
在由單片機構成的微型計算機系統中,由於單片機的工作常常會受到來自外界電磁場的干擾,造成各種寄存器和內存的數據混亂,會導致程序指針錯誤,不在程序區,取出錯誤的程序指令等,都會陷入死循環,程序的正常運行被打斷,由單片機控制的系統無法繼續正常工作,會造成整個系統的陷入停滯狀態,發生不可預料的后果。
看門狗(守護)就是定期的查看芯片內部的情況,一旦發生錯誤就向芯片發出重啟信號的電路。看門狗命令在程序的中斷中擁有最高的優先級。
單片機可以在無人狀態下實現連續工作,其工作原理是:看門狗芯片和單片機的一個I/O引腳相連,該I/O引腳通過程序控制定時地往看門狗的這個引腳上送入高電平(或低電平),這一程序語句是分散地放在單片機其他控制語句中間的,一旦單片機由於干擾造成程序跑飛后而陷入某一程序段進入死循環狀態時,寫看門狗引腳的程序便不能被執行,這個時候,看門狗電路就會由於得不到單片機送來的信號,便在它和單片機復位引腳相連的引腳上送出一個復位信號,使單片機發生復位。即程序從程序存儲器的起始位置開始執行,這樣便實現了單片機的自動復位。簡單的說就是獨立看門狗為一個計數器,計數器每過一個時鍾周期就會自減1,當減為0時將觸發系統復位,所以程序應當在計數器的值為0之前重新載入一個新的值,這個過程被稱為“喂狗”。
時鍾源
從時鍾樹可以看出獨立看門狗擁有自己的獨立時鍾源,來自內部低速時鍾,時鍾頻率為32KHz。如果PLL崩潰了並不會影響獨立看門狗的運行,但是程序將奔潰無法“喂狗”,當看門狗計數器的值減為0時,看門狗認為系統發生故障將觸發系統復位。
寄存器
從看門狗的功能框圖中可以看出,寄存器IWDG_PR復雜對輸入的LSI時鍾進行分頻,而寄存器IWDG_PR負責標記寄存器IWDG_PR和寄存器IWDG_RLR是否可以更新,寄存器IWDG_RLR負責將值載入到12位遞減計數器,而寄存器IWDG_KR負責看門后的一些控制如使能,解鎖,寫保護。通過以上可以得出獨立看門狗程序的編寫步驟如下:
1.解鎖獨立看門狗的寄存器;
2.獨立看門狗的硬件時鍾分頻;
3.設置獨立看門狗的計數值;
4.將獨立看門狗加上寫保護;
5.使能獨立看門狗。
獨立看門狗程序
以下是獨立看門狗的初始化程序,
void iwdg_init(void)
{
//1.解鎖獨立看門狗的寄存器
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
//2.進行32分頻,獨立看門狗的硬件時鍾頻率=32KHz/32=1000Hz
IWDG_SetPrescaler(IWDG_Prescaler_32);
//3.設置獨立看門狗的計數值,1秒鍾的時間到達
IWDG_SetReload(1000-1);
//4.將獨立看門狗加上寫保護
IWDG_ReloadCounter()
//5.使能獨立看門狗
IWDG_Enable();
}
當程序中調用了上述代碼,程序在運行時便需要在每隔不到1秒鍾的時間調用庫函數IWDG_ReloadCounter(),為了防止程序中出現大量的IWDG_ReloadCounter()函數,可以使用初始化一個定時器,使能中斷,在中斷函數的中進行設置“喂狗”標志位,主循環程序中每次循環都要判斷該標志位來決定是否喂狗,定時器應該設置為1秒之內的時間到達;
總結
1.獨立看門狗可以提高程序的穩定性;
2.注意“喂狗”不應該在定時器中斷里進行,而是應該在中斷之外,主函數對定時器變量進行觀察就可以,這樣做的原因是防止程序跑飛了但是定時器中斷還能夠正常進行,不能夠及時復位的情況。