欢迎光临
我们一直在努力

【STM32入门】看门狗(IWDG & WWDG)详解:独立看门狗与窗口看门狗

STM32入门笔记

看门狗一旦配置错误,会导致单片机反复复位,调试时建议先关闭看门狗或设置较长的超时时间。


一、前言:程序跑飞了,谁来拉它一把?

不知道你在调 STM32 的时候有没有遇到过这种情况:程序莫名其妙卡在某个 while 循环里出不来了,或者受到电磁干扰后"跑飞"了,去执行一些乱七八糟的地址,整个系统直接"死机"。这时候你按复位键,它又好了,但你总不能一直守着板子按复位吧?

这时候就需要请出我们今天的主角——看门狗(Watchdog,WDG)。

说白了,看门狗就是单片机里雇的一个保安。它的工作很简单:盯着程序运行,一旦发现程序"罢工"或者"发疯",就立马给单片机一个复位信号,让它重新做人,保证系统的可靠性。

STM32F103 里面内置了两个看门狗:

  • 独立看门狗(IWDG):独立工作,对时间精度要求不高,像个"粗放的保安"。

  • 窗口看门狗(WWDG):要求在精确的计时窗口内喂狗,像个"准时的闹钟"。

下面我就结合江科大的课程,把这两个看门狗的内部结构、工作原理和超时计算给你掰扯清楚。


二、看门狗的本质:一个特殊的定时器

在深入之前,我们先建立一个核心认知:看门狗本质上就是一个递减计数器。

它的工作逻辑特别简单,就三步:

  • 设一个倒计时时间(比如 1 秒)。

  • 程序正常运行时,要不断"喂狗"——也就是把计数器重新装满。

  • 如果程序卡死了,来不及喂狗,计数器减到 0,看门狗就触发复位,单片机重启。

  • 我的理解:你可以把看门狗想象成一个定时炸弹,你必须在爆炸前拆掉它(喂狗)。如果你牺牲了(程序跑飞),没人拆炸弹,它就炸了(复位)。


    三、独立看门狗 IWDG:停不下来的"独立保安"

    3.1 IWDG 框图解析

    图 2:独立看门狗框图(图 157,摘自《STM32F10xxx 参考手册》)

    我们对着框图一点点看:

    • 时钟源 LSI(40kHz):这是独立看门狗的命脉。注意,它用的是独立的内部低速时钟 LSI,不依赖外部晶振,也不依赖系统时钟。这意味着即使主时钟挂了,IWDG 照样能工作。

    • 8 位预分频器:把 40kHz 的时钟分频,降低计数速度。

    • 12 位递减计数器:从重装值开始往下减,减到 0 就复位。

    • 重装载寄存器 IWDG_RLR:存放要重装到计数器里的值。

    • 预分频寄存器 IWDG_PR:设置分频系数。

    • 键寄存器 IWDG_KR:这是 IWDG 的"命门",后面重点讲。

    • 状态寄存器 IWDG_SR:反映当前配置状态。

    我的理解:这意味着 IWDG 是"24 小时值班"的保安,哪怕单片机睡着了,它也在计数。如果你用低功耗模式,一定要考虑 IWDG 会不会在睡眠时把单片机复位。

    3.2 键寄存器 IWDG_KR:为什么叫"键"?

    图 3:IWDG 键寄存器功能表

    很多同学第一次看到"键寄存器"都懵:这又不是键盘,哪来的键?

    其实这里的"键"是钥匙的意思。江科大 PPT 里讲得很清楚:在可能存在电磁干扰的工业环境中,如果用一个控制位来启停看门狗,很可能因为干扰导致位翻转,误触发复位。所以 ST 设计了一个"钥匙机制"——必须往整个寄存器写入特定的 16 位值,才能执行对应操作。

    写入键寄存器的值作用
    0xCCCC 启用独立看门狗。一旦写入,IWDG 就开始计数,且软件无法停止。
    0xAAAA 喂狗。把 IWDG_RLR 的值重新加载到计数器中。
    0x5555 解除写保护。只有先写这个,才能修改 IWDG_PR 和 IWDG_RLR。
    0x5555 之外的其他值 启用写保护。防止误操作改配置。

    我的理解:这个设计就像保险柜的密码锁。你不能只拨动一个开关,必须输入完整的密码(特定值),电路才会执行动作。这大大降低了误触发的概率,在工业现场特别重要。

    标准配置流程(伪代码逻辑):

    1. 写入 0x5555 解锁
    2. 配置预分频系数 PR
    3. 配置重装载值 RLR
    4. 写入非 0x5555 的值上锁(可选,推荐)
    5. 写入 0xCCCC 启动看门狗
    6. 主循环中定期写入 0xAAAA 喂狗

    3.3 IWDG 超时时间计算

    图 4:看门狗超时时间表

    公式:

    TIWDG​=TLSI​×PR预分频系数​×(RL+1)

    其中 TLSI​=1/FLSI​=1/40kHz=25μs

    结合表格看:

    • 最短时间:PR = /4,RL = 0x000,约 0.1 ms

    • 最长时间:PR = /256,RL = 0xFFF,约 26214.4 ms(26.2 秒)

    我的理解:IWDG 的超时时间范围非常大,从 0.1 毫秒到 26 秒都能覆盖。实际项目中,如果你的主循环周期是 10ms,那你可以把超时时间设成 100ms~1s,既给程序留足运行时间,又能在卡死时快速复位。

    计算示例:如果我要设置 1 秒的超时时间:

    • 选 PR = /64(对应 1.6ms ~ 6553.6ms 的档位)

    • 反推 RL:1000ms=25μs×64×(RL+1) → RL+1≈625 → RL=624 (0x270)


    四、窗口看门狗 WWDG:有"时间窗口"的精确闹钟

    如果说 IWDG 是"只要在炸弹爆炸前拆掉就行",那 WWDG 就是"你必须在特定的时间段内拆掉炸弹,拆早了或拆晚了都不行"。

    4.1 WWDG 框图解析

    图 5:窗口看门狗框图(图 158,摘自《STM32F10xxx 参考手册》)

    对着框图看结构:

    • 时钟源 PCLK1(36MHz):WWDG 挂在 APB1 总线上,用的是系统外设时钟,不是独立时钟。这意味着如果主时钟停了,WWDG 也歇菜。

    • 看门狗预分频器 WDGTB:对 PCLK1 进行 1、2、4、8 分频。

    • 6 位递减计数器(T[6:0]):注意!虽然叫 6 位,但实际上是 7 位(T6~T0),其中 T6 是溢出标志位。

    • 看门狗控制寄存器 WWDG_CR:包含使能位 WDGA 和计数器值 T[6:0]。

    • 看门狗配置寄存器 WWDG_CFR:存放窗口值 W[6:0]。

    • 比较器:实时比较 T[6:0] 和 W[6:0]。

    4.2 WWDG 工作特性:什么是"窗口"?

    ​ 图 6:窗口看门狗工时序图

    WWDG 的复位规则比 IWDG 复杂,记住三条铁律:

    规则说明
    ① 计数器减到 0x3F 以下复位 当 T[6:0] < 0x40(即 T6 位变成 0)时,产生复位。这是"超时未喂狗"。
    ② 在窗口外喂狗复位 当 T[6:0] > W[6:0] 时(过早喂狗),也会产生复位!这就是"窗口"的含义。
    ③ 0x40 时产生早期唤醒中断 EWI 当计数器减到 0x40 时,如果使能了中断,会触发 EWI,给你最后一次喂狗的机会。

    结合时序图理解:

    • 不允许刷新区:计数器值还很大的时候(T > W),你不能喂狗,喂了就复位。

    • 刷新窗口:计数器值在 W 和 0x40 之间时,这是安全区,必须在这个区间内喂狗。

    • 危险区:计数器减到 0x40 以下,来不及喂狗就复位。

    我的理解:WWDG 的设计非常巧妙。它不仅能检测"程序卡死没喂狗",还能检测"程序跑飞后在异常位置喂狗"。比如你的程序正常 10ms 喂一次狗,如果跑飞后 1ms 就执行到了喂狗代码,WWDG 会发现"喂太早了",直接复位。这是 IWDG 做不到的安全特性。

    4.3 WWDG 超时时间计算

    ​ 图 7:WWDG 超时时间与窗口时间计算公式

    超时时间公式:

    TWWDG​=TPCLK1​×4096×2WDGTB×(T[5:0]+1)

    窗口时间公式:

    TWIN​=TPCLK1​×4096×2WDGTB×(T[5:0]−W[5:0])

    其中 TPCLK1​=1/FPCLK1​ ,在 36MHz 下 TPCLK1​≈27.78ns

    结合表格(PCLK1 = 36MHz):

    WDGTB最小超时最大超时
    0 113 μs 7.28 ms
    1 227 μs 14.56 ms
    2 455 μs 29.12 ms
    3 910 μs 58.25 ms

    注意:WWDG 的超时时间非常短,最长也只有 58ms 左右!这和 IWDG 能到 26 秒完全不是一个量级。所以 WWDG 通常用于对时间精度要求极高的场合,检测程序是否在规定时间内完成了特定任务。


    五、IWDG vs WWDG:一张表搞定选择困难症

     图 8:IWDG 与 WWDG 对比总结表(江科大 STM32 入门教程 PPT)

    为了让大家更直观地理解两者的区别,我把江科大 PPT 里的对比表再细化一下:

    对比项IWDG 独立看门狗WWDG 窗口看门狗
    复位条件 12 位计数器减到 0 6 位计数器 T[5:0] 减到 0,或过早喂狗
    中断支持 ❌ 无 ✅ 早期唤醒中断 EWI
    时钟源 LSI(40kHz,独立时钟) PCLK1(36MHz,系统时钟)
    预分频系数 /4、/8、/16、/32、/64、/128、/256 1、2、4、8(即 2WDGTB )
    计数器位数 12 位 6 位有效计数(T[5:0])
    超时时间范围 0.1 ms ~ 26214.4 ms 113 μs ~ 58.25 ms
    喂狗方式 写键寄存器 0xAAAA,重装固定值 RLR 直接写 WWDG_CR,写多少重装多少
    防误操作机制 ✅ 键寄存器 + 写保护 ❌ 无
    低功耗行为 停机/待机模式仍工作 依赖系统时钟,主时钟停则停
    典型应用场景 防止程序死循环、跑飞,对时间精度要求低 检测程序是否按时执行,对时间精度要求高

    我的理解:简单记一句话——要"不死就行"选 IWDG,要"准时准点"选 WWDG。比如电机控制、RTOS 任务调度这种对时序敏感的场景,WWDG 的窗口检测就特别有用。


    六、个人理解与心得

    6.1 IWDG 和 WWDG 不是竞争关系,而是互补关系

    刚开始学的时候我也纠结:到底用哪个看门狗?后来实际做项目才明白,它们完全可以同时用。

    • IWDG 放在后台当"最后的保险":哪怕主时钟挂了、程序彻底跑飞,它也能靠 LSI 把系统拉回来。

    • WWDG 放在前台当"时序监督员":监测关键任务(比如传感器采集、通信心跳包)是否在预定的时间窗口内完成。

    6.2 关于"喂狗位置"的思考

    看门狗的核心价值在于:它必须能反映主程序的运行状态。 如果程序卡死在某个任务里,但定时器中断还在跑,看门狗被中断喂了,系统就永远不会复位。

    正确做法:喂狗操作应该放在主循环的关键节点,或者在中断里喂狗前先检查主循环的"心跳标志位"。

    6.3 超时时间不是越长越好

    IWDG 最长能到 26 秒,但真别设这么长。超时时间太长,程序卡死后你要等很久才能复位;太短了,程序正常运行时可能因为某次耗时操作(比如 Flash 写入)没来得及喂狗,导致误复位。

    建议:根据主循环最大执行时间的 3~5 倍 来设置。


    七、踩坑记录

    IWDG 一旦启动,软件无法关闭!

    这是 ST 的硬件设计,IWDG 没有软件关闭的开关。如果你开启了 IWDG,就必须一直喂狗,直到系统复位。调试阶段如果忘了喂狗,程序会不断复位,让你怀疑人生。


    八、总结

    要点核心内容
    看门狗本质 递减计数器,超时未喂狗则复位系统
    IWDG 特点 独立时钟 LSI、12 位计数器、超时范围大、有键寄存器防误操作、低功耗下仍工作
    WWDG 特点 系统时钟 PCLK1、6 位计数器、有窗口限制(过早/过晚都复位)、支持 EWI 中断、超时时间短
    选型建议 两者互补,IWDG 保"不死",WWDG 保"准时"
    关键风险 IWDG 启动后无法关闭;WWDG 窗口值配置错误会导致反复复位

    写这篇文章的时候,我把江科大的视频又回顾了一遍,边看边对着《STM32F10xxx 参考手册》里的框图和时序图一点点抠细节。说实话,看门狗这个知识点单独看江科大课程可能觉得"就这?",但真到了项目里,你会发现一个配置不当的看门狗比 bug 还让人头疼——它不会报错,只会默默地、不断地、让你怀疑人生地复位。

    所以建议大家不要只停留在"看懂",最好动手写个测试程序:先故意不喂狗看看复位现象,再故意在 WWDG 的窗口外喂狗看看会不会复位,真正把原理吃透。


    📌 开发环境:Keil5 + STM32F103C8T6 最小系统板 + ST-Link 📌 参考资料:江科大 STM32 入门教程、《STM32F10xxx 参考手册》

    如果本文对你有帮助,欢迎点赞 👍 收藏 ⭐ !有任何问题欢迎在评论区交流,一起学习进步!

    赞(0)
    未经允许不得转载:171主机测评 » 【STM32入门】看门狗(IWDG & WWDG)详解:独立看门狗与窗口看门狗
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址