看門狗簡(jiǎn)介
中科芯CKS32F4xx系列產(chǎn)品內(nèi)部提供兩個(gè)看門狗定時(shí)器單元,獨(dú)立型看門狗IWDG(Independent Watchdog)和窗口型看門狗WWDG(Window Watchdog),它們?cè)诎踩?、時(shí)間精確性和使用靈活性方面變現(xiàn)得非常優(yōu)秀。兩個(gè)看門狗定時(shí)器單元都可用來(lái)檢測(cè)由軟件錯(cuò)誤引起的故障,具體表現(xiàn)為當(dāng)計(jì)數(shù)器達(dá)到給定的超時(shí)值或未能在指定時(shí)間窗口內(nèi)刷新計(jì)數(shù)器的值,會(huì)觸發(fā)系統(tǒng)復(fù)位。
IWDG由MCU內(nèi)部獨(dú)立RC振蕩器產(chǎn)生的低速時(shí)鐘LSI(Low-speed Internal)驅(qū)動(dòng),因此即使主時(shí)鐘發(fā)生故障它也仍然有效。而WWDG是由從APB1分頻后得到的時(shí)鐘驅(qū)動(dòng),通過(guò)可配置的時(shí)間窗口來(lái)檢測(cè)應(yīng)用程序非正常的過(guò)遲或過(guò)早的操作。IWDG最適合應(yīng)用于那些需要看門狗作為一個(gè)在主程序之外,能夠完全獨(dú)立工作,并且對(duì)時(shí)間精度要求較低的場(chǎng)合,比如檢測(cè)由程序跑飛或死機(jī)引起的故障。WWDG最適合那些需要看門狗在精確計(jì)時(shí)窗口時(shí)間內(nèi)起作用的應(yīng)用程序,比如檢測(cè)由外部干擾或不可預(yù)見(jiàn)的邏輯條件造成的應(yīng)用程序背離正常運(yùn)行序列而產(chǎn)生的軟件故障。
本文主要介紹IWDG的應(yīng)用,
IWDG詳細(xì)介紹
IWDG通俗的解釋它是一個(gè)12位的遞減計(jì)數(shù)器,當(dāng)計(jì)數(shù)器的值從某個(gè)值一直減到0的時(shí)候,就會(huì)產(chǎn)生一個(gè)系統(tǒng)復(fù)位信號(hào),即IWDG_RESET。如果在計(jì)數(shù)器沒(méi)減到0之前,“刷新”計(jì)數(shù)器的值,就不會(huì)產(chǎn)生復(fù)位信號(hào),“刷新”這個(gè)動(dòng)作就是我們經(jīng)常說(shuō)的喂狗。IWDG直接由VDD電壓域供電,即使在MCU停止模式和待機(jī)模式下仍然能照常工作。?
1.IWDG功能框圖解析
下圖是獨(dú)立看門狗的功能框圖,分6個(gè)部分進(jìn)行說(shuō)明:

① LSI時(shí)鐘:IWDG的時(shí)鐘由專門的32KHz低速時(shí)鐘LSI驅(qū)動(dòng),即使主時(shí)鐘發(fā)生故障它也仍然有效,非常獨(dú)立。這里需要注意的是,由于RC振蕩器的原理和特性(根據(jù)溫度和環(huán)境會(huì)有一定的漂移),IWDG并不是嚴(yán)格準(zhǔn)確的32KHz,只是我們?cè)趹?yīng)用的時(shí)候,默認(rèn)以32KHz的頻率來(lái)估算。所以IWDG的定時(shí)時(shí)間并不一定非常精確,只適用于對(duì)時(shí)間精度要求比較低的場(chǎng)合。
② 計(jì)數(shù)器時(shí)鐘和IWDG_PR寄存器:遞減計(jì)數(shù)器的時(shí)鐘由LSI經(jīng)過(guò)一個(gè)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ú)立看門狗模塊的當(dāng)前狀態(tài),該寄存器只有位0:PVU(Prescaler Value Update)和位1:RVU(Reload Value Update)有效,且只能讀不能寫。PVU置1指示預(yù)分頻值的更新正在進(jìn)行中,更新完成后由硬件置0。RVU置1表示重裝載值的更新正在進(jìn)行中,更新完畢之后由硬件置0。只有當(dāng)RVU或PVU等于0的時(shí)候才可以進(jìn)行下一次更新操作。
④ 重載寄存器IWDG_RLR:重載寄存器是一個(gè)12位的寄存器,里面裝著要刷新到計(jì)數(shù)器的值,這個(gè)值的大小決定著獨(dú)立看門狗的溢出時(shí)間。溢出時(shí)間Tout(s)?= (4 * 2^IWDG_PR) / 32KHz * IWDG_RLR,根據(jù)這個(gè)公式,可以計(jì)算出當(dāng)LSI為32KHz時(shí),IWDG的理論溢出時(shí)間最小值和最大值分別是125us和32.768s。
⑤ 遞減計(jì)數(shù)器:IWDG的遞減計(jì)數(shù)器是一個(gè)12位寄存器,設(shè)置范圍是0~4095,一個(gè)計(jì)數(shù)器時(shí)鐘計(jì)數(shù)器就減1,當(dāng)計(jì)數(shù)器減到0時(shí),IWDG會(huì)產(chǎn)生一個(gè)系統(tǒng)復(fù)位信號(hào)IWDG_RESET,讓程序重新啟動(dòng)運(yùn)行,如果在計(jì)數(shù)器減到0之前刷新計(jì)數(shù)器的值(重新寫入新值),就不會(huì)產(chǎn)生復(fù)位信號(hào),重新刷新計(jì)數(shù)器值的這個(gè)動(dòng)作俗稱喂狗。
⑥ 密鑰寄存器IWDG_KR:密鑰寄存器IWDG_KR是獨(dú)立看門狗IWDG的一個(gè)核心控制寄存器,主要有三種寄存器值對(duì)應(yīng)三種控制效果。
2.IWDG庫(kù)函數(shù)配置步驟
我們接下來(lái)介紹如何驅(qū)動(dòng)CKS32F4xx系列產(chǎn)品的IWDG工作。獨(dú)立看門狗相關(guān)的庫(kù)操作函數(shù)在文件cks32f4xx_iwdg.c和對(duì)應(yīng)的頭文件cks32f4xx_iwdg.h中。具體配置步驟如下:
(1)解除寄存器寫保護(hù)(向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í)可以計(jì)算出看門狗溢出時(shí)間,比如我們最終設(shè)定IWDG_PR值為 4,IWDG_RLR值500,那么就可以得到 Tout =?(4 * 2^IWDG_PR) / 32KHz * IWDG_RLR = 64 / 32 * 500 = 1000ms,看門狗的溢出時(shí)間是1s,只要在一秒鐘之內(nèi),寫入0xAAAA到IWDG_KR,就不會(huì)觸發(fā)看門狗復(fù)位(一秒內(nèi)寫入多次也是可以的)。這里需要提醒大家的是,由于看門狗的時(shí)鐘不是準(zhǔn)確的32KHz,所以喂狗時(shí)間應(yīng)適當(dāng)提前。
(3)重載計(jì)數(shù)值喂狗(向IWDG_KR寫入0xAAAA)?
?
?
IWDG_ReloadCounter(); //把重裝載寄存器IWDG_RLR的值放到計(jì)數(shù)器中
?
?
(4)開啟看門狗(向IWDG_KR寫入0xCCCC)
?
?
IWDG_Enable(); //使能 IWDG
?
?
通過(guò)上面4個(gè)步驟,就可以啟動(dòng)CKS32F4的IWDG獨(dú)立看門狗了,之后在程序里面就必須周期性的進(jìn)行喂狗(一般會(huì)使用定時(shí)器定時(shí)的調(diào)用IWDG_ReloadCounter函數(shù)),否則將導(dǎo)致系統(tǒng)復(fù)位。注意IWDG在一旦開啟,系統(tǒng)運(yùn)行時(shí)就不能再被關(guān)閉,想要關(guān)閉,只能重啟,并且重啟之后要迅速關(guān)閉IWDG。
編輯:黃飛
電子發(fā)燒友App




評(píng)論