WDG简介
WDG(Watchdog)看门狗
看门狗可以监控程序的运行状态,当程序因为设计漏洞、硬件故障、电磁干扰等原因,出现卡死或跑飞现象时,看门狗能及时复位程序,避免程序陷入长时间的罢工状态,保证系统的可靠性和安全性
看门狗本质上是一个定时器,当指定时间范围内,程序没有执行喂狗(重置计数器)操作时,看门狗硬件电路就自动产生复位信号
STM32内置两个看门狗
- 独立看门狗(IWDG):独立工作,对时间精度要求较低
- 窗口看门狗(WWDG):要求看门狗在精确计时窗口起作用
独立看门狗(IWDG)
独立看门狗的时钟是专用的LSI(40KHz),内部低速时钟
IWDG键寄存器
- 键寄存器本质上是控制寄存器,用于控制硬件电路的工作
- 在可能存在干扰的情况下,一般通过在整个键寄存器写入特定值来代替控制寄存器写入一位的功能,以降低硬件电路受到干扰的概率
| 写入键寄存器的值 | 作用 |
|---|---|
| 0xCCCC | 启用独立看门狗 |
| 0xAAAA | IWDG_RLR中的值重新加载到计数器(喂狗) |
| 0x5555 | 解除IWDG_PR和IWDG_RLR的写保护 |
| 0x5555之外的其他值 | 启用IWDG_PR和IWDG_RLR的写保护 |
IWDG 其他寄存器详解
| 寄存器 | 位 | 作用 |
|---|---|---|
| IWDG_PR(预分频) | PR[2:0] | 000/4,001/8,010/16,011/32,100/64,101/128,110~/256 |
| IWDG_RLR(重装载) | RL[11:0] | 重装载值 0~4095,喂狗时把 RL+1 装入计数器 |
| IWDG_SR(状态) | PVU / RVU | 写 PR/RLR 之前必须等这两个位清零,否则写入无效 |
关键:IWDG 一旦写入 0xCCCC 启动,除了系统复位无法关闭(可通过选项字节改为硬件启动)。所以调试时要么条件编译,要么先注释掉启动代码。
IWDG超时时间
- 超时时间:TIWDG=TLSI×PR预分频系数×(RL+1)T_{IWDG} = T_{LSI} \times PR预分频系数 \times (RL + 1)TIWDG=TLSI×PR预分频系数×(RL+1)
- 其中:TLSI=1/FLSIT_{LSI} = 1 / F_{LSI}TLSI=1/FLSI
注意注明:LSI 实际范围是30~60kHz,所以所有超时都是估算值,设计时留 20% 以上余量。
窗口看门狗(WWDG)
使用APB1的时钟,PCLK1(36HMz)
WWDG工作特性
- 递减计数器T[6:0]的值小于0x40时,WWDG产生复位
- 递减计数器T[6:0]在窗口W[6:0]外被重新装载时,WWDG产生复位
- 递减计数器T[6:0]等于0x40时可以产生早期唤醒中断(EWI),用于重装载计数器以避免WWDG复位
- 定期写入WWDG_CR寄存器(喂狗)以避免WWDG复位
WWDG寄存器详解
| 寄存器 | 位 | 作用 |
|---|---|---|
| WWDG_CR | WDGA(bit7)+ T[6:0] | WDGA 使能看门狗(置 1 后同样无法关闭);T 是 7 位递减计数器 |
| WWDG_CFR | WDGTB[1:0] + W[6:0] + EWI | WDGTB 分频(00/1,01/2,10/4,11/8);W 是窗口上边界;EWI 使能早期唤醒中断 |
| WWDG_SR | EWIF | 早期唤醒中断标志,写 0 清除 |
窗口机制
窗口机制:喂狗只能发生在 “计数器从 W 递减到 0x40” 这一段区间内—— 喂太早(计数器 > W)复位,喂太晚(计数器 < 0x40 即下溢)也复位。
WWDG超时时间
TWWDG=TPCLK1×4096×2WDGTB×(T[6:0]+1)T_{WWDG} = T_{PCLK1} \times 4096 \times 2^{WDGTB} \times (T[6:0] + 1)TWWDG=TPCLK1×4096×2WDGTB×(T[6:0]+1)
以 PCLK1 = 36MHz(T_PCLK1 ≈ 27.78ns)为例:
IWDG 与 WWDG 对比总结
| 对比项 | IWDG 独立看门狗 | WWDG 窗口看门狗 |
|---|---|---|
| 时钟源 | 专用 LSI(30~60kHz) | PCLK1(APB1,需开 RCC 时钟) |
| 喂狗限制 | 任意时刻喂狗均可 | 必须在 [0x40, W] 窗口内喂狗 |
| 超时范围 | 约 100µs ~ 26s | 毫秒级(36MHz 下最大约 116ms) |
| 计时精度 | 低(RC 振荡器误差大) | 较高(跟随主时钟) |
| 复位条件 | 超时未喂狗 | 超时未喂狗或窗口外喂狗 |
| 能否关闭 | 启动后不可关闭(除复位) | 启动后不可关闭(除复位) |
| 应用场景 | 主程序跑飞 / 死循环兜底 | 对执行时序有严格要求的任务 |
选型建议:只求 "程序别死"→ 用 IWDG,简单可靠;程序对时序敏感、需要防 "异常快速喂狗"→ 用 WWDG;极端可靠性场景可两者同时启用。