視窗看門狗(wwdg)通常被用來監測由外部干擾或不可預見的邏輯條件造成的應用程式背離正常的執行序列而產生的軟體故障。除非遞減計數器的值在 t6 位 (wwdg->cr 的第六位)變成 0 前被重新整理,看門狗電路在達到預置的時間週期時,會產生乙個 mcu 復位。在遞減計數器達到視窗配置暫存器(wwdg->cfr)數值之前,如果 7 位的遞減計數器數值(在控制暫存器中)被重新整理,那麼也將產生乙個 mcu 復位。這表明遞減計數器需要在乙個有限的時間視窗中被重新整理。
看門狗是乙個定時器電路,一般有乙個輸入,叫餵狗。乙個輸出到mcu正常工作時候,每隔一段時間輸出乙個訊號到餵狗端,給wdt清零,如果規定超過時間不餵狗,一般程式跑飛,wdt定是超出,就會給乙個復位訊號到mcu,使mcu復位,防止mcu宕機。看門狗的作用就是防止程式發生死迴圈,或者程式跑飛,對微控制器進行狀態進行實時監測的考慮。
1.使能 wwdg 時鐘
wwdg使用的是 pclk1 的時鐘,需要先使能時鐘。方法是:
rcc_apb1periphclockcmd(rcc_apb1periph_wwdg, enable); // wwdg 時鐘使能
2.設定視窗值和分頻數
設定視窗值的函式是:
void wwdg_setwindowvalue(uint8_t windowvalue); //這個函式就乙個入口引數為視窗值
設定分頻數的函式是:
void wwdg_setprescaler(uint32_t wwdg_prescaler); //這個函式就乙個入口引數就會分頻值
3.開啟 wwdg 中斷並分組
開啟 wwdg 中斷的函式為:
wwdg_enableit(); //開啟視窗看門狗中斷
接下來是進行中斷優先順序配置,使用 nvic_init()函式即可。
4.設定計數器初始值並使能看門狗
這 一步在庫函式裡面是通過乙個函式實現的:
void wwdg_enable(uint8_t counter);
該函式既設定了計數器初始值,同時使能了視窗看門狗。
5.編寫中斷服務函式
在最後,還是要編寫視窗看門狗的中斷服務函式,通過該函式來餵狗,餵狗要快,否則當視窗看門狗計數器值減到 0x3f 的時候,就會引起軟復位了。在中斷服務函式裡面也要將狀態暫存器的 ewif 位清空。
完成了以上 5 個步驟之後,我們就可以使用 stm32 的視窗看門狗了。
static u8 wwdg_cnt=0x7f; /*儲存wwdg計數器的設定值,預設為最大. *//** * 初始化視窗看門狗
* tr :t[6:0],計數器值
* wr :w[6:0],視窗值
* fprer:分頻係數(wdgtb),僅最低2位有效
* fwwdg=pclk1/(4096*2^fprer).
*/void wwdg_init(u8 tr,u8 wr,u32 fprer)
/** * 視窗看門狗中斷服務程式
*/void wwdg_nvic_init(void)
/** * 重設定wwdg計數器的值
*/void wwdg_set_counter(u8 cnt)
/** * 看門狗中斷服務程式
*/void wwdg_irqhandler(void)
呼叫:wwdg_init(0x7f,0x5f,wwdg_prescaler_8);/* 計數器值為 7f,視窗暫存器為 5f,分頻數為 8 */
stm32 視窗看門狗
當程式跑飛後又回到正常地方或者正好執行了重新整理看門狗操作,此情況下一般的看門狗是檢查不出來的 故可以使用視窗看門狗,這樣保證不會提前或者之後重新整理看門狗。可以檢查程式沒有按正常路線執行而跳過的一些程式段。視窗看門狗 就是在餵狗時間上有乙個上下線。只有在此時間段內才能執行餵狗操作。上線可以在暫存器...
STM32視窗看門狗
今天剛好遇到使用視窗看門狗的情況,開始設定不是很理解,摸索了幾個小時後終於明白了。記錄下以備不時之需。如上圖,從手冊的截圖,首先找到wwdg的時鐘 就是apb1了。其次我們看到下面wwdg復位條件兩個 如果啟動了看門狗當看門狗計數器 7bit 最大值127 少於0x40 64 時復位,如果啟動了看門...
stm8的獨立看門狗與視窗看門狗
stm8擁有兩個硬體看門狗,分別叫做獨立看門狗和視窗看門狗 獨立看門狗的框圖如下 我們可以看到,獨立看門狗的時鐘來自於lsi內部低速振盪器,經過二分頻到達看門狗外設單元,在經過乙個七位的預分頻到達計數器,這個七位的分頻由pr控制,看門狗內部使用乙個八位的向下計數計數器來計數,計數到0的時候發出看門狗...