在STM32微控制器中,看門狗(Watchdog)是一種硬件計時器,用于監控系統運行狀態,防止軟件死鎖或跑飛。其核心機制是:系統需定期“喂狗”(復位看門狗計數器),若未及時喂狗,則觸發系統復位,使程序恢復至初始狀態。
看門狗類型及特點
STM32提供兩種看門狗,各有適用場景:
1.?獨立看門狗(IWDG)
-
時鐘源:獨立內部低速時鐘(LSI,~32-40kHz),不受主時鐘影響(即使主時鐘故障仍有效)。
-
特點:
-
配置后無法停止(只能通過復位關閉)。
-
超時時間范圍寬(毫秒到秒級)。
-
適合監控嚴重故障(如程序跑飛、死循環)。
-
-
工作流程:
初始化 → 啟動計數器 → 定期喂狗(復位計數器)→ 若超時未喂狗 → 觸發系統復位
2.?窗口看門狗(WWDG)
-
時鐘源:APB1總線時鐘(PCLK1)分頻。
-
特點:
-
必須在指定時間窗口內喂狗(既不能過早也不能過晚)。
-
提供提前喚醒中斷(EWI),允許在復位前執行緊急操作。
-
適合監控代碼執行時效性(如任務調度超時)。
-
-
工作流程:
初始化 → 啟動計數器 → 在窗口期內喂狗 → 若喂狗過早/過晚 → 觸發復位
關鍵概念詳解
超時時間計算
-
IWDG公式:
示例(LSI=40kHz,預分頻=32,RLR=1000):
Ttimeout=100040000×32=0.8秒Ttimeout?=400001000?×32=0.8秒 -
WWDG公式:
喂狗操作
-
IWDG喂狗:向鍵寄存器(
IWDG_KR
)寫入0xAAAA
。 -
WWDG喂狗:向控制寄存器(
WWDG_CR
)寫入值(需在0x40~0x7F
之間)。
配置步驟(以IWDG為例,HAL庫)
#include "stm32f1xx_hal.h"IWDG_HandleTypeDef hiwdg;void IWDG_Init(void) {hiwdg.Instance = IWDG;hiwdg.Init.Prescaler = IWDG_PRESCALER_32; // 預分頻系數hiwdg.Init.Reload = 1000; // 重載值(超時時間)HAL_IWDG_Init(&hiwdg); // 初始化HAL_IWDG_Start(&hiwdg); // 啟動看門狗
}void main(void) {IWDG_Init();while (1) {// ... 正常代碼 ...HAL_IWDG_Refresh(&hiwdg); // 定期喂狗(需在超時前執行)}
}
使用注意事項
-
喂狗位置:
-
放在主循環或關鍵任務中,避免在阻塞函數中餓死看門狗。
-
若使用RTOS,可在空閑任務中喂狗(但需確保任務調度正常)。
-
-
調試影響:
-
調試時暫停MCU會導致看門狗復位,可通過
DBGMCU
模塊臨時凍結看門狗。
-
-
窗口看門狗窗口期:
-
窗口上限由
WWDG_CFR
寄存器設定,喂狗需在[窗口值, 0x3F]
之間。
-
應用場景對比
場景 | 推薦看門狗 | 原因 |
---|---|---|
高可靠性系統(工業控制) | IWDG | 獨立時鐘,抗干擾能力強 |
實時任務監控 | WWDG | 精確時間窗口,可捕獲邏輯錯誤 |
低功耗應用 | IWDG | LSI功耗低于主時鐘 |
通過合理配置看門狗,可顯著提升STM32系統的抗故障能力,確保設備在異常狀態下自動恢復。