MCU微課堂
CKS32F107XX系列獨立看門狗介紹
第六十七期 2025.11.24
看門狗簡介
中科芯CKS32F107xx系列產品內部提供兩個看門狗定時器單元,獨立型看門狗IWDG(Independent Watchdog)和窗口型看門狗WWDG(Window Watchdog),它們在安全性、時間精確性和使用靈活性方面變現得非常優秀。兩個看門狗定時器單元都可用來檢測由軟件錯誤引起的故障,具體表現為當計數器達到給定的超時值或未能在指定時間窗口內刷新計數器的值,會觸發系統復位。
IWDG由MCU內部獨立RC振蕩器產生的低速時鐘LSI(Low-speed Internal)驅動,因此即使主時鐘發生故障它也仍然有效。而WWDG是由從APB1分頻后得到的時鐘驅動,通過可配置的時間窗口來檢測應用程序非正常的過遲或過早的操作。IWDG最適合應用于那些需要看門狗作為一個在主程序之外,能夠完全獨立工作,并且對時間精度要求較低的場合,比如檢測由程序跑飛或死機引起的故障。WWDG最適合那些需要看門狗在精確計時窗口時間內起作用的應用程序,比如檢測由外部干擾或不可預見的邏輯條件造成的應用程序背離正常運行序列而產生的軟件故障。
IWDG詳細介紹
IWDG通俗的解釋它是一個12位的遞減計數器,當計數器的值從某個值一直減到0的時候,就會產生一個系統復位信號,即IWDG_RESET。如果在計數器沒減到0之前,“刷新”計數器的值,就不會產生復位信號,“刷新”這個動作就是我們經常說的喂狗。IWDG直接由VDD電壓域供電,即使在MCU停止模式和待機模式下仍然能照常工作。
1、IWDG功能框圖解析
下圖是獨立看門狗的功能框圖,分6個部分進行說明。

① LSI時鐘:IWDG的時鐘由低速時鐘LSI驅動,即使主時鐘發生故障它也仍然有效,非常獨立。這里需要注意的是,由于RC振蕩器的原理和特性(根據溫度和環境會有一定的漂移),所以IWDG的定時時間并不一定非常精確,只適用于對時間精度要求比較低的場合。
② 計數器時鐘和IWDG_PR寄存器:遞減計數器的時鐘由LSI經過一個8位的預分頻器得到,預分頻器寄存器IWDG_PR的值決定分頻因子,分頻因子可以是:4、8、16、32、64、128、256。分頻因子(假設為W)和IWDG_PR值的關系是W = 4 * 2^IWDG_PR。
③ 狀態寄存器IWDG_SR:顧名思義,IWDG_SR表示獨立看門狗模塊的當前狀態,該寄存器只有位0:PVU(Prescaler Value Update)和位1:RVU(Reload Value Update)有效,且只能讀不能寫。PVU置1指示預分頻值的更新正在進行中,更新完成后由硬件置0。RVU置1表示重裝載值的更新正在進行中,更新完畢之后由硬件置0。只有當RVU或PVU等于0的時候才可以進行下一次更新操作。
④ 重載寄存器IWDG_RLR:重載寄存器是一個12位的寄存器,里面裝著要刷新到計數器的值,這個值的大小決定著獨立看門狗的溢出時間。溢出時間Tout(s) = (4 * 2^IWDG_PR) / fIWDG * IWDG_RLR。
⑤ 遞減計數器:IWDG的遞減計數器是一個12位寄存器,設置范圍是0~4095,一個計數器時鐘計數器就減1,當計數器減到0時,IWDG會產生一個系統復位信號IWDG_RESET,讓程序重新啟動運行,如果在計數器減到0之前刷新計數器的值(重新寫入新值),就不會產生復位信號,重新刷新計數器值的這個動作俗稱喂狗。
⑥ 密鑰寄存器IWDG_KR:密鑰寄存器IWDG_KR是獨立看門狗IWDG的一個核心控制寄存器,主要有三種寄存器值對應三種控制效果。

2、IWDG庫函數配置步驟
我們接下來介紹如何驅動CKS32F107xx系列產品的IWDG工作。具體配置步驟如下:
(1)解除寄存器寫保護(向IWDG_KR寫入0x5555)
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能寫權限
(2)設置IWDG預分頻因子和重裝載值
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //設置IWDG預分頻值
void IWDG_SetReload(uint16_t Reload); //設置IWDG重裝載值
此時可以計算出看門狗溢出時間,比如我們最終設定IWDG_PR值為 4,IWDG_RLR值625,那么就可以得到 Tout = (4 * 2^IWDG_PR) / 40KHz * IWDG_RLR = 64 / 40 * 625 = 1s,看門狗的溢出時間是1s,只要在1s之內,寫入0xAAAA到IWDG_KR,就不會觸發看門狗復位。這里需要提醒大家的是,由于看門狗的時鐘不是準確的40KHz,所以喂狗時間應適當提前。
(3)重載計數值喂狗(向IWDG_KR寫入0xAAAA)
IWDG_ReloadCounter(); //把重裝載寄存器IWDG_RLR的值放到計數器中
(4)開啟看門狗(向IWDG_KR寫入0xCCCC)
IWDG_Enable(); //使能 IWDG
通過上面4個步驟,就可以啟動IWDG獨立看門狗了,之后在程序里面就必須周期性的進行喂狗(一般會使用定時器定時的調用IWDG_ReloadCounter函數),否則將導致系統復位。注意IWDG在一旦開啟,系統運行時就不能再被關閉,想要關閉,只能重啟,并且重啟之后要迅速關閉IWDG。
實驗例程
為本期微課堂配套了一個例子,整體功能如下:
(1)系統上電后,LED會點亮,進入主程序while循環,不執行任何操作,無法執行喂狗程序,IWDG觸發系統復位,可以看到LED在不停的閃爍。
(2)按下USER按鍵,執行喂狗操作,LED常亮。

-
mcu
+關注
關注
147文章
18994瀏覽量
399998 -
寄存器
+關注
關注
31文章
5612瀏覽量
130163 -
定時器
+關注
關注
23文章
3368瀏覽量
124040 -
獨立看門狗
+關注
關注
0文章
26瀏覽量
4506
原文標題:MCU微課堂|CKS32F107XX系列獨立看門狗介紹
文章出處:【微信號:中科芯MCU,微信公眾號:中科芯MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
中科芯CKS32F107XX系列MCU的bxCAN介紹
MCU獨立看門狗和窗口看門狗的區別
MCU獨立看門狗與窗口看門狗的區別
中科芯CKS32F107XX系列MCU的獨立看門狗介紹
評論