STM32視窗看門狗 原子戰艦WWDG例程學習筆記

2021-07-04 12:25:40 字數 3180 閱讀 7159

針對學習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 當...