今天剛好遇到使用視窗看門狗的情況,開始設定不是很理解,摸索了幾個小時後終於明白了。記錄下以備不時之需。
如上圖,從手冊的截圖,首先找到wwdg的時鐘**就是apb1了。其次我們看到下面wwdg復位條件兩個:①如果啟動了看門狗當看門狗計數器(7bit 最大值127)少於0x40(64)時復位,②如果啟動了看門狗,如果看門狗計數器不在設定的window值(也可以認為是大於設定的window值)內餵狗也會進行復位,window值下面說明。
/*** @brief wwdg initialization function
* @param none
* @retval none
*/static void mx_wwdg_init(void)
/* user code begin wwdg_init 2 */
/* user code end wwdg_init 2 */
先看下上面初始化視窗看門狗的**,這個是stm32cube軟體生成初始化視窗看門狗的**。這裡我們關心的最主要的有三個引數,①hwwdg.init.prescaler,這個是分頻引數,那麼這個分頻引數是分哪個的呢?請看下圖,分的就是pclk/4096後的值,橢圓圈起來的部分就是分頻值(只能寫0,1,2,3其中乙個),右上角的wdgtb就是這個值,上面wwdg_prescaler_8巨集的值其實是3,這樣通過2^3這樣就是8分頻了。這個時鐘分頻之後的脈衝就是用來讓看門狗計數器進行遞減的脈衝了,乙個脈衝計數器減一。②hwwdg.init.window,這個就是第一段裡的window值也就是說這個值設定之後,同時啟動了看門狗,看門狗計數器就開始根據分頻後的脈衝進行遞減了,如果在這個計數器大於這個window值的時候進行了餵狗操作則也會復位。視窗值就是此作用。③hwwdg.init.counter,這個就是計數器的過載值也就是餵狗之後把這個值載入到遞減計數器中去。
上面都是一些說明,下面我們來看乙個例子,比如說我們主迴圈中只有乙個函式正常執行時間應該》20ms並且會<40ms其他的執行時間都說明系統出錯了則需要復位系統。為了監測這個函式我們開啟了視窗看門狗來進行守護。
假設pclk時鐘為32mhz,分頻係數為8分頻也就是hwwdg.init.prescaler=3。這樣的話經過上圖計算32mhz / 4096 / 8 ≈ 976.5hz的時鐘脈衝給看門狗計數器進行遞減。根據t=1/f則得出1/(32mhz / 4096 / 8)推導->t = 4096*8/32mhz = 1.024ms。說明了在pclk32mhz 分頻係數為8的時候看門狗計數器遞減乙個數需要的時間為1.024ms。如果你覺得這個時間不合適,可以通過修改pclk,或者更改分頻係數來改變。得出這個遞減計數器時間之後我們就可以根據需求來設定window值和count值了。根據wwdg的說明我們知道當計數器小於64時系統復位,如果我們給count的值是74那麼 74 - 64 = 10就是說計10個數之後就復位了,上面計算的值是1.024ms計乙個數那麼當count = 74的時候不進行餵狗的話 1.024*10 = 10.24ms後系統會復位。題目要求的復位最大值是40ms則count的計數到64要等於40ms則count值為40 / 1.024 + 64 ≈ 104(注意count值不能大於127,如果不能滿足需求則需要重新配置pclk以及分頻係數)也就是如果函式執行時間超過了40ms則系統會進行復位,看看另外乙個條件執行時間也必須大於20ms也就是說小於20ms進行餵狗也是錯誤的也應該進行復位,所以可以得出window值為84。因為104-84=20大概就是20ms。所以綜上當pclk為32mhz的時候可以如下初始化完成題目要求。
hwwdg.instance = wwdg;
hwwdg.init.prescaler = wwdg_prescaler_8; /*8分頻*/
hwwdg.init.window = 84;//視窗值84
hwwdg.init.counter = 104;//過載值 104
系統執行:
while (1)
如上則可以完成題目需求。
當然如果系統只需要復位的上限時間比超過40ms不餵狗就復位沒有下限時間,則只需要把window值也設定為count值就沒有下限時間了。直接兩個值都是104就可以達到目的了。
上面針對的是hal庫的操作,實際上hal的庫 也是操作暫存器,如果需要暫存器操作也可以通過下面暫存器說明進行操作。
/* set wwdg counter */
write_reg(hwwdg->instance->cr, (wwdg_cr_wdga | hwwdg->init.counter));
/* set wwdg prescaler and window */
write_reg(hwwdg->instance->cfr, (hwwdg->init.ewimode | hwwdg->init.prescaler | hwwdg->init.window));
hal函式初始化的時候實際也是操作cr和cfr暫存器如上面的**。所以暫存器操作可以直接根據手冊操作即可,值直接賦值就行了。
stm32 視窗看門狗
當程式跑飛後又回到正常地方或者正好執行了重新整理看門狗操作,此情況下一般的看門狗是檢查不出來的 故可以使用視窗看門狗,這樣保證不會提前或者之後重新整理看門狗。可以檢查程式沒有按正常路線執行而跳過的一些程式段。視窗看門狗 就是在餵狗時間上有乙個上下線。只有在此時間段內才能執行餵狗操作。上線可以在暫存器...
STM32之視窗看門狗
1 有個7位遞減計數器 wwdg cr 就這個計數器和視窗計數器 wwdg cfr 決定什麼時候餵狗。狗喂早了,復位 早 體現在 計數器值 tr 視窗值 wr 也就是計數器值還沒有減到視窗值以下 2 當 0x40 計數器值 tr 視窗值 wr 時,這時候最適合餵狗了,也只有在這時候餵狗才合適 3 當...
stm32 視窗看門狗學習(二)
視窗看門狗有乙個提前喚醒中斷,如果開啟這個中斷,那麼當計數器的值達到0x40的時候就會產生這個中斷。上次的 加一點就可以做這個實驗了。void wwdg init u8 tr,u8 wr,u32 fprer 最後三行是新加的。void wwdg nvic init void void wwdg ir...