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