1.獨(dú)立看門狗介紹
1.1.獨(dú)立看門狗簡(jiǎn)介
看門狗定時(shí)器(WDT,Watch Dog Timer)是單片機(jī)的組成部分,它實(shí)際上是一個(gè)計(jì)數(shù)器,一般給看門狗一個(gè)數(shù)值,程序開始運(yùn)行后看門狗開始倒計(jì)時(shí)。如果程序運(yùn)行正常,過(guò)一段時(shí)間CPU應(yīng)發(fā)出指令讓看門狗復(fù)位,重新開始計(jì)數(shù),也就是所謂的“喂狗”。如果看門狗減到0就認(rèn)為程序沒(méi)有正常工作,強(qiáng)制整個(gè)系統(tǒng)復(fù)位。獨(dú)立看門狗由專用低速時(shí)鐘(LSI)驅(qū)動(dòng),計(jì)時(shí)主時(shí)鐘發(fā)生故障它也仍然有效。
看門狗主要是用于在發(fā)生系統(tǒng)軟件故障時(shí),將系統(tǒng)復(fù)位。也可以用于將系統(tǒng)從休眠或空閑模式喚醒。IWDG主要應(yīng)用于那些需要看門狗作為一個(gè)在主程序之外,能夠完全獨(dú)立工作,并且對(duì)時(shí)間精度要求較低的場(chǎng)合。
1.2.獨(dú)立看門狗功能描述
獨(dú)立看門狗是自由運(yùn)行的遞減計(jì)數(shù)器,時(shí)鐘由獨(dú)立的RC振蕩器提供(可在停止和待機(jī)模式下工作),看門狗被激活后,在計(jì)數(shù)器計(jì)數(shù)到0x000時(shí)產(chǎn)生復(fù)位。
在鍵寄存器(IWDG_KR)中寫入0xCCCC,開始啟用獨(dú)立看門狗;此時(shí)計(jì)數(shù)器開始從其復(fù)位值0xFFF遞減計(jì)數(shù)。當(dāng)計(jì)數(shù)器計(jì)數(shù)到末尾0x000時(shí),會(huì)產(chǎn)生一個(gè)復(fù)位信號(hào)(IWDG_RESET)。無(wú)論何時(shí),只要在鍵寄存器IWDG_KR中寫入0xAAAA,IWDG_RLR中的值就會(huì)被重新加載到計(jì)數(shù)器,從而避免產(chǎn)生看門狗復(fù)位。
1.3.獨(dú)立看門狗工作框圖
看門狗處于VDD供電區(qū),即在停機(jī)和待機(jī)模式時(shí)仍然能正常工作。
我們可以看到,這個(gè)獨(dú)立看門狗的工作框圖和定時(shí)器的工作框圖其實(shí)差不多,都是由預(yù)分頻器、狀態(tài)寄存器、重裝載寄存器等組成,其工作原理和定時(shí)器的工作原理也是差不多的,都是通過(guò)時(shí)鐘輸入LSI(具體時(shí)鐘頻率要去看原理圖上的晶振的數(shù)值),通過(guò)分頻器,分頻出供獨(dú)立看門狗使用的時(shí)鐘頻率,然后時(shí)鐘開始計(jì)數(shù)遞減,當(dāng)遞減到0的時(shí)候會(huì)發(fā)生復(fù)位;如果在遞減到0之前給看門狗一個(gè)更新值,那么看門狗就會(huì)將重裝載寄存器中的數(shù)值加載到計(jì)數(shù)器中重新開始計(jì)數(shù),這樣就不會(huì)復(fù)位。
2.獨(dú)立看門狗實(shí)驗(yàn)
實(shí)驗(yàn)?zāi)康模涸谏想娨院?,PA2口的LED燈會(huì)亮一下,然后就會(huì)進(jìn)入while循環(huán),在while循環(huán)中,需要不斷按下PB6處的按鍵喂狗,如果不喂狗,則會(huì)使程序復(fù)位,PA2口的LED燈會(huì)重新復(fù)位。
2.1.cubemx配置
2.2.具體代碼實(shí)現(xiàn)
這個(gè)是IWDG的初始化代碼,我們追進(jìn)去看下。
接著往下追這個(gè)START函數(shù)
接著追這個(gè)鍵值
可以看到鍵值為0xCCC,這說(shuō)明在初始化的時(shí)候,就已經(jīng)開啟了看門狗了,所以我們只需要寫主函數(shù)的內(nèi)容來(lái)實(shí)現(xiàn)我們的實(shí)驗(yàn)?zāi)康木涂梢粤?。具體代碼如下:
這樣就可以實(shí)現(xiàn)獨(dú)立看門狗實(shí)驗(yàn)了,我們必須每次都按下PB6的按鍵進(jìn)行喂狗操作,否則按照我們的設(shè)定,大概每過(guò)3000ms,程序就會(huì)被獨(dú)立看門狗強(qiáng)制復(fù)位。
3.獨(dú)立看門狗的相關(guān)寄存器
獨(dú)立看門狗的寄存器包括以下幾個(gè):
- 鍵寄存器(IWDG_KR)
- 預(yù)分頻寄存器(IWDG_PR)
- 重裝載寄存器(IWDG_RLR)
- 狀態(tài)寄存器(IWDG_SR)
3.1.鍵寄存器(IWDG_KR)
這個(gè)鍵寄存器就是通過(guò)對(duì)這個(gè)寄存器寫入關(guān)鍵字來(lái)控制看門狗的功能的。
- 當(dāng)寫入0XCCCC就啟動(dòng)看門狗的工作;
- 當(dāng)寫入0X5555時(shí)表示允許訪問(wèn)IWDG_PR和IWDG_RLR寄存器,只有允許訪問(wèn)這兩個(gè)地址以后,才能改變獨(dú)立看門狗的預(yù)分頻值和重裝載值;
- 當(dāng)寫入0XAAAA的時(shí)候,獨(dú)立看門狗進(jìn)行更新,防止產(chǎn)生復(fù)位。
因此獨(dú)立看門狗只有低16位是有效的,高16位保留。
3.2.預(yù)分頻寄存器
預(yù)分頻器低3位有效,用于配置預(yù)分頻因子,通過(guò)配置預(yù)分頻因子,可以將LSI的時(shí)鐘進(jìn)行分頻,然后給IWDG時(shí)鐘脈沖,具體配置如上圖所示。
上面這個(gè)圖就是設(shè)置不同的PR位產(chǎn)生的不同的分頻后最長(zhǎng)計(jì)時(shí)時(shí)間和最短計(jì)時(shí)時(shí)間。
但是注意,我們?cè)谇懊嫦到y(tǒng)時(shí)鐘中介紹過(guò),因?yàn)長(zhǎng)SI是用RC振蕩器來(lái)產(chǎn)生時(shí)鐘脈沖的,但是RC振蕩器并不穩(wěn)定,極其容易受到溫度和其他因素的影響,因此,我們需要考慮LSI的波動(dòng)因素,一般如果LSI是32.768KHZ的話,我們就需要考慮其波動(dòng)范圍在15~47KHZ的范圍。
3.3.重裝載寄存器(IWDG_RLR)
重裝載寄存器是用來(lái)存放重裝載值的。
- 當(dāng)IWDG的值減到0以后,系統(tǒng)復(fù)位,IWDG的重裝載寄存器的值就會(huì)加載到遞減計(jì)數(shù)器中進(jìn)行重新計(jì)數(shù)。
- 當(dāng)IWDG及時(shí)“喂狗”,以后,IWDG的重裝載寄存器的值也會(huì)加載到遞減計(jì)數(shù)器中,使IWDG重新計(jì)數(shù)。
3.4.狀態(tài)寄存器(IWDG_SR)
狀態(tài)寄存器的相關(guān)用法在上圖中的注中已經(jīng)表名,這里就不再贅述了。
4.窗口看門狗介紹
4.1.窗口看門狗簡(jiǎn)介
窗口看門狗(WWDG)通常被用來(lái)監(jiān)測(cè)由外部干擾或不可預(yù)見的邏輯條件造成的應(yīng)用程序背離正常的運(yùn)行序列而產(chǎn)生的軟件故障。除非遞減計(jì)數(shù)器的值在 T6 位(WWDG->CR 的第六位)變成 0 前被刷新,看門狗電路在達(dá)到預(yù)置的時(shí)間周期時(shí),會(huì)產(chǎn)生一個(gè) MCU 復(fù)位。在遞減計(jì)數(shù)器達(dá)到窗口配置寄存器(WWDG->CFR)數(shù)值之前,如果 7 位的遞減計(jì)數(shù)器數(shù)值(在控制寄存器中)被刷新, 那么也將產(chǎn)生一個(gè) MCU 復(fù)位。
上面的一段文字說(shuō)的比較抽象,我們需要結(jié)合上圖來(lái)看,WWDG中有兩個(gè)寄存器,一個(gè)是WWDG_CR寄存器和WWDG_CFR寄存器。
WWDG也會(huì)像IWDG一樣進(jìn)行遞減計(jì)數(shù),但是由于WWDG只有7位可以用于計(jì)數(shù),那么也就是只能從0X7F來(lái)進(jìn)行遞減,如果CR寄存器的T6位減到0,也就是當(dāng)計(jì)數(shù)器減到0X40之后的0X3F,那么WWDG就會(huì)使系統(tǒng)復(fù)位。
并且,WWDG的CFR位也會(huì)進(jìn)行設(shè)置數(shù)值,這個(gè)設(shè)置的數(shù)值就是上窗口,如果在上窗口之前進(jìn)行了喂狗操作,那么系統(tǒng)也會(huì)產(chǎn)生復(fù)位的操作,這就形成了一個(gè)所謂的窗口,這也就是窗口看門狗的由來(lái)。
所以我們必須在設(shè)置的上窗口值之后和0X3F之前進(jìn)行喂狗,這樣才不會(huì)產(chǎn)生復(fù)位。
4.2.窗口看門狗的結(jié)構(gòu)框圖
由于WWDG是掛載到PCLK1總線上的,PCLK1總線最大的時(shí)鐘頻率是36MHZ,我們一般配置也是配置為36MHZ。
獨(dú)立看門狗從PCLK1進(jìn)行時(shí)鐘輸入,然后經(jīng)過(guò)看門狗預(yù)分頻器進(jìn)行分頻,然后提供給遞減計(jì)數(shù)器CNT時(shí)鐘脈沖來(lái)產(chǎn)生遞減計(jì)數(shù),然后通過(guò)檢測(cè)CR寄存器的T6位有無(wú)變?yōu)?來(lái)檢測(cè)是否需要進(jìn)行復(fù)位的操作;并且如果在上窗口值之前進(jìn)行了喂狗操作,那么系統(tǒng)也會(huì)進(jìn)行復(fù)位的操作。
4.3.計(jì)數(shù)器和窗口值的設(shè)置
- 當(dāng)遞減計(jì)數(shù)器遞減到0x40的時(shí)候,還不會(huì)馬上產(chǎn)生復(fù)位,如果使能了提前喚醒中斷,CFR位9EWI置1,則產(chǎn)生提前喚醒中斷。
- 所以在提前喚醒中斷的處理程序中我們需要做最重要的工作,比如保存重要數(shù)據(jù)或者進(jìn)行報(bào)警等操作,因此這個(gè)中斷也被稱為死前中斷。
- 下窗口的值是固定的0x40,上窗口的值可以改變,具體由配置寄存器CFR的位6:0設(shè)置,其值必須大于0x40,如果小于或者等于0x40就失去了窗口的價(jià)值,也不能大于計(jì)數(shù)器的值,所以必須小于0x7F。
5.窗口看門狗實(shí)驗(yàn)
實(shí)驗(yàn)要求:開啟stm32的窗口看門狗,并使能喚醒中斷。主程序正常運(yùn)行時(shí)喂狗,按鍵按下后進(jìn)入中斷,用while循環(huán)模擬系統(tǒng)故障死機(jī),此時(shí)將觸發(fā)喚醒中斷并產(chǎn)生復(fù)位,用LED燈顯示喚醒中斷的觸發(fā)。
5.1.cubemx配置
其他設(shè)置和以前一樣。
5.2.具體代碼實(shí)現(xiàn)
上面的是main.c函數(shù)匯總
然后我們要來(lái)實(shí)現(xiàn)喚醒中斷和外部中斷函數(shù)
其中喚醒中斷我們放在了wwdg.c的文件中,外部中斷我們放在了main.c的文件中。
喚醒中斷我們還是需要在stm32f10x_it.c中去找,然后按照原來(lái)的方法找到wwdg的回調(diào)函數(shù),然后我們需要重寫回調(diào)函數(shù)。
下面是喚醒中斷的具體代碼:
然后我們來(lái)實(shí)現(xiàn)外部中斷:
6.窗口看門狗的相關(guān)寄存器
窗口看門狗的寄存器包括以下的寄存器:
- 控制寄存器(WWDG_CR)
- 配置寄存器(WWDG_CFR)
- 狀態(tài)寄存器(WWDG_SR)
6.1.控制寄存器(WWDG_CR)
控制寄存器,顧名思義是用來(lái)控制WWDG的,其中低7位是用來(lái)存放WWDG計(jì)數(shù)器中的計(jì)數(shù)值的,當(dāng)CR中的T6位的值變?yōu)?的時(shí)候,那么系統(tǒng)就會(huì)復(fù)位。第7位的值是用來(lái)使能看門狗的。
6.2.配置寄存器(WWDG_CFR)
配置寄存器的低7位是用來(lái)存放上窗口值的;第7、8位是用來(lái)配置預(yù)分頻器的值的,第9位是用來(lái)配置喚醒中斷使能的。
6.3.狀態(tài)寄存器(WWDG_SR)
狀態(tài)寄存器是用來(lái)進(jìn)行標(biāo)志提前喚醒中斷的,只有一個(gè)位,了解即可,我們平常也用不到。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-583637.html
這篇文章就主要介紹了stm32中看門狗的相關(guān)知識(shí),希望各位大佬多多批評(píng)指正?。?!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-583637.html
到了這里,關(guān)于手把手教你開發(fā)stm32——看門狗(基于hal庫(kù))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!