【STM32F4】九、獨立看門狗(IWDG)實驗
目錄
一、什麼是看門狗
1. 什麼是看門狗
在由微控制器構成的微型計算機系統中,由於微控制器的工作常常會受到來自外界電磁場的干擾,造成程式的跑飛,而陷入死迴圈,程式的正常執行被打斷,由微控制器控制的系統無法繼續工作,會造成整個系統陷入停滯狀態,發生不可預料的後果,所以出於對微控制器執行狀態進行實時監測的考慮,便產生了一種專門用於監測微控制器程式執行狀態的模組或者晶片
2. 看門狗的作用
在程式正常執行的時候,系統不會復位。
在程式跑飛的情況下,看門狗會觸發系統復位,程式重新執行。
3. 看門狗的分類
STM32內建兩個看門狗(獨立看門狗/視窗看門狗),提供了更高的安全性、時間的精確性和使用的靈活性。
兩個看門狗裝置都可以用來監測和解決由軟體錯誤引起的故障。
當計數器達到給定的超時值時,觸發一箇中斷(僅適用視窗看門狗) 或者 產生系統復位。
下面簡單介紹兩種不同的看門狗系統:(參考正點原子)
- 獨立看門狗(IWDG)由專用的**低速時鐘(LSI)**驅動,即使主時鐘發生故障了,它也仍然有效。
獨立看門狗適合應用於需要看門狗作為一個在主程式之外能夠完全獨立工作,並企鵝對時間精確度要求低的場合。
- 視窗看門狗由從APB1的時鐘分頻後得到時鐘驅動。通過可配置的時間視窗來檢測應用程式非正常的過遲或過早的操作。
視窗看門狗最適合那些要求看門哦股在精確計時視窗起作用的程式。
本文介紹的是其中的獨立看門狗。
二、獨立看門狗概述
1. 獨立看門狗的四個暫存器
獨立看門狗內部結構的示意圖如下:
其中,最重要的是要了解上圖中標出的四個暫存器的作用:
首先,由左側紅色箭頭指示的32KHz時鐘訊號進入看門系統,經過由①預分頻器暫存器(IWDG_PR) 設定了分頻係數的 8位預分頻器,產生一個新的時鐘訊號,輸入到 12位遞減計數器 中。
在④鍵暫存器(IWDG_KR) 中寫入 0xCCCC 後,獨立看門狗開始工作,12位遞減計數器
(初值為0xFFF) 在每個時鐘週期就會減1,當減到0x000時,獨立看門狗就會認為程式已經跑飛,因此它將產生一個復位訊號(IWDG_RESET),使整個微控制器系統系統復位。
那麼,如何告知獨立看門狗**”程式並沒有跑飛“呢?這就需要我們往④鍵暫存器(IDWG_KR)中寫入 0xAAAA(通常說的喂狗),一旦④鍵暫存器**接到這個訊號,③重灌載暫存器(IWDG_RLR)就會把它裡面的值賦給12位遞減計數器,以防止遞減計數器減到0。
另外,②狀態暫存器可以讀取分頻係數和IWDG_RLR中裝載的數值,不常用。
通過以上機制,我們就可以設定一個操作,每當這個操作發生時,就往IDWG_KR中寫入0xAAAA,這時IDWG_RLR就會把它儲存的值賦給遞減計數器,防止系統復位。如果系統跑飛了,那麼這個操作也就不起作用了,遞減計數器將減到0,獨立看門狗就會向系統發出復位訊號,引發復位。
注: 在以上四個暫存器中,①預分頻暫存器(IWDG_PR) 和 ③重灌載暫存器(IWDG_RLR) 具有 防寫 功能,在對其進行寫入前要先 取消防寫。
2. 計算看門狗超時時間
首先來看預分頻暫存器(IDWG_PR)是怎樣控制分頻係數的:
IDWG_PR | 分頻係數 |
---|---|
0 | /4 |
1 | /8 |
2 | /16 |
3 | /32 |
4 | /64 |
5 | /128 |
6 | /256 |
根據上表,預分頻器的分頻係數 與 **預分頻暫存器(IDWG_PR)**有餘下關係:
分頻係數 = 4 x (2 ^ IDWG_PR )
那麼,根據輸入的時鐘訊號頻率為 32KHz,可以得到此訊號經過預分頻器後的頻率為:
32 / [4 x (2 ^ IDWG_PR)]
那麼,經過預分頻器後訊號的 時鐘週期 就是 頻率 的倒數,即:
4 x (2 ^ IDWG_PR) / 32
那麼,因為IDWG_RLR會把它的數值賦給遞減計數器,所以經過IDWG_RLR次減法、也就是IDWG_RLR個時鐘週期後,如果沒有對遞減計數器再次裝載資料,那麼它將減為0,這個由IDWG_RLR減為0的時間就為:
4 x (2 ^ IDWG_PR) x IDWG_RLR / 32
三、獨立看門狗的程式編寫
1. 獨立看門狗常用的庫函式
獨立看門狗常用的庫函式如下:
· IWDG_WriteAccessCmd(); //取消防寫:0x5555使能
· IWDG_SetPrescaler(); //設定預分頻係數:寫PR
· IWDG_SetReload(); //設定重灌載值:寫RLR
· IWDG_ReloadCounter(); //喂狗:寫0xAAAA到KR
· IWDG_Enable(): //使能看門狗:寫0xCCCC到KR
· IWDG_GetFlagStatus(); //狀態:重灌載/預分頻 更新
獨立看門狗的常見操作步驟:
① 取消暫存器防寫:
IWDG_WriteAccessCmd();
② 設定獨立看門狗的預分頻係數,確定時鐘:
IWDG_SetPrescaler();
③ 設定看門狗的重灌載值,確定溢位時間:
IWDG_SetReload();
注意,設定好重灌載值後,溢位時間就可通過如下公式計算得到:
Tout = 4 x (2 ^ IDWG_PR) x IDWG_RLR / 32
④ 使能看門狗
IWDG_Enable();
⑤ 應用程式喂狗:
IWDG_ReloadCounter();
2. 程式編寫
本程式的作用是啟動看門狗,然後設定溢位時間為1s,並用按下按鍵來作為對看門狗進行重灌載值的一個操作訊號。