SATM32單片機的看門狗有獨立看門狗和窗口看門狗之分,這兩者的工作原理卻完全不同,今天來看一下他們的具體區(qū)別和配置方法。
▍STM32獨立看門狗
由專門的低速時鐘(LSI)驅(qū)動,即便是主時鐘發(fā)生故障它仍能夠有效,所以此狗狗可以工作在與主時鐘無關(guān)的要求下,或者待機模塊下等,所以它叫獨立看門狗,注意一旦開啟此看門狗則只能由MCU復位后才清除,讓它不再工作。
它的時鐘是一個內(nèi)部RC時鐘,它會在30KHZ到60KHZ之間變化,并非是精確的40KHZ,而只是一般計算時取40KHZ。
獨立看門狗需設(shè)置四個寄存器如下:
其中,預分頻寄存器(IWDG_PR),最低三位PR[2:0](Prescaler divider)有效,可設(shè)置有8種不同的計數(shù)器時鐘預分頻因子。
重裝載寄存器(IWDG_RLR)低12位RL[11:0]: 看門狗計數(shù)器重裝載值 (Watchdog counter reload value) 有效,用來設(shè)置計數(shù)器的重裝載值。
注意要設(shè)置以上兩個寄存器的值需滿足兩個條件,詳見如下:
鍵寄存器(IWDG_KR),用來控制去除IWDG_PR和IWDG_RLR寫保護功能以便正常寫值,向此寄存器寫入0x5555則暫時去除IWDG_PR和IWDG_RLR的寫保護功能才可向兩個寄存器中寫值。
當向此寄存器寫入0xAAAA則IWDG_RLR的值會重裝載,防止MCU復位,向入0xCCCC是開啟狗立看門狗動作。
狀態(tài)寄存器(IWDG_SR)最低兩位有效RVU: 看門狗計數(shù)器重裝載值更新 (Watchdog counter reload value update) 標識位和PVU: 看門狗預分頻值更新(Watchdog prescaler value update) 標識位,分別用來指示此時是否可向IWDG_RLR 和 IWDG_PR寫值,此寄存器由硬件置1與清0,只有當為0時才可向上面兩個寄存器寫值。
它的初始化過程大致如下 :
//時間計算(大概):Tout=((4*2^prer)*rlr)/40(ms)voidIWDG_Init(u8prer,u16rlr){IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);IWDG_SetPrescaler(prer);IWDG_SetReload(rlr);IWDG_ReloadCounter();IWDG_Enable();}
喂狗可通過調(diào)用如下函數(shù)進行:
IWDG_ReloadCounter();//reload
另外要注意不要使用硬件時鐘中斷喂狗,因為硬件時鐘中斷一般都有較高優(yōu)先級且獨立于主控程序,這樣有時會出現(xiàn)主控程序雖然跑飛了,但仍能夠正常喂狗的現(xiàn)象。
獨立看門狗能夠在一定程度上監(jiān)控著程序正常運行,然而我認為更加強大,應用更靈活及更能保證程序穩(wěn)定運行的還屬窗口看門狗,雖然它開始時不太好理解。
▍STM32窗口看門狗
共三個寄存器,如下圖:
看似簡單,但設(shè)置及應用起來有不少玄機。
控制寄存器(WWDG_CR)中的值必須在0xFF與0xC0之間, 因為它的第0至第6位為遞減計數(shù)器CNT,在它的第6位變?yōu)?時將產(chǎn)生復位,所以在初始化時需要為1,第7位WDGA是用來設(shè)置啟動或禁止窗口看門狗的,當為1進才會啟動窗口看門狗,所以第6和第7位都需為1,即WWDG_CR 的值需要大于等于0xC0 。
配置寄存器(WWDG_CFR) 第0至第6位 是設(shè)置窗口邊界值用的,只有當遞減計數(shù)器CNT的值小于邊界值時才可以喂狗,過早不行,狗還不餓,撐死了。
并且7位遞減計數(shù)器CNT減少到0x3F時即T6位變?yōu)?,此時MCU也會復位,過晚了,狗餓死了。
所以必須在指定的時間范圍喂狗,過早或過晚都將產(chǎn)生復位,而這樣設(shè)計可以減少軟件跑飛了卻仍能夠歪打正著地喂狗的發(fā)生概率。
狀態(tài)寄存器(WWDG_CFR) 只用到了第0位,EWIF(Early wakeup interrupt flag )是提前喚醒中斷標識,當遞減計數(shù)器CNT的值到達0X40(若再減少一次則T6位變?yōu)?,產(chǎn)生復位)時此位由硬件置1,且需用軟件清0,注意無論中斷是否使能此位都會被硬件置1。
而提前喚醒中斷使能設(shè)置是在配置寄存器(WWDG_CFR)第9位EWI(Early wakeup interrupt),此位需由軟件置1,則會在當遞減計數(shù)器CNT的值到達0X40時產(chǎn)生中斷,并且與EWIF不同,此位是由硬件清0。
另外控制寄存器(WWDG_CR)中第7位WDGA(Activation bit)激活位,需用軟件來置1,以啟動窗口看門狗,并且一旦啟動后,只能在復位或重啟后由硬件來清0。
配置寄存器(WWDG_CFR)的第8位和第7位WDGTB[1:0]用來設(shè)置時基(Timer base)預分頻數(shù)。
以上描述可參考下圖以更清晰的理解:
窗口看門狗應用時還要注意算準最小與最大喂狗時間,以便正確地喂狗,如下:
在PCLK1頻率為36MHz 時,則
上窗口時間:T_min = 4096 * (2^WDGTB)*(WWDG_CR[6:0] - WWDG_CFR[6:0])/36 (us)下窗口時間:T_max = 4096 * (2^WDGTB)*(WWDG_CR[6:0] - 0x40)/36 (us) 。
喂狗動作需在這段時間之間進行,而喂狗動作為向控制寄存器(WWDG_CR)中寫值。
窗口看門狗中斷函數(shù)void WWDG_IRQHandler(void);是用來做什么的呢。
窗口看門狗中斷函數(shù)是在遞減計數(shù)器減少到0x40是被調(diào)用,因為它本身計數(shù)就比較慢,所以離數(shù)到0x3F復位還有一段時間,我認為這樣設(shè)計是為MCU復位之前留下一點時間,能夠使工程設(shè)計人員根據(jù)需要在中斷函數(shù)保存一些重要的數(shù)據(jù),這樣在復位后MCU可知道系統(tǒng)因異常復位的某此狀態(tài),以使系統(tǒng)有更高穩(wěn)定性。
并且我覺得在窗口看門狗中斷函數(shù)中喂狗沒有什么意義,程序本來已經(jīng)不按正常運行了,還在中斷函數(shù)中喂狗防止復位只會錯上加錯,不好好利用它干點正事, 更是浪費資源。
這點上我個人認為不要被點原子示例代碼誤導哦,但其還是有部分借鑒意義的,以下為初始化相關(guān)代碼:
//窗口看門狗中斷服務(wù)設(shè)置程序voidWWDG_NVIC_Init(){NVIC_InitTypeDefNVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn;//WWDG中斷NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//搶占2子優(yōu)先級3組2NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;//搶占2,子優(yōu)先級3,組2NVIC_Init(&NVIC_InitStructure);//NVIC初始化}
//保存WWDG計數(shù)器的設(shè)置值,默認為最大.u8WWDG_CNT=0x7f;
//初始化窗口看門狗//tr:T[6:0],計數(shù)器值//wr:W[6:0],窗口值//fprer:分頻系數(shù)(WDGTB),僅最低2位有效//Fwwdg=PCLK1/(4096*2^fprer).voidWWDG_Init(u8tr,u8wr,u32fprer){RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);//WWDG時鐘使能WWDG_CNT=tr&WWDG_CNT;//初始化WWDG_CNT.WWDG_SetPrescaler(fprer);//設(shè)置IWDG預分頻值WWDG_SetWindowValue(wr);//設(shè)置窗口值WWDG_Enable(WWDG_CNT);//使能看門狗,設(shè)置counter WWDG_ClearFlag();//清除提前喚醒中斷標志位(注:若沒有此句則會在初始化后先進入中斷一次)WWDG_NVIC_Init();//初始化窗口看門狗NVICWWDG_EnableIT();//開啟窗口看門狗中斷}
以上代碼朋友們也可以跳到庫函數(shù)代碼中自己研究下,另外要說明下的是WWDG_EnableIT(); 函數(shù)相關(guān)代碼
#defineCFR_EWI_BB(PERIPH_BB_BASE+(CFR_OFFSET*32)+(EWI_BitNumber*4))
責任編輯:彭菁
-
單片機
+關(guān)注
關(guān)注
6067文章
44991瀏覽量
650438 -
看門狗
+關(guān)注
關(guān)注
10文章
583瀏覽量
71799 -
STM32
+關(guān)注
關(guān)注
2293文章
11032瀏覽量
364914 -
時鐘
+關(guān)注
關(guān)注
11文章
1901瀏覽量
133231
發(fā)布評論請先 登錄
單片機應用中看門狗技術(shù)

STM32看門狗配置(獨立看門狗IWDG和窗口看門狗WWDG)

STM32的看門狗配置詳情解說

PIC單片機之看門狗_看門狗定時器工作原理

STM32單片機中的獨立看門狗與窗口看門狗有哪些不同之處
使用STM32單片機實現(xiàn)獨立看門狗實驗的教程說明

基于STM32、FreeRTOS 實現(xiàn)硬件看門狗+軟件看門狗監(jiān)測多任務(wù)的方法
STM32L4單片機配置STOP模式下停止看門狗計數(shù)

STC單片機看門狗

STM32學習心得十六:獨立看門狗實驗

評論