獨立看門狗

2020-09-22 11:01:02

為什麼要看門狗

由於微控制器的工作經常會受到外界電磁場的干擾,造成程式的跑飛,陷入死迴圈,程式的正常執行被打斷,由微控制器控制的系統無法繼續工作,會造成整個系統陷入停滯狀態,發生不可預料的結果,所以出於對微控制器執行狀態進行實時監測的考慮,便產生了一種專門的用於檢測微控制器程式執行狀態的模組或者晶片,俗稱「看門狗(watchdog)」。

看門狗解決的問題是什麼

在啟動正常執行的時候,系統不能復位。
在系統跑飛(程式異常執行)的情況,系統復位,程式重新執行。

STM32看門狗

  1. STM32內建兩個看門狗裝置(獨立看門狗/視窗看門狗)可以用來檢測和解決由軟體錯誤引起的故障。當計數器達到給定的超時值時,觸發一箇中斷(僅適用於視窗看門狗)或者產生系統復位.
  2. 獨立看門狗(IWDG)由專用的低速時鐘(LSI)驅動,即使主時鐘發生故障它仍然有效。適用於需要看門狗作為一個在主程式之外能夠完全獨立工作,並且對時間精度要求低的場合。
  3. 視窗看門狗由從APB1時鐘分頻後得到的時鐘驅動。通過可設定的時間視窗來檢測應用程式非正常的過遲或者過早操作。適用於要求看門狗在精確計時串列埠起作用的程式。

功能概述

獨立看門狗中有兩個暫存器鍵值暫存器(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);

以上是本人學習時所做的一些筆記,希望各位大佬指正。