前言
使用的是正點(diǎn)原子的探索者開發(fā)板進(jìn)行學(xué)習(xí),芯片:STM32F407ZGTx。
學(xué)習(xí)說明此文檔為本人的學(xué)習(xí)筆記,注重實(shí)踐,關(guān)于理論部分會給出相應(yīng)的學(xué)習(xí)鏈接。
注:本文檔添加了對代碼的在線調(diào)試功能,有助于大家更好理解相關(guān)寄存器和重要變量值的變化。
理論學(xué)習(xí)
一、看門狗(WDG)簡介
在由單片機(jī)構(gòu)成的微型計(jì)算機(jī)系統(tǒng)中,由于單片機(jī)的工作常常會受到來自外界電磁場的干擾,造成程序的跑飛,而陷入死循環(huán),程序的正常運(yùn)行被打斷,由單片機(jī)控制的系統(tǒng)無法繼續(xù)工作,會造成整個系統(tǒng)的陷入停滯狀態(tài),發(fā)生不可預(yù)料的后果,所以出于對單片機(jī)運(yùn)行狀態(tài)進(jìn)行實(shí)時監(jiān)測的考慮,便產(chǎn)生了一種專門用于監(jiān)測單片機(jī)程序運(yùn)行狀態(tài)的模塊或者芯片,俗稱“看門狗”(watchdog) 。
在啟動正常運(yùn)行的時候,系統(tǒng)不能復(fù)位,可以通過看門狗來復(fù)位單片機(jī)。
在系統(tǒng)跑飛(程序異常執(zhí)行)的情況,系統(tǒng)復(fù)位,程序重新執(zhí)行。
具有兩個嵌入式看門狗外設(shè),具有安全性高、定時準(zhǔn)確及使用靈活的優(yōu)點(diǎn)。兩個看門狗外設(shè)(獨(dú)立和窗口)均可用于檢測并解決由軟件錯誤導(dǎo)致的故障;當(dāng)計(jì)數(shù)器達(dá)到給定的超時值時,觸發(fā)一個中斷(僅適用于窗口型看門狗)或產(chǎn)生系統(tǒng)復(fù)位。
二、獨(dú)立看門狗(IWDG)
2.1 IWDG簡介
獨(dú)立看門狗 (IWDG) 由其專用低速時鐘 (LSI) 驅(qū)動,因此即便在主時鐘發(fā)生故障時仍然保持
工作狀態(tài)。 IWDG 最適合應(yīng)用于那些需要看門狗作為一個在主程序之外,能夠完全獨(dú)立工作,并且對時間精度要求較低的場合。
2.2 IWDG特征
自由運(yùn)行遞減計(jì)數(shù)器
時鐘由獨(dú)立RC振蕩器提供(可在待機(jī)和停止模式下運(yùn)行)
當(dāng)遞減計(jì)數(shù)器值達(dá)到0x000時產(chǎn)生部位(看門狗激活時)
2.3 IWDG功能
在鍵值寄存器(IWDG_KR)中寫入0xCCCC,開始啟用獨(dú)立看門狗。此時計(jì)數(shù)器開始從其復(fù)位值0xFFF遞減,當(dāng)計(jì)數(shù)器值計(jì)數(shù)到尾值0x000時會產(chǎn)生一個復(fù)位信號(IWDG_RESET)。
無論何時,只要在鍵值寄存器IWDG_KR中寫入0xAAAA(通常說的喂狗), 自動重裝載寄存器IWDG_RLR的值就會重新加載到計(jì)數(shù)器,從而避免看門狗復(fù)位。
如果程序異常,就無法正常喂狗,從而系統(tǒng)復(fù)位。
硬件看門狗
如果通過器件選項(xiàng)位使能“硬件看門狗”功能,上電時將自動使能看門狗;如果在計(jì)數(shù)器計(jì)
數(shù)結(jié)束前,若軟件沒有 向關(guān)鍵字寄存器寫入相應(yīng)的值(喂狗) ,則系統(tǒng)會產(chǎn)生復(fù)位。
寄存器訪問保護(hù)
IWDG_PR 和 IWDG_RLR 寄存器具有寫訪問保護(hù)。 若要修改寄存器,必須首先對 IWDG_KR
寄存器寫入代碼 0x5555 。而寫入其他值則會破壞該序列,從而使寄存器訪問保護(hù)再次生效。這意味著重裝載操作(即寫入 0xAAAA )也會啟動寫保護(hù)功能。
狀態(tài)寄存器指示預(yù)分頻值和遞減計(jì)數(shù)器是否正在被更新。
調(diào)試模式(請參考芯片手冊)
注意: 看門狗功能由 V DD 電壓域供電,在停止模式和待機(jī)模式下仍能工作。
2.4 IWDG相關(guān)寄存器
鍵值寄存器(IWDG_KR): 0~15位有效(只寫,讀為0000h)
必須每隔一段時間通過軟件對這些位寫入鍵值A(chǔ)AAAh,否則當(dāng)計(jì)數(shù)器計(jì)數(shù)到0時,看門狗產(chǎn)生復(fù)位。寫入鍵值 5555h 可使能對 IWDG_PR 和 IWDG_RLR 寄存器的訪問;寫入鍵值 CCCCh 可啟動看門狗(選中硬件看門狗選項(xiàng)的情況除外)
預(yù)分頻寄存器(IWDG_PR):對時鐘(LSI)進(jìn)行分頻
重載寄存器(IWDG_RLR):看門狗計(jì)數(shù)器重載值
受寫保護(hù),每次對 IWDR_KR 寄存器寫入值 AAAAh 時,這個值就會重裝載到看門狗計(jì)數(shù)器中。之后,看門狗計(jì)數(shù)器便從該裝載的值開始遞減計(jì)數(shù)。超時周期由該值和時鐘預(yù)分頻器共同決定。
若要更改重載值, IWDG_SR 中的 RVU 位必須為 0 。
狀態(tài)寄存器(IWDG_SR):只有RVU、PVU兩位有效
RVU:看門狗計(jì)數(shù)器重載值更新。可通過硬件將該位置 1 以指示重載值正在更新。當(dāng)在 VDD 電壓域下完成重載值更新操作后 (需要多達(dá) 5 個 RC 40 kHz 周期),會通過硬件將該位復(fù)位。
重載值只有在 RVU 位為 0 時才可更新。
PVU:看門狗預(yù)分頻器值更新。可通過硬件將該位置 1 以指示預(yù)分頻器值正在更新。當(dāng)在 VDD 電壓域下完成預(yù)分頻器值更新操作后(需要多達(dá) 5 個 RC 40 kHz 周期),會通過硬件將該位復(fù)位。
預(yù)分頻器值只有在 PVU 位為 0 時才可更新。
三、窗口看門狗(WWDG)
3.1 WWDG簡介
窗口看門狗 (WWDG) 時鐘由 APB1 時鐘經(jīng)預(yù)分頻后提供,通過可配置的時間窗口來檢測應(yīng)用程序非正常的過遲或過早的操作。 WWDG 最適合那些要求看門狗在精確計(jì)時窗口起作用的應(yīng)用程序。
之所以稱為窗口就是因?yàn)槠湮构窌r間是一個有上下限的范圍內(nèi)(窗口),你可以通過設(shè)定相關(guān)寄存器,設(shè)定其上限時間(下限固定)。喂狗的時間不能過早也不能過晚。
窗口看門狗通常被用來監(jiān)測,由外部干擾或不可預(yù)見的邏輯條件造成的應(yīng)用程序背離正常的 運(yùn)行序列而產(chǎn)生的軟件故障。除非遞減計(jì)數(shù)器的值在 T6 位變成 0 前被刷新,看門狗電路在達(dá)到預(yù)置的時間周期時,會產(chǎn)生一個 MCU 復(fù)位。如果在遞減計(jì)數(shù)器達(dá)到窗口寄存器值之前刷新控制寄存器中的 7 位遞減計(jì)數(shù)器值,也會產(chǎn)生 MCU 復(fù)位。這意味著必須在限定的時間窗口內(nèi)刷新計(jì)數(shù)器
而獨(dú)立看門狗限制喂狗時間在0-x內(nèi),x由相關(guān)寄存器決定。喂狗的時間不能過晚。
對于一般的看門狗,程序可以在它產(chǎn)生復(fù)位前的任意時刻刷新看門狗,但這有一個隱患,有可能程序跑亂了又跑回到正常的地方,或跑亂的程序正好執(zhí)行了刷新看門狗操作,這樣的情況下一般的看門狗就檢測不出來了; 如果使用窗口看門狗,程序員可以根據(jù)程序正常執(zhí)行的時間設(shè)置刷新看門狗的一個時間窗口,保證不會提前刷新看門狗也不會滯后刷新看門狗,這樣可以檢測出程序沒有按照正常的路徑運(yùn)行非正常地跳過了某些程序段的情況。
3.2 WWDG特征
可編程的自由運(yùn)行遞減計(jì)數(shù)器
復(fù)位條件
- 當(dāng)遞減計(jì)數(shù)器值小于 0x40 時復(fù)位(如果看門狗已激活)
- 在窗口之外重載遞減計(jì)數(shù)器時復(fù)位(如果看門狗已激活)
提前喚醒中斷 (EWI) :當(dāng)遞減計(jì)數(shù)器等于 0x40 時觸發(fā)(如果已使能且看門狗已激活)
3.3 WWDG功能
T[6:0] 就是 WWDG_CR 的低七位, W[6:0] 即是 WWDG->CFR 的低七位。 T[6:0]就是窗口看門狗的計(jì)數(shù)器,而 W[6:0](由用戶定義) 則是窗口看門狗的上窗口,下窗口值是固定的( 0X40 )。 當(dāng)窗口看門狗的計(jì)數(shù)器在上窗口值之外被刷新,或者低于下窗口值都會產(chǎn)生復(fù)位。
STM32F的窗口看門狗中有一個7位的遞減計(jì)數(shù)器T[6:0],它會在出現(xiàn)下述2種情況之一時產(chǎn)生看門狗復(fù)位:
當(dāng)喂狗的時候如果計(jì)數(shù)器的值大于某一設(shè)定數(shù)值W[6:0]時,此設(shè)定數(shù)值在WWDG_CFR寄存器定義。
當(dāng)計(jì)數(shù)器的數(shù)值從0x40減到0x3F時【T6位跳變到0】
如果啟動了看門狗并且允許中斷,當(dāng)遞減計(jì)數(shù)器等于0x40時產(chǎn)生早期喚醒中斷(EWI),它可以用于喂狗以避免WWDG復(fù)位。
實(shí)戰(zhàn)演練
一、獨(dú)立看門狗
1.1 設(shè)計(jì)規(guī)劃
實(shí)驗(yàn)?zāi)繕?biāo)
在配置在配置看門狗后,DS0 將常亮,如果 KEY_UP 按鍵按下,就喂狗(重新狀態(tài)計(jì)數(shù)器),只要 KEY_UP 不停的 按,看門狗就一直不會產(chǎn)生復(fù)位,保持 DS0 的常亮,一旦超過看門狗定溢出時間(Tout)還沒 按,那么將會導(dǎo)致程序重啟,這將導(dǎo)致 DS0 熄滅一次。
硬件資源
獨(dú)立看門狗實(shí)驗(yàn)的核心是在 STM32F4 內(nèi)部進(jìn)行,并不需要外部電路,但是為了外部觀察使用了:
1 ) 指示燈 DS0
2) KEY_UP 按鍵
3) 獨(dú)立看門狗
1.2 程序設(shè)計(jì)
配置步驟
1.向IWDG_KR寫入0X5555(取消 IWDG_PR 和 IWDG_RLR 的寫保護(hù),且可以設(shè)置)
預(yù)分頻和重裝載,看門狗喂狗時間(看門狗溢出時間),計(jì)算公式: Tout = ((4x2^peer) x rlr) / 32 Tout為看門狗溢出時間(ms); prer為看門狗時鐘預(yù)分頻值(IWDG_PR值,范圍0~7);rlr為看門狗的重裝載值(IWDG_RLR的值) 如:Tout = ((4x2^4) x 500/32 = 64 x 500 /32 = 1000ms (由于時鐘不準(zhǔn),所以喂狗時間不能太晚)
2.向 IWDG_KR 寫入 0XAAAA(喂狗)
3.向 IWDG_KR 寫入 0XCCCC(啟動看門狗) 一旦啟動就不能再關(guān)閉,只有重啟時才會關(guān)閉,重啟后不會自動打開IWDG,慎用。
IWDG配置
iwdg.h
iwdg.c
主函數(shù)text.c
1.3 在線調(diào)試
查看IWDG定時器,可以看到KE無論向里面寫什么數(shù),讀出都是0。而PR和RLR里面也有相關(guān)值
1.4 上板驗(yàn)證
編譯后無錯誤下載到開發(fā)板中,會發(fā)現(xiàn)DS0沒隔1s進(jìn)行閃爍(不復(fù)位常亮,復(fù)位滅),如果按擊WK_UP按鍵,則不會復(fù)位,DS0就會一直亮。
二、窗口看門狗
1.1 設(shè)計(jì)規(guī)劃
實(shí)驗(yàn)?zāi)繕?biāo)
通過 DS0 來指示 STM32F4 是否被復(fù)位了,如果被復(fù)位了就會點(diǎn)亮 300ms 。 DS1 用來指
示中斷喂狗,每次中斷喂狗翻轉(zhuǎn)一次。
硬件資源
窗口看門狗實(shí)驗(yàn)的核心是在 STM32F4 內(nèi)部進(jìn)行,并不需要外部電路,但是為了外部觀察使用了:
1 ) 指示燈 DS0 、DS1
2) KEY_UP 按鍵
3) 獨(dú)立看門狗
1.2 程序設(shè)計(jì)
配置步驟
使能WWDG時鐘 :掛在PCK1時鐘,需要先使能時鐘。
設(shè)置WWDG_CFR、WWDG_CR兩個寄存器:包括使能窗口看門狗、開啟中斷、設(shè)置計(jì)數(shù)器的初始值、設(shè)置窗口值并設(shè)置分頻數(shù) WDGTB 等。
開啟WWDG中斷并分組
編寫中斷服務(wù)函數(shù):喂狗
WWDG配置
wwdg.h
wwdg.c
?
主函數(shù)text.c
評論
查看更多