獨立看門狗(IWDG)概述
STM32F10xxx系列內置兩個看門狗(獨立看門狗和窗口看門狗),提供了更高的安全性、時間的精確性和使用的靈活性。兩個看門狗設備(獨立看門狗和窗口看門狗)可用來檢測和解決由軟件錯誤引起的故障;當計數器達到給定的超時值時,觸發一個中斷(僅適用于窗口型看門狗)或產生系統復位。
獨立看門狗(IWDG)由專用的低速內部時鐘(LSI)驅動,即使主時鐘發生故障它也仍然有效。
窗口看門狗由從APB1時鐘分頻后得到的時鐘驅動,通過可配置的時間窗口來檢測應用程序非正常的過遲或過早的操作。
IWDG最適合應用于那些需要看門狗作為一個在主程序之外,能夠完全獨立工作,并且對時間精度要求較低的場合。
WWDG適合要求看門狗在精確計時窗口起作用的應用程序。
IWDG主要性能
● 自由運行的遞減計數器
● 時鐘由獨立的RC振蕩器提供(可在停止和待機模式下工作)
● 看門狗被激活后,則在計數器計數至0x000時產生復位
IWDG功能描述
獨立看門狗模塊的功能框圖
在鍵寄存器(IWDG_KR)中寫入0xCCCC,開始啟用獨立看門狗;此時計數器開始從其復位值0xFFF遞減計數。當計數器計數到末尾0x000時,會產生一個復位信號(IWDG_RESET)。
無論何時,只要在鍵寄存器(IWDG_KR)中寫入0xAAAA, 重裝載寄存器(IWDG_RLR)中的值就會被重新加載到12位遞減計數器,從而避免產生看門狗復位 。
硬件看門狗
如果用戶在選擇字節中啟用了“硬件看門狗”功能,在系統上電復位后,看門狗會自動開始運行;如果在計數器計數結束前,若軟件沒有向鍵寄存器寫入相應的值,則系統會產生復位。
寄存器訪問保護
預分頻寄存器(IWDG_PR)和重裝載寄存器(IWDG_RLR)具有寫保護功能。要修改這兩個寄存器的必須先向IWDG_KR寄存器中寫入0x5555。以不同的值寫入這個寄存器將會打亂操作順序,寄存器將重新被保護。重裝載操作(即寫入0xAAAA)也會啟動寫保護功能。
狀態寄存器指示預分頻值和遞減計數器是否正在被更新。
看門狗超時時間
IWDG寄存器描述
?
?
?
IWDG寄存器映像
IWDG固件庫函數
獨立看門狗相關的庫函數和定義分布在文件 stm32f10x_iwdg.h 和 stm32f10x_iwdg.c 中。
1)取消寄存器寫保護(向 IWDG_KR 寫入 0X5555)
通過這步,我們取消 IWDG_PR 和 IWDG_RLR 的寫保護,使后面可以操作這兩個寄存器,設置 IWDG_PR 和 IWDG_RLR 的值。這在庫函數中的實現函數是:
這個函數的功能開啟/取消寫保護,即使能/失能寫權限。
2)設置獨立看門狗的預分頻系數和重裝載值
設置看門狗的分頻系數的函數是:
設置看門狗的重裝載值的函數是:
設置好看門狗的分頻系數 prer 和重裝載值就可以知道看門狗的喂狗時間(也就是看門狗溢出時間),該時間的計算方式為:
Tout=((4×2^prer) ×rlr) /40
其中 Tout 為看門狗溢出時間(單位為 ms);prer 為看門狗時鐘預分頻值(IWDG_PR 值),范圍為 0~7;rlr 為看門狗的重裝載值(IWDG_RLR 的值);
比如我們設定 prer 值為 4,rlr 值為 625,那么就可以得到 Tout=64×625/40=1000ms,這樣,看門狗的溢出時間就是 1s,只要你在一秒鐘之內,有一次寫入 0XAAAA 到 IWDG_KR,就不會導致看門狗復位(當然寫入多次也是可以的)。這里需要提醒大家的是,看門狗的時鐘不是準確的 40Khz,所以在喂狗的時候,最好不要太晚了,否則,有可能發生看門狗復位。
3)重載計數值喂狗(向 IWDG_KR 寫入 0XAAAA)
庫函數里面重載計數值的函數是:
通過這句,將使 STM32 重新加載 IWDG_RLR 的值到看門狗計數器里面。即實現獨立看門狗的喂狗操作。
4) 啟動看門狗(向IWDG_KR 寫入 0XCCCC)
庫函數里面啟動獨立看門狗的函數是:
通過這句,來啟動 STM32 的看門狗。
注意 IWDG 在一旦啟用,就不能再被關閉!想要關閉,只能重啟,并且重啟之后不能打開 IWDG,否則問題依舊,如果不用 IWDG 的話,就不要去打開它,免得麻煩。
通過上面 4 個步驟,我們就可以啟動 STM32 的看門狗了,使能了看門狗,在程序里面就 必須間隔一定時間喂狗,否則將導致程序復位。
IWDG(獨立看門狗)實驗
硬件設計
本實驗用到的硬件資源有:
1) 指示燈 DS0
2) WK_UP 按鍵
3) 獨立看門狗
需要 2 個 IO 口,一個用來輸入喂狗信號,另外一個用來指示程序是否重啟。喂狗我們采用板上的 WK_UP 鍵來操作,而程序重啟,則是通過 DS0 來指示的。
軟件設計
在工程文件目錄下面新建兩個文件夾分別為:wdg.c和wdg.h。并在把源文件添加到工程,和添加頭文件的路徑。
wdg.c 里面的代碼如下:
該代碼一共有 2 個函數,void IWDG_Init(u8 prer,u16 rlr)是獨立看門狗初始化函數,就是按照上面介紹的步驟 1~4 來初始化獨立看門狗的。該函數有 2 個參數,分別用來設置與預分頻數與重裝寄存器的值的。
void IWDG_Feed(void)函數,該函數用來喂狗,因為 STM32 的喂狗只需要向鍵值寄存器寫入 0XAAAA 即可,也就是調用 IWDG_ReloadCounter()函數,所以,我們這個函數也是簡單的很。
wdg.h 里面的代碼如下:
main.c中的代碼:
按鍵輸入和看門狗,在看門狗開啟后馬上點亮 LED0(DS0),并進入死循環等待按鍵的輸入,一旦 WK_UP 有按鍵,則喂狗,否則等待 IWDG 復位的到來。
實驗現象
上電后DS0 不停的閃爍,證明程序在不停的復位,否則只會 DS0 常亮。如果不停的按 WK_UP 按鍵,可以看到 DS0 就常亮了,不會再閃爍,則說明程序在不斷的復位,喂狗成功。
評論
查看更多