窗口看門狗(WWDG)概述
窗口看門狗通常被用來監測,由外部干擾或不可預見的邏輯條件造成的應用程序背離正常的運行序列而產生的軟件故障。除非遞減計數器的值在T6位變成0前被刷新,否則看門狗電路在達到預置的時間周期時,會產生一個MCU復位。
在遞減計數器達到窗口寄存器數值之前,如果7位的遞減計數器數值(在控制寄存器中)被刷新, 那么也將產生一個MCU復位。這表明遞減計數器需要在一個有限的時間窗口中被刷新。
WWDG主要特性
● 可編程的自由運行遞減計數器
● 條件復位 ─ 當遞減計數器的值小于0x40,(若看門狗被啟動)則產生復位。
─ 當遞減計數器在窗口外被重新裝載,(若看門狗被啟動)則產生復位。
● 如果啟動了看門狗并且允許中斷,當遞減計數器等于0x40時產生早期喚醒中斷(EWI),它可以被用于重裝載計數器以避免WWDG復位。
WWDG功能描述
如果看門狗被啟動(WWDG_CR寄存器中的WDGA位被置’1’), 并且當7位(T[6:0])遞減計數器從0x40翻轉到0x3F(T6位清零)時,則產生一個復位。
如果軟件在計數器值大于窗口寄存器中的數值時重新裝載計數器,將產生一個復位。
應用程序在正常運行過程中必須定期地寫入WWDG_CR寄存器以防止MCU發生復位。只有當計數器值小于窗口寄存器的值時,才能進行寫操作。儲存在WWDG_CR寄存器中的數值必須在0xFF和0xC0之間:
● 啟動看門狗
在系統復位后,看門狗總是處于關閉狀態,設置WWDG_CR寄存器的WDGA位能夠開啟看門狗,隨后它不能再被關閉,除非發生復位。
● 控制遞減計數器
遞減計數器處于自由運行狀態,即使看門狗被禁止,遞減計數器仍繼續遞減計數。當看門狗被啟用時,T6位必須被設置,以防止立即產生一個復位。
T[5:0]位包含了看門狗產生復位之前的計時數目;復位前的延時時間在一個最小值和一個最大值之間變化,這是因為寫入WWDG_CR寄存器時,預分頻值是未知的。
配置寄存器(WWDG_CFR) 中包含窗口的上限值:要避免產生復位,遞減計數器必須在其值小于窗口寄存器的數值并且大于0x3F時被重新裝載。
另一個重裝載計數器的方法是利用早期喚醒中斷(EWI)。設置WWDG_CFR寄存器中的WEI位開啟該中斷。當遞減計數器到達0x40時,則產生此中斷,相應的中斷服務程序(ISR)可以用來加載計數器以防止WWDG復位。在WWDG_SR寄存器中寫’0’可以清除該中斷。
注: 可以用T6位產生一個軟件復位(設置WDGA位為’1’,T6位為’0’)。
T[6:0]就是 WWDG_CR 的低七位,W[6:0]即是 WWDG->CFR 的低七位。T[6:0] 就是窗口看門狗的計數器,而 W[6:0]則是窗口看門狗的上窗口,下窗口值是固定的(0X40)。 當窗口看門狗的計數器在上窗口值之外被刷新,或者低于下窗口值都會產生復位。
上窗口值(W[6:0])是由用戶自己設定的,根據實際要求來設計窗口值,但是一定要確保 窗口值大于 0X40,否則窗口就不存在了。 窗口看門狗的超時公式如下:
Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /Fpclk1;
其中:
Twwdg:WWDG 超時時間(單位為 ms)
Fpclk1:APB1 的時鐘頻率(單位為 Khz)
WDGTB:WWDG 的預分頻系數
T[5:0]:窗口看門狗的計數器低 6 位
根據上面的公式,假設 Fpclk1=36Mhz,那么可以得到最小-最大超時時間如下表
調試模式
當微控制器進入調試模式時(Cortex-M3核心停止),根據調試模塊中的DBG_WWDG_STOP 配置位的狀態,WWDG的計數器能夠繼續工作或停止。
窗口看門狗(WWDG)寄存器
控制寄存器(WWDG_CR)
WWDG_CR 只有低八位有效,T[6:0]用來存儲看門狗的計數器值, 隨時更新的,每個窗口看門狗計數周期(4096×2^ WDGTB)減 1。當該計數器的值從 0X40 變 為 0X3F 的時候,將產生看門狗復位。
WDGA 位則是看門狗的激活位,該位由軟件置 1,以啟動看門狗,并且一定要注意的是該 位一旦設置,就只能在硬件復位后才能清零了。
配置寄存器(WWDG_CFR)
該位中的 EWI位是提前喚醒中斷位,也就是在快要產生復位的前一段時間(T[6:0]=0X40)來提醒我們,需要進行喂狗了,否則將復位!
因此,我們一般用該位來設置中斷,當窗口看門狗的計數器值減到 0X40 的時候,如果該位設置,并開啟了中斷,則會產生中斷,我們可以在中斷里面向 WWDG_CR 重新寫入計數器的值,來達到喂狗的目的。注意這里在進入中斷后,必須在不大于 1 個窗口看門狗計數周期的時間(在 PCLK1 頻率為 36M 且 WDGTB 為 0 的條件下, 該時間為 113us)內重新寫 WWDG_CR,否則,看門狗將產生復位!
狀態寄存器(WWDG_SR)
該寄存器用來記錄當前是否有提前喚醒的標志。該寄存器僅有位 0 有效,其他都是保留位。當計數器值達到 40h 時,此位由硬件置 1。 它必須通過軟件寫 0 來清除。對此位寫 1 無效。即使中斷未被使能,在計數器的值達到 0X40的時候,此位也會被置 1。
窗口看門狗(WWDG)寄存器映像
WWDG固件庫函數
窗口看門狗庫函數相關源碼和定義分布在文件 stm32f10x_wwdg.c 文件和頭文件 stm32f10x_wwdg.h 中。
1)使能 WWDG 時鐘
WWDG 不同于IWDG,IWDG 有自己獨立的 40Khz 時鐘,不存在使能問題。而 WWDG使用的是 PCLK1 的時鐘,需要先使能時鐘。方法是:
2)設置窗口值和分頻數
設置窗口值的函數是:
這個函數的入口參數 WindowValue 用來設置看門狗的上窗口值。
設置分頻數的函數是:
這個函數同樣只有一個入口參數,用來設置看門狗的分頻值。
3)開啟 WWDG 中斷并分組
開啟 WWDG 中斷的函數為:
接下來是進行中斷優先級配置,這里就不重復了,使用 NVIC_Init()函數即可。
4)設置計數器初始值并使能看門狗
這一步在庫函數里面是通過一個函數實現的:
該函數既設置了計數器初始值,同時使能了窗口看門狗。
5)編寫中斷服務函數
編寫窗口看門狗的中斷服務函數,通過該函數來喂狗,必須在不大于 1 個窗口看門狗計數周期的時間內完成喂狗,否則當窗口看門狗計數器值減到 0X3F 的時候,就會引起軟復位了。在中斷服務函數里面也要將狀態寄存器的 EWIF 位清空。
WWDG(窗口看門狗)實驗
硬件設計
1) 指示燈 DS0 和 DS1
2) 窗口看門狗
窗口看門狗屬于 STM32 的內部資源,只需要軟件設置好即可正常工作。我們通過 DS0 和 DS1 來指示 STM32 的復位情況和窗口看門狗的喂狗情況。
軟件設計
在工程文件目錄下面新建兩個文件夾分別為:wdg.c和wdg.h。并在把源文件添加到工程,和添加頭文件的路徑。
wdg.c 里面的代碼如下:
?
第一個函數 void WWDG_Init(u8 tr,u8 wr,u8 fprer)用來設置 WWDG 的初始化值。包括看門狗計數器的值和看門狗比較值等。全局變量 WWDG_CNT,該變量用來保 存最初設置 WWDG_CR 計數器的值。在后續的中斷服務函數里面,就又把該數值放回到WWDG_CR 上。
第二個函數WWDG_Set_Counter()是用來重設窗口看門狗的計數器值的。
第三個函數是中斷分組函數。
第四個函數是中斷服務函數,先重設窗口看門狗的計數器值,然后清除提前喚醒中斷標志。函數中也對 LED1(DS1)取反,來監測中斷服務函數的執行了狀況。
wdg.h 里面的代碼如下:
把頭文件中的幾個函數名加入到頭文件里面去,其他文件的文件可以調用。
main.c中的代碼:
該函數通過 LED0(DS0)來指示是否正在初始化。而 LED1(DS1)用來指示是否發生了中 斷。我們先讓 LED0 亮 300ms,然后關閉以用于判斷是否有復位發生了。在初始化 WWDG 之后,我們回到死循環,關閉 LED1,并等待看門狗中斷的觸發/復位。
實驗現象
DS0 亮一下之后熄滅,緊接著 DS1 開始不停的閃爍。每秒鐘閃爍 5 次左右。
評論