看門狗簡介
中科芯CKS32F4xx系列產(chǎn)品內(nèi)部提供兩個看門狗定時器單元,獨立型看門狗IWDG(Independent Watchdog)和窗口型看門狗WWDG(Window Watchdog),它們在安全性、時間精確性和使用靈活性方面變現(xiàn)得非常優(yōu)秀。兩個看門狗定時器單元都可用來檢測由軟件錯誤引起的故障,具體表現(xiàn)為當(dāng)計數(shù)器達到給定的超時值或未能在指定時間窗口內(nèi)刷新計數(shù)器的值,會觸發(fā)系統(tǒng)復(fù)位。
IWDG由MCU內(nèi)部獨立RC振蕩器產(chǎn)生的低速時鐘LSI(Low-speed Internal)驅(qū)動,因此即使主時鐘發(fā)生故障它也仍然有效。而WWDG是由從APB1分頻后得到的時鐘驅(qū)動,通過可配置的時間窗口來檢測應(yīng)用程序非正常的過遲或過早的操作。IWDG最適合應(yīng)用于那些需要看門狗作為一個在主程序之外,能夠完全獨立工作,并且對時間精度要求較低的場合,比如檢測由程序跑飛或死機引起的故障。WWDG最適合那些需要看門狗在精確計時窗口時間內(nèi)起作用的應(yīng)用程序,比如檢測由外部干擾或不可預(yù)見的邏輯條件造成的應(yīng)用程序背離正常運行序列而產(chǎn)生的軟件故障。
本文主要介紹IWDG的應(yīng)用,
IWDG詳細介紹
IWDG通俗的解釋它是一個12位的遞減計數(shù)器,當(dāng)計數(shù)器的值從某個值一直減到0的時候,就會產(chǎn)生一個系統(tǒng)復(fù)位信號,即IWDG_RESET。如果在計數(shù)器沒減到0之前,“刷新”計數(shù)器的值,就不會產(chǎn)生復(fù)位信號,“刷新”這個動作就是我們經(jīng)常說的喂狗。IWDG直接由VDD電壓域供電,即使在MCU停止模式和待機模式下仍然能照常工作。?
1.IWDG功能框圖解析
下圖是獨立看門狗的功能框圖,分6個部分進行說明:
① LSI時鐘:IWDG的時鐘由專門的32KHz低速時鐘LSI驅(qū)動,即使主時鐘發(fā)生故障它也仍然有效,非常獨立。這里需要注意的是,由于RC振蕩器的原理和特性(根據(jù)溫度和環(huán)境會有一定的漂移),IWDG并不是嚴格準確的32KHz,只是我們在應(yīng)用的時候,默認以32KHz的頻率來估算。所以IWDG的定時時間并不一定非常精確,只適用于對時間精度要求比較低的場合。
② 計數(shù)器時鐘和IWDG_PR寄存器:遞減計數(shù)器的時鐘由LSI經(jīng)過一個8位的預(yù)分頻器得到,預(yù)分頻器寄存器IWDG_PR的值決定分頻因子,分頻因子可以是:4、8、16、32、64、128、256。分頻因子(假設(shè)為W)和IWDG_PR值的關(guān)系是W = 4 * 2^IWDG_PR。
③ 狀態(tài)寄存器IWDG_SR:顧名思義,IWDG_SR表示獨立看門狗模塊的當(dāng)前狀態(tài),該寄存器只有位0:PVU(Prescaler Value Update)和位1:RVU(Reload Value Update)有效,且只能讀不能寫。PVU置1指示預(yù)分頻值的更新正在進行中,更新完成后由硬件置0。RVU置1表示重裝載值的更新正在進行中,更新完畢之后由硬件置0。只有當(dāng)RVU或PVU等于0的時候才可以進行下一次更新操作。
④ 重載寄存器IWDG_RLR:重載寄存器是一個12位的寄存器,里面裝著要刷新到計數(shù)器的值,這個值的大小決定著獨立看門狗的溢出時間。溢出時間Tout(s)?= (4 * 2^IWDG_PR) / 32KHz * IWDG_RLR,根據(jù)這個公式,可以計算出當(dāng)LSI為32KHz時,IWDG的理論溢出時間最小值和最大值分別是125us和32.768s。
⑤ 遞減計數(shù)器:IWDG的遞減計數(shù)器是一個12位寄存器,設(shè)置范圍是0~4095,一個計數(shù)器時鐘計數(shù)器就減1,當(dāng)計數(shù)器減到0時,IWDG會產(chǎn)生一個系統(tǒng)復(fù)位信號IWDG_RESET,讓程序重新啟動運行,如果在計數(shù)器減到0之前刷新計數(shù)器的值(重新寫入新值),就不會產(chǎn)生復(fù)位信號,重新刷新計數(shù)器值的這個動作俗稱喂狗。
⑥ 密鑰寄存器IWDG_KR:密鑰寄存器IWDG_KR是獨立看門狗IWDG的一個核心控制寄存器,主要有三種寄存器值對應(yīng)三種控制效果。
2.IWDG庫函數(shù)配置步驟
我們接下來介紹如何驅(qū)動CKS32F4xx系列產(chǎn)品的IWDG工作。獨立看門狗相關(guān)的庫操作函數(shù)在文件cks32f4xx_iwdg.c和對應(yīng)的頭文件cks32f4xx_iwdg.h中。具體配置步驟如下:
(1)解除寄存器寫保護(向IWDG_KR寫入0x5555)
?
?
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能寫權(quán)限
?
?
(2)設(shè)置IWDG預(yù)分頻因子和重裝載值
?
?
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //設(shè)置IWDG預(yù)分頻值 void IWDG_SetReload(uint16_t Reload); //設(shè)置IWDG重裝載值
?
?
此時可以計算出看門狗溢出時間,比如我們最終設(shè)定IWDG_PR值為 4,IWDG_RLR值500,那么就可以得到 Tout =?(4 * 2^IWDG_PR) / 32KHz * IWDG_RLR = 64 / 32 * 500 = 1000ms,看門狗的溢出時間是1s,只要在一秒鐘之內(nèi),寫入0xAAAA到IWDG_KR,就不會觸發(fā)看門狗復(fù)位(一秒內(nèi)寫入多次也是可以的)。這里需要提醒大家的是,由于看門狗的時鐘不是準確的32KHz,所以喂狗時間應(yīng)適當(dāng)提前。
(3)重載計數(shù)值喂狗(向IWDG_KR寫入0xAAAA)?
?
?
IWDG_ReloadCounter(); //把重裝載寄存器IWDG_RLR的值放到計數(shù)器中
?
?
(4)開啟看門狗(向IWDG_KR寫入0xCCCC)
?
?
IWDG_Enable(); //使能 IWDG
?
?
通過上面4個步驟,就可以啟動CKS32F4的IWDG獨立看門狗了,之后在程序里面就必須周期性的進行喂狗(一般會使用定時器定時的調(diào)用IWDG_ReloadCounter函數(shù)),否則將導(dǎo)致系統(tǒng)復(fù)位。注意IWDG在一旦開啟,系統(tǒng)運行時就不能再被關(guān)閉,想要關(guān)閉,只能重啟,并且重啟之后要迅速關(guān)閉IWDG。
編輯:黃飛
評論