一、简介
•WDG(Watchdog)看门狗
•看门狗可以监控程序的运行状态,当程序因为设计漏洞、硬件故障、电磁干扰等原因,出现卡死或跑飞现象时,看门狗能及时复位程序,避免程序陷入长时间的罢工状态,保证系统的可靠性和安全性
•看门狗本质上是一个定时器,当指定时间范围内,程序没有执行喂狗(重置计数器)操作时,看门狗硬件电路就自动产生复位信号
•STM32内置两个看门狗
独立看门狗(IWDG):独立工作,对时间精度要求较低
窗口看门狗(WWDG):要求看门狗在精确计时窗口起作用
二、IWDG独立看门狗
IWDG框图

- 时钟与分频
-
时钟源:LSI(内部低速 RC 振荡器,典型频率 40kHz),不受系统时钟影响,保证独立性
-
预分频模块 :8 位预分频器,由
IWDG_PR寄存器配置分频系数(4/8/16/32/64/128/256) -
作用:对 LSI 时钟分频,得到计数器计数时钟
- 计数与重装
-
12 位递减计数器:核心计数单元,从初始值向下计数,计到 0 时触发 IWDG 复位
-
12 位重装载寄存器
IWDG_RLR:存储喂狗时的重载值,决定计数器溢出周期 -
重装载数值模块 :在喂狗时将
IWDG_RLR的值加载到递减计数器
- 控制与状态寄存器
-
键寄存器
IWDG_KR:-
写入
0x5555:允许访问IWDG_PR和IWDG_RLR寄存器 -
写入
0xAAAA:喂狗(IWDG_RLR中的值重新加载到计数器) -
写入
0xCCCC:启动 IWDG(一旦启动,硬件无法停止,只能复位) -
写入0x5555之外的其他值:启用IWDG_PR和IWDG_RLR的写保护
-
-
状态寄存器
IWDG_SR:-
位 0:PVU(预分频器更新忙标志)
-
位 1:RVU(重装载值更新忙标志)
-
用于判断寄存器配置是否完成
-
- 供电与独立性
- 看门狗功能位于VDD 供电区,即使系统进入停机 / 待机模式,仍能正常工作
- 1.8V 供电区存放配置寄存器,保证低功耗下配置不丢失
IWDG 超时时间
1、核心公式与表中数据对应
IWDG 超时时间计算公式:
TIWDG = TLSI × PR预分频系数 × (RL + 1)
TLSI = 1 / FLSI
TIWDG = 40000(RL[11:0]+1)×预分频系数×1000 ms
- 最短时间 :
RL[11:0] = 0x000(即 RL=0),此时 Tmin=1/40000×1×预分频系数×1000 ms - 最长时间 :
RL[11:0] = 0xFFF(即 RL=4095),此时 Tmax=1/40000×4096×预分频系数×1000 ms
数据验证(以预分频 / 64 为例)
- 最短时间:(1/40000)×1×64×1000=1.6 ms ✅
- 最长时间:(1/40000)×4096×64×1000=6553.6 ms ✅
2、完整参数对照表
表格
| 预分频系数 | PR [2:0] 位 | 最短时间 (ms) RL=0x000 | 最长时间 (ms) RL=0xFFF |
|---|---|---|---|
| /4 | 0 | 0.1 | 409.6 |
| /8 | 1 | 0.2 | 819.2 |
| /16 | 2 | 0.4 | 1638.4 |
| /32 | 3 | 0.8 | 3276.8 |
| /64 | 4 | 1.6 | 6553.6 |
| /128 | 5 | 3.2 | 13107.2 |
| /256 | 6 或 7 | 6.4 | 26214.4 |
3、关键使用要点
- 预分频系数越大,超时范围越宽:/256 分频时最长可达约 26.2 秒,适合需要长时间监控的场景
- RL 值决定实际超时时间:实际项目中需根据主循环执行周期,选择合适 RL 值,保证喂狗频率大于超时频率
- LSI 频率误差:表中基于 40kHz 理想值,实际 LSI 频率有 ±20% 误差,配置时需预留冗余
- PR 寄存器配置:PR [2:0] 为 6 或 7 时,预分频系数均为 / 256,需注意寄存器写入值
三、WWDG窗口看门狗
WWDG框图

- 时钟与分频
- 时钟源:PCLK1(来自 RCC 的 APB1 时钟),精度远高于 IWDG 的 LSI
- 看门狗预分频器(WDGTB) :对 PCLK1 (框图中没画出来,在进行分频前硬件就已经对PCLK1 进行了12分频)进行分频(可配置为 1/2/4/8),为 6 位递减计数器提供计数时钟
- 核心寄存器
- 控制寄存器(WWDG_CR) :
WDGA:看门狗激活位(写 1 启动 WWDG,启动后无法软件关闭)T6~T0:7 位计数器(实际为 6 位递减计数器 + 第 6 位溢出位)
- 配置寄存器(WWDG_CFR) :
W6~W0:7 位窗口值,定义喂狗的窗口下限- 额外包含预分频器配置位(WDGTB)和早期唤醒中断位(EWI)
- 比较与复位逻辑
- 比较器 :实时比较计数器值
T6:0与窗口值W6:0- 当
T6:0 > W6:0时,比较结果 = 1(喂狗过早)
- 当
- 复位触发条件 (满足任一即复位):
- 计数器第 6 位
T6变为 0(计数器递减到 0x3F 以下,喂狗过晚) - 在
T6:0 > W6:0时执行喂狗操作(喂狗过早)
- 计数器第 6 位
WWDG工作特性
•递减计数器T[6:0]的值小于0x40时,WWDG产生复位
•递减计数器T[6:0]在窗口W[6:0]外被重新装载时,WWDG产生复位
•递减计数器T[6:0]等于0x40时可以产生早期唤醒中断(EWI),用于重装载计数器以避免WWDG复位
•定期写入WWDG_CR寄存器(喂狗)以避免WWDG复位

喂狗流程
- 启动计数 :WWDG 启动后,计数器
T[6:0]从初始值(大于W[6:0])开始递减 - 不允许刷新阶段 :计数器值仍大于
W[6:0],此时若执行喂狗操作,硬件会直接判定为 "喂狗过早" 并触发复位 - 进入刷新窗口 :计数器递减至
T[6:0] ≤ W[6:0],此时进入合法喂狗窗口 - 合法喂狗 :在刷新窗口内写入
WWDG_CR,计数器重载为初始值,重新开始递减 - 超时复位 :若未在窗口内喂狗,计数器继续递减至
3Fh(T6 位变为 0),硬件判定为 "喂狗过晚",触发系统复位
WWDG超时时间
- T → W :从启动到进入喂狗窗口前 的时间(这段时间不能喂狗,喂了就复位)
- W → 0x3F :真正的喂狗窗口(这段时间喂狗才合法)
- T → 0x3F:总超时时间(从启动到复位的总时间)
公式:
4096的由来:
- 4096 = STM32 内置固定 12 分频,硬件自带
- 作用:把高速 PCLK1 变慢,让 WWDG 计时不至于太快
- 公式里必须乘它,因为算的是时间
超时时间:
TWWDG = TPCLK1 × 4096 × WDGTB预分频系数 × (T[5:0] + 1)
•窗口时间:
TWIN = TPCLK1 × 4096 × WDGTB预分频系数 × (T[5:0] - W[5:0])
•其中:TPCLK1 = 1 / FPCLK1
WWDG和IWDG对比
