【STM32F4】十、視窗看門狗(WWDG)
目錄
一、視窗看門狗概述
1. 視窗看門狗與獨立看門狗的不同
1.1 獨立看門狗
在講視窗看門狗之前,我們先簡單說一說獨立看門狗。想詳細瞭解獨立看門狗的讀者,請進入這條連結。
獨立看門狗的主要組成器件包括時鐘、遞減計數器、鍵暫存器、重灌載暫存器
獨立看門狗啟動後,遞減計數器中的數字就會每時鐘週期都減1,直到減為0,獨立看門狗就認為程式跑飛了,則會引發系統復位;
為了避免看門狗引發復位,我們就需要告訴看門狗“程式沒有跑飛,仍在我的掌控之中” ,如何通知看門狗這條資訊呢?我們就需要給鍵暫存器發一個裝載訊號,鍵暫存器接到訊號後,就會命令重灌載暫存器把它裝載的值賦給遞減計數器,以此來更新遞減計數器。
只要我們保證在每次遞減計數器減到0之前能更新它其中的數值,就能保證看門狗不會引發復位,這個操作就是我們常說的“喂狗”。
示意圖大致如下,OneNote用得不好請見諒……
1.2 視窗看門狗
視窗看門狗,其最重要的組成部件仍然是時鐘、遞減計數器、鍵暫存器、重灌載暫存器
視窗看門狗的視窗指的是 上限時間/上視窗 和 下限時間/下視窗,其中:
① 上限時間 和 下限時間實際上就是兩個不同的數值,在遞減計數器從初值開始遞減的過程中,會經過這兩個數值。
② 遞減計數器初值 > 上限時間 > 下限時間
上限時間和下限時間有各自不同的作用:
- 啟動視窗看門狗後,遞減計數器開始從初值遞減;
- 如果在減到上限時間前,使用者對遞減計數器的值進行了重灌載,那麼將引發系統復位;
- 如果在上限時間減到下限時間的視窗期間,使用者對遞減計數器的值進行了重灌載,那麼這是正常的喂狗,程式正常執行,不會引發復位;
- 如果在減到下限時間時,使用者仍沒有喂狗,那麼將同獨立看門狗
注: 下限時間不是0,它的值由系統固定,是0x3F。
附上視窗看門狗的內部結構示意圖如下:
工作流程示意圖大致如下:
1.3 視窗看門狗可引發中斷
視窗看門狗能引發中斷,使用者可以在中斷服務函式中進行喂狗。
獨立看門狗不能引發中斷。
1.4 時鐘來源、精度不同
獨立看門狗的原始時鐘訊號來源於LSI,是獨立時鐘,但頻率低,精度低。
視窗看門狗的時鐘來源於PCLK1,並非獨立時鐘,但頻率高,精度高。
2. 視窗看門狗的工作細節
2.1 在何時喂狗比較合適?
上面講到,下限時間是一個固定值,是0x3F,即二進位制011 1111。
那麼,在遞減計數器從100 0000減到011 1111的瞬間,也就是即將引發復位的前一刻,視窗看門狗會先引發中斷(若其中斷已被使能),使用者就可以在中斷服務函式中編寫程式,進行喂狗。
2.2 計數器和控制暫存器配合工作,產生中斷
上面提到,在 100 0000 遞減到 011 1111 的瞬間,會引發中斷,那麼,實際上只要檢測這個二進位制數的第6位(從0開始計位數)是否從1變到了0,就可以判斷是否要引發中斷。
計數器的示意圖如下:
可以看到,計數器共有八個位,分別為T0、T1、T2、T3、T4、T5、T6,用來計數;以及一個WDGA,用來使能視窗看門狗。
而系統(視窗看門狗控制暫存器WWDG_CR)只要檢測T6位是否從1變到了0,就能知道是否要引發中斷。
3. 視窗看門狗超時時間計算
① 分頻係數計算:
把分頻暫存器設定為WDG_TB時,實際得到的分頻係數是`
4096 x ( 2 ^ WDG_TB)
由於視窗看門狗的原始時鐘從PCLK接收而來,頻率非常高(精確),因此要固定得對它除以4096進行分頻,以減小其頻率;然後再除以2 ^ WDG_TB進一步分頻。
根據分頻係數,以及原始頻率Fpclk,可以得到新時鐘訊號的新時鐘週期為新時鐘頻率的倒數**,即:
4096 x ( 2 ^ WDG_TB) / Fpclk
② 時鐘週期 x 遞減計數器初值:
看門狗的超時時間是指遞減計數器減到下限時間所用的總時間
,所以在得到時鐘週期(遞減計數器每個時鐘週期減1)後,還要乘上遞減計數器的初值,得到最終的視窗看門狗超時時間,即:
4096 x ( 2 ^ WDG_TB) x (T[5:0] + 1)/ Fpclk
上式中T[5:0] + 1中,**T[5:0]**是指遞減計數器二進位制初值的 0 ~ 5 位,為什麼不取第6位呢?
因為我們想要的是從初值減到下限時間的值,而遞減計數器總共有6位,下限時間是011 1111,加1後得到100 0000;而遞減計數器初值是1xx xxxx,用1xx xxxx 減去 100 0000,得到的自然就是 0 ~ 5 位,即T[5:0],也就是xx xxxx。
在此基礎上加1,是為了彌補100 0000到011 1111的1次計數。