[STM32] 14-Window Watch Dog

Morgan Ting
閱益如美
Published in
10 min readMay 22, 2022
Photo by Ivana La on Unsplash

Window Watch Dog, WWDG 窗口看門狗是 STM32 一組獨立計時器,用於監看程序是否因外力干擾或其他原因造成逾時產生程序錯誤。本文章介紹 WWDG 以及與獨立看門狗 Independent Watch Dog, IWDG 作比較,並以 STM32CubeIDE 與 Hardware Abstraction Layer, HAL 函式庫進行實作。

文章內容

  1. Window Watch Dog 窗口看門狗介紹
  2. 窗口看門狗時間計算
  3. 窗口看門狗 vs 獨立看門狗
  4. 實作
  5. 成果展示

工具與材料

  1. STM32CubeIDE
  2. Blue Pill ( STM32F103C8T6 ) 開發板
  3. ST-LINK v2
  4. LED 燈 *1
  5. 220 Ω 電阻 *1
  6. 麵包板與單芯線

窗口看門狗介紹

Window Watch Dog, WWDG 窗口看門狗計時器是一組位於 STM32 內部的獨立計時器,其用途為監測程序被外力干擾或是非預期的因素造成程序執行錯誤。之所以稱為 「窗口」在於重載計數器內容也就是 「餵狗」時機有嚴格限制,太早或太晚餵食都會被狗咬很難伺候。

我們來看一下 WWDG 方塊圖並接著說明內部裝置。

reference : datasheet

先從計數時脈來看,WWDG 計數時脈是從系統時脈控制器過來的,所以不具有獨立時脈源並且時脈源進入計時器前會先除以 4096 再進入預分頻進一步降低計數頻率。

一組 7 位元倒數計數器 WatchDog Control Register, WWDG_CR作為計數裝置,其範圍在 0xFF ~ 0xC0 之間,注意對 WWDG_CR 作寫入動作時要保持 T6 為 「1」否則觸發 Reset 重置系統。

WDGA 用來啟動看門狗,唯啟動後不可關閉除非系統重置。WDGA 與 T6 保持 1 ,因此 8 位元 WWDG_CR 的最低值為 11000000 = 0xC0 ,若捨去 WDGA 只看 T[6:0] 則最低值為 1000000 = 0x40。

WatchDog Configurartion Register, WWDG_CFR 用來設定 「窗口」上限,餵狗的動作便是重新載入 WWDG_CR 進行遞減計數,但是載入時機有限制。

觸發 Reset 系統重置有兩條件:

  1. WWDG_CR 計數器倒數至小於 0x40 ,也就是 0x3F 時會觸發 Reset 。0x40 就是計數下限且不可更改。
  2. 當 WWDG_CR 內容值大於 WWDG_CFR 內容值,不可進行重載否則觸發 Reset 。

我們閱讀至此可以體會到 「窗口」的含意,窗口就是時間的上、下限,只能在窗口時間內 ( 上限與下限之間 ) 進行餵狗程序。

WWDG 有提供中斷,當計數器倒數至 0x40 時會觸發 Early Wake Up Interrupt, EWI ,如果不進行餵狗那麼隨後計數器再減 1 至 0x3F 便會觸發 Reset 。

下圖可以清楚了解 「窗口」的限制。

reference : datasheet

7 位元遞減計數器 WWDG_CR 倒數到 WWDG_CFR 之前不允許重載,太早餵狗會觸發 Reset。唯有計數到 WWDG_CFR 內容值 ( 圖中的 W[6:0] )與 0x40 之間才能餵狗。

窗口看門狗時間計算

那麼,該如何決定看門狗時間呢 ? 手冊上有給一段公式以及參考設定表。

公式:

Formula

其中

TWWDG 窗口看門狗逾時時間。

TPCLK1 APB1 時脈週期時間。

reference : datasheet

窗口看門狗 vs 獨立看門狗

STM32 配有獨立看門狗與窗口看門狗,兩隻狗狗用途與功能有些許差異。

實作

本次 WWDG 窗口看門狗實驗設定如下:

  • PA1 連接一個 LED 燈做為指示燈。
  • 分頻係數設為 8
  • WWDG 逾時時間設為 127 ( 0x7F ) 。
  • WWDG 窗口時間設為 94 ( 0x5E ) 。

時間計算如下:

Timing Calculate

一、開啟 STM32CubeIDE 開發環境,建立一個新的專案。

start new project

二、選擇微處理器型號,輸入F103C8 可以快速找到,選擇該型號後按下 「NEXT」鍵。

target selection

三、輸入專案名稱後按下「Finish」鍵。

project name

四、來到 系統設定畫面,按順序首先設定 SYS ,由於我們是用 ST-Link V2 燒錄器將程式上傳到晶片,所以這邊的 Debug 選項選擇 「Serial Wire」。

Serial wire

五、RCC 時脈源,HSE 選擇 「Crystal / Ceramic Resonator」,其中 HSE 是連接開發板上的 8 MHz 震盪器提供系統使用。

clock

六、WWDG 窗口看門狗設定,將「Activated」打勾,參數設定如下:

  • WWDG counter clock prescaler 預分頻設為 8 。
  • WWDG window value 窗口時間設為 94 。
  • WWDG free-running downcounter 逾時時間設為 127 。
WWDG parameter

七、設定 PA1 為輸出模式,並將 PA1 取一個別名 「LED 」。點擊 PA1 選擇 「GPIO_Output」,之後在 PA1 上按滑鼠右鍵選擇 「Enter User Label 」輸入 LED 作為 PA1 腳位的別名。

PA1 as output
PA1 Label

八、Clock Configuration 設定窗口看門狗時脈源與系統時脈源。系統時脈選 「HSE 」選擇外接震盪器訊號並將HCLK 設為 72 MHz , 窗口看門狗時脈源來自 APB1因此將 APB1 prescaler 設為 2 得到 72 M / 2 = 36 MHz。

clock source

九、Project Manager 專案管理,這裡不太需要設定,可以看一下專案名稱以及程式碼自動產生的設定是否符合需求即可。

十、產生程式碼,可以按存檔鍵或是點擊上方 「Project 」=> 「Generate Code 」產生程式碼。

generate code

十一、進入程式碼編輯畫面後,往下捲動可以看到初始化程式碼。

在窗口看門狗初始化設定可以看到方才做的數值設定。

WWDG parameter

十二、開始編寫程式,往上看到 GPIO 與 WWDG 的初始化程序,因為 WWDG 初始化後隨即啟動 ( 函式庫內部指定逾時時間 WWDG_CR 順便寫入 WWDGA ),按手冊所述 WWDG 一旦啟動便無法以軟體關閉。 為了能觀察 LED 是否因重置造成熄滅需要在 LED 點亮前放一道 500 ms延遲程序,但是 WWDG 逾時只有 58 ms 如此啥事都還沒做系統就重啟了,因此我們把 WWDG 初始化程序往後搬,完成延遲及點亮 LED 燈後再啟動 WWDG。

根據計算,禁止重載時間約 30 ms ,窗口時間約 28 ms ,表示 WWDG 啟動後至少要經過 30 ms 才可餵狗,並且過了 30 ms 後需要在 28 ms 內餵狗,在循環迴圈 while 內先延遲 35 ms 再餵狗,這樣便可以保證狗乖乖不開咬。

餵狗的指令

HAL_WWDG_Refresh (&hwwdg) ;

把滑鼠移到餵狗指令上可以觀察到背後做了什麼,實際上就是把 counter 設定值搬到 WWDG_CR 暫存器裡面,讓遞減計數器從 counter 設定值倒數計數。

feed dog / refresh counter

十二、完成程式碼撰寫後進行編譯程序,按下綠色箭頭按鈕。

run code

十三、在 Debugger 項目將 「ST-LINK S/N 」打勾並點擊右方 「SCAN」按鈕。

此時會顯示 ST-Link v2 編號,沒問題後按下 「OK 」按鈕即開始編譯並上傳程式到開發板。

debugger

電路圖

schematic

成果展示

程序一開始稍作延遲並且點亮 LED 燈後才初始化窗口看門狗 ,因為初始化後會立即啟動窗口看門狗,最後在循環程序中於窗口時間內餵狗,不讓系統重置。從開發板可以看到 LED 燈保持燈亮,持續在窗口時間內餵狗因此系統不會重置,造成 LED 燈反覆亮滅。

Result

總結

本次窗口看門狗實作了解到原理並與獨立看門狗做一個比較,兩者都是為了防止系統神遊而自動重啟,只是窗口看門狗對於時間要求更嚴格因此可以用來監看程序是否逾時。

本文總結如下:

  • WWDG 由系統 APB1 提供時脈源。
  • WWDG 只能以軟體啟動,啟動後不可軟體關閉。
  • WWDG 有提供一名為 Early Wake Up Interrupt , EWI中斷,提醒即將重置系統。
  • 窗口時間上限設定範圍為 0x3F ( 127 ) 到 0x40 ( 64 )。
  • 倒數計時器計數到 0x40 會觸發 EWI 中斷,計數到 0x3F 會重置系統。
  • 若倒數計數器內容 大於 窗口時間,只時刷新計數器 ( 餵狗 ) 會重置系統。

參考資料

  1. STM32F103 手冊 [ 連結 ]
  2. STM32F1 HAL and Low-layer drivers [ 連結 ]

感謝讀者

若文章有幫助到您可以拍手給我鼓勵,免費支持我。

相關文章

  • [STM32] 00-Install STM32CubeIDE [連結]
  • [STM32] 01-ST-LINK [連結]
  • [STM32] 02-STM32F103C8T6 [連結]
  • [STM32] 03-GPIO-Output [連結]
  • [STM32] 04-GPIO-Input [連結]
  • [STM32] 05-Ext-Interrupt [連結]
  • [STM32] 06-Timer-Basic [連結]
  • [STM32] 07-Timer-Interrupt [連結]
  • [STM32] 08-Timer-Output_Compare [連結]
  • [STM32] 09-Timer-PWM [連結]
  • [STM32] 10-Timer-Input_Capture [連結]
  • [STM32] 11-RTC-Second-Interrupt [連結]
  • [STM32] 12-RTC-Alarm_Interrupt [連結]
  • [STM32] 13-Independent_Watch_Dog [連結]
  • [STM32] 14-Windows_Watch_Dog [連結]
  • [STM32] 15-ADC_Conversion [連結]
  • [STM32] 16-ADC_Conversion_Temperature_Sensor [連結]
  • [STM32] 17-ADC_Convversion_DMA [連結]
  • [STM32] 18-SPI [連結]
  • [STM32] 19-UART [連結]
  • [STM32] 20-I2C [連結]

--

--

Morgan Ting
閱益如美

用好奇心探索世界。喜愛學習樂於分享。