在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系统的抗故障能力,确保设备在异常状态下自动恢复。