由於微控制器的工作經常會受到外界電磁場的干擾,造成程式的跑飛,陷入死迴圈,程式的正常執行被打斷,由微控制器控制的系統無法繼續工作,會造成整個系統陷入停滯狀態,發生不可預料的結果,所以出於對微控制器執行狀態進行實時監測的考慮,便產生了一種專門的用於檢測微控制器程式執行狀態的模組或者晶片,俗稱「看門狗(watchdog)」。
在啟動正常執行的時候,系統不能復位。
在系統跑飛(程式異常執行)的情況,系統復位,程式重新執行。
獨立看門狗中有兩個暫存器鍵值暫存器(IWDG_KR)和自動重灌在暫存器(IWDG_RLR)。以下文中用KR和RLR代替。
4. 在KR中寫入0xCCCC,開始啟用獨立看門狗。此時計數器開始從其復位值0xFFF遞減,當計數 器值到尾值0x000時產生復位訊號(IWDG_RESET)。
5. 在任意時刻,往KR中寫入0xAAAA,即喂狗,RLR的值就會重新載入到計數器,從而避免看門狗復位。
6. 如果程式異常,就無法正常喂狗,從而系統復位。
簡單來理解,這兩個暫存器就是一個用於定時,一個用於計數,而所說的喂狗就是隻要RLR從KR中將狗狼拿出,當沒有「狗糧」了,看門狗就會復位。
看門狗初始化函數HAL_IWDG_Init();
IWDG_HandleTypedef iwdg;
iwdg.Instance = IWDG;
iwdg.Init.Prescaler = IWDG_PRESCALER_64;
iwdg.Init.Reload = 500;
HAL_IWDG_Init(&iwdg);
啟動看門狗函數HAL_IWDG_Start();
HAL_IWDG_Start(&iwdg);
喂狗函數HAL_IWDG_Refresh();
HAL_IWDG_Refresh(&iwdg);
以上是本人學習時所做的一些筆記,希望各位大佬指正。