STM32看门狗配置详解:从基础配置到日常喂狗,一篇文章让你全面掌握!
引言
你是否曾遇到单片机程序跑飞、死循环导致系统崩溃的情况?看门狗(Watchdog Timer,WDT)就是解决这类问题的“终极法宝”!它可以自动检测系统异常并触发复位,让系统恢复到正常状态。本教程将带你从零开始,深入理解看门狗的作用、工作原理、配置方法以及喂狗技巧,助你轻松掌握这一关键技能!
一、看门狗的作用:系统稳定的守护者
看门狗是一种硬件定时器,主要用于监控系统运行状态。当系统因程序跑飞、死循环或硬件故障导致异常时,看门狗会自动触发复位,确保系统能够恢复正常运行。
主要作用:
防程序跑飞:防止程序因异常跳转进入死循环或不可预知的代码区域。
防死锁:检测系统是否因资源竞争或逻辑错误导致死锁。
硬件故障恢复:当系统因电源波动、信号干扰等硬件故障导致异常时,自动复位系统。
二、看门狗的工作原理:定时器的魔法
看门狗的核心是一个递减计数器,其工作原理如下:
-
初始化:配置看门狗的计数器初始值和超时时间。
-
递减计数:看门狗计数器在系统运行时不断递减。
-
喂狗:程序需要在计数器超时前“喂狗”(即重置计数器),表明系统运行正常。
-
超时复位:如果程序未及时喂狗,计数器递减到0时,看门狗会触发系统复位。
看门狗分类:
独立看门狗(IWDG):基于独立时钟源,不受系统时钟影响,适用于硬件级监控。
窗口看门狗(WWDG):基于系统时钟,允许在特定时间窗口内喂狗,适用于软件级监控。
三、喂狗时间计算:精准掌握喂狗时机
1. 独立看门狗
喂狗时间(即看门狗超时时间)的计算公式如下:
Counter:看门狗计数器的初始值。
Prescaler:预分频系数,用于调整计数器的递减速度。
Clock:看门狗的时钟频率(Hz)。
示例: 假设计数器初始值 (Counter = 4095),预分频系数 (Prescaler = 32),时钟频率 (Clock = 32kHz),则超时时间为:
程序需要在 4.095秒内 喂狗,否则看门狗将触发复位。
2. 窗口看门狗
窗口看门狗的喂狗时间计算分为三个步骤:
(1)计算时钟频率:
(2)计算触发时间:从计数器初始值(127)递减到触发复位值(63)的时间。
(3)计算窗口时间:从计数器初始值(127)递减到窗口值(80)的时间。这里假设窗口值设置为80。
示例: 假设PCLK1 = 36MHz,Prescaler = 2,则:
时钟频率:约4.394kHz
触发时间:约14.57毫秒
窗口时间:约12.97毫秒
程序需要在 12.97毫秒 < 喂狗时间 < 14.57毫秒 期间内喂狗。
四、看门狗配置步骤:手把手教你设置
注意:STM32CubeMx软件的基础使用本文档不再赘述,本文章主要讲解看门狗的配置;
以下是基于STM32CubeMx配置配置看门狗的示例:
上图是STM32CubeMx中对应的芯片时钟树,其中①处对应的是独立看门狗的频率,②处对应窗口看门狗的频率。
1. 独立看门狗配置
①点击IWDG–>②勾选激活–>③配置分频系数和计数器
以上图的分频系数16、计数器4095、芯片的独立看门狗频率40000Hz为例,可计算得出喂狗的时间为
根据公式计算喂狗时间,并在主循环中定期调用HAL_IWDG_Refresh(&hiwdg)
喂狗。
2. 窗口看门狗配置
①点击WWDG–>②勾选激活–>③配置分频系数、窗口大小和计数器初始值
(1). 关键参数
计数器初始值(Counter Initial Value):127
触发复位值(Trigger Reset Value):63
窗口值(Window Value):80
看门狗时钟频率(WWDG Clock Frequency):FRQ = PCLK1 / 4096,这里PCLK1 = 36MHz,则:
看门狗时钟频率 = 36MHz / (4096 * 2) ≈ 4.394kHz
递减周期 = 1 / 4.394kHz ≈ 227.58微秒
(2). 触发时间的计算
触发时间是指 从计数器初始值(127)递减到触发复位值(63)所需的时间。
触发时间 = (127 - 63) * 递减周期 = 64 * 227.58微秒 ≈ 14.57毫秒
(3). 窗口时间的计算
窗口时间是指 从计数器初始值(127)递减到窗口值(80)所需的时间。
窗口时间 = (127 - 80) * 递减周期 = 57 * 227.58微秒 ≈ 12.97毫秒
也就是窗口看门狗的正确喂狗频率应满足:
12.97毫秒<喂狗频率<14.57毫秒
只有在这个有效期间喂狗才正确。
当然也可以把窗口值设计跟计数器值一样大,那样的话喂狗的频率即为:
0毫秒<喂狗频率<14.57毫秒
3. 代码实现
注意:通过STM32CubeMx软件完成配置后生成的代码,就包含了看门狗的底层驱动,初始化方法生成于对应的源文件中,基本不用开发者去改动就可以正常使用。
(1)独立看门狗,只需要在主函数的循环中加入喂狗HAL_IWDG_Refresh(&hiwdg);即可,但需要注意,当执行一次循环的时间大于喂狗频率,就会导致芯片复位。
#include "main.h"
// STM32CubeMx生成的其他代码
int main(void) {
// 初始化独立看门狗
MX_IWDG_Init();
while (1) {
// 正常程序逻辑
// ...
// 这段逻辑执行周期一定要小于上述计算出来的喂狗频率
// 定期喂狗
HAL_IWDG_Refresh(&hiwdg);
}
}
(2)窗口看门狗,代码如下,需要注意的是一定要在窗口期内喂狗才有效果
#include "main.h"
// STM32CubeMx生成的其他代码
void main(void)
{
// 初始化窗口看门狗
MX_WWDG_Init();
while (1)
{
// 正常程序逻辑
// ...
// 这段逻辑执行周期一定小于窗口看门狗的触发时间
// 获取当前计数器值
uint8_t currentCounter = HAL_WWDG_GetCounter(&hwwdg);
// 如果计数器值在有效范围内(63 < currentCounter <= 80),执行喂狗操作
if (currentCounter > 63 && currentCounter <= 80)
{
HAL_WWDG_Refresh(&hwwdg); // 窗口期内喂狗
}
}
}
4. 调试与验证
模拟故障(如注释掉喂狗代码),验证看门狗是否触发复位。
使用调试工具观察系统运行状态,确保喂狗机制正常工作。
五、窗口看门狗 vs 独立看门狗:如何选择?
特性 | 窗口看门狗(WWDG) | 独立看门狗(IWDG) |
---|---|---|
时钟源 | APB1时钟(PCLK1) | 低速内部时钟(LSI,约40 kHz) |
复位条件 | 计数器递减到0x3F,或在窗口外喂狗 | 计数器递减到0 |
喂狗时间限制 | 必须在指定的窗口时间内喂狗 | 只需在计数器溢出前喂狗 |
应用场景 | 需要精确控制喂狗时间的场景 | 需要长时间监控的场景 |
如果需要精确控制喂狗时间(例如,防止程序在特定时间内卡死),选择 窗口看门狗。
如果需要长时间监控(例如,防止系统长时间无响应),选择 独立看门狗。
六、总结:看门狗是你的系统守护神
通过本教程,你已经掌握了看门狗的基本原理、配置方法以及喂狗技巧。无论是独立看门狗还是窗口看门狗,它们都是提高系统可靠性的重要工具。合理配置和使用看门狗,能够有效防止系统故障,让你的设备更加稳定可靠!
作者:买辣椒用券