針對學習stm32視窗看門狗和原子戰艦所給的wwdg例程時候,存在的問題做如下記錄。
(1) 上視窗的值可以只有設定,7位二進位制數最大只可以設定為127(0x7f),最小又必須大於下視窗的0x40,所以其取值範圍為
64~127
(即:0x40~0x7f)
(2) 配置暫存器wwdg->cfr
視窗看門狗的時鐘來自於
pclk1
,在時鐘配置中,其頻率為外部時鐘經倍頻器後的二分頻時鐘,即為
36mhz
(3)依據上述分析知,視窗時間計算公式為:
t_min
= (wwdg_cr[6:0] - wwdg_cfr[6:0])/(tck/(2^wdgtb))(us)
= (wwdg_cr[6:0] - wwdg_cfr[6:0])/((tpck1/4096)/(2^wdgtb))(us)
= 4096 * (2^wdgtb)*(wwdg_cr[6:0] -wwdg_cfr[6:0])/(72/2) (us)
= 4096 *(2^wdgtb)*(wwdg_cr[6:0] - wwdg_cfr[6:0])/36 (us)
t_max = 4096 * (2^wdgtb)*(wwdg_cr[6:0] - 0x3f)/36(us)
視窗看門狗的超時公式(重新整理時間公式):
twwdg = t_max - t_min
= 4096 *(2^wdgtb)*(wwdg_cfr[6:0] - 0x3f)/36 (us)
= 4096 *(2^wdgtb)*(wwdg_cfr[6:0] - 63)/36 (us)
又因為wwdg_cfr[6:0]取值範圍是:0~127,
(wwdg_cfr[6:0] –63)>0,
所以,1<= (wwdg_cfr[6:0] – 63) <= 127-63=64
又因為乙個6位二進位制x[5:0]數值範圍是0~63,
1 <= x[5:0]+1 <= 64
所以,
上式可以表述為:
twwdg = 4096 * (2^wdgtb)*(t[5:0]+1)/36 (us)
(4)依據上式,可以計算出wwdg的定時時間範圍:
wdgtb(計數器分頻值)
0113
7.28
1227
14.56
2455
29.12
3910
58.25
正常情況下,燒錄原子戰艦所提供的wwdg庫函式(v3.5)例程,會看到起初紅燈點亮,後熄滅,黃燈開始閃爍。但是,燒錄該程式,只看到紅燈閃爍。這說明了wwdg產生了中斷,但是中斷函式中的黃燈閃爍語句(led1=~led1)並沒有執行。
針對上述問題描述,可排除wwdg初始化錯誤的問題(因為紅燈led0在閃爍,說明wwdg已經產生的復位),定位到中斷初始化失敗或中斷函式編寫錯誤的問題。中斷函式比較簡單,檢查後可以排除中斷函式編寫錯誤的問題。
下面,針對中斷初始化函式進行檢查。檢查後,可以發現原例程中缺失了中斷通道使能設定,即「nvic_initstructure.nvic_irqchannelcmd=enable; //
通道使能」。**修改前後對比如下所示。修改後,再次燒錄執行,會發現現象正常:起初紅燈點亮,後熄滅,黃燈開始閃爍。
(1)中斷初始化原始**:
//wwdg中斷初始化
void wwdg_nvic_init()
(2)中斷初始化修改後**:
//wwdg中斷初始化
void wwdg_nvic_init()
(1)對於下述的wwdg初始化函式,燒錄後,執行正常。但是,將wwdg使能並裝載初始值語句wwdg_enable(wwdg_cnt)放於清除提前喚醒中斷標誌位語句wwdg_clearflag()和開啟視窗看門狗中斷語句wwdg_enableit()之後,再次執行,現象異常:只有紅色燈在閃爍,黃色燈一直熄滅。
正確程式:
//儲存wwdg計數器的設定值,預設為最大.
u8 wwdg_cnt=0x7f;
//初始化視窗看門狗
//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)
異常程式:
//儲存wwdg計數器的設定值,預設為最大.
u8 wwdg_cnt=0x7f;
//初始化視窗看門狗
//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)
(2)錯因分析
執行wwdg_enable(wwdg_cnt)語句,會使能wwdg,並將初始值cnt裝載至計數器中。執行此句,還會將wwdg_sr的ewif置1,造成程式無法進入中斷處理函式。
用jlink在keil中對此進行單步除錯可以發現,執行wwdg_enable(wwdg_cnt)語句之後,wwdg_sr的ewif被置1,如下圖所示。
第一步:執行wwdg_enable(wwdg_cnt)語句之前,狀態暫存器wwdg_sr=0x0000,即ewif=0
第二步: 執行wwdg_enable(wwdg_cnt)語句之後,狀態暫存器wwdg_sr=0x0001,即ewif=1
(3)結論
wwdg
使能函式必須在
wwdg
清除提前喚醒中斷標誌位和開啟視窗看門狗中斷之前執行。
stm32 視窗看門狗
當程式跑飛後又回到正常地方或者正好執行了重新整理看門狗操作,此情況下一般的看門狗是檢查不出來的 故可以使用視窗看門狗,這樣保證不會提前或者之後重新整理看門狗。可以檢查程式沒有按正常路線執行而跳過的一些程式段。視窗看門狗 就是在餵狗時間上有乙個上下線。只有在此時間段內才能執行餵狗操作。上線可以在暫存器...
STM32視窗看門狗
今天剛好遇到使用視窗看門狗的情況,開始設定不是很理解,摸索了幾個小時後終於明白了。記錄下以備不時之需。如上圖,從手冊的截圖,首先找到wwdg的時鐘 就是apb1了。其次我們看到下面wwdg復位條件兩個 如果啟動了看門狗當看門狗計數器 7bit 最大值127 少於0x40 64 時復位,如果啟動了看門...
STM32之視窗看門狗
1 有個7位遞減計數器 wwdg cr 就這個計數器和視窗計數器 wwdg cfr 決定什麼時候餵狗。狗喂早了,復位 早 體現在 計數器值 tr 視窗值 wr 也就是計數器值還沒有減到視窗值以下 2 當 0x40 計數器值 tr 視窗值 wr 時,這時候最適合餵狗了,也只有在這時候餵狗才合適 3 當...