
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):
| 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 里的对比表再细化一下:
| 复位条件 | 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 参考手册》
如果本文对你有帮助,欢迎点赞 👍 收藏 ⭐ !有任何问题欢迎在评论区交流,一起学习进步!






