STM32看门狗配置实践:从配置到喂狗,一篇文章让你彻底搞懂!
STM32看门狗配置实践:从配置到喂狗,一篇文章让你彻底搞懂!
看门狗(Watchdog Timer,WDT)是单片机系统中用于监控程序运行状态的重要硬件模块。当系统因程序跑飞、死循环或硬件故障导致异常时,看门狗会自动触发复位,确保系统能够恢复正常运行。本文将从看门狗的作用、工作原理、配置方法到具体实践,手把手教你掌握这一关键技能!
一、看门狗的作用:系统稳定的守护者
看门狗是一种硬件定时器,主要用于监控系统运行状态。当系统因程序跑飞、死循环或硬件故障导致异常时,看门狗会自动触发复位,确保系统能够恢复正常运行。
- 防程序跑飞:防止程序因异常跳转进入死循环或不可预知的代码区域。
- 防死锁:检测系统是否因资源竞争或逻辑错误导致死锁。
- 硬件故障恢复:当系统因电源波动、信号干扰等硬件故障导致异常时,自动复位系统。
二、看门狗的工作原理:定时器的魔法
看门狗的核心是一个递减计数器,其工作原理如下:
- 初始化:配置看门狗的计数器初始值和超时时间。
- 递减计数:看门狗计数器在系统运行时不断递减。
- 喂狗:程序需要在计数器超时前“喂狗”(即重置计数器),表明系统运行正常。
- 超时复位:如果程序未及时喂狗,计数器递减到0时,看门狗会触发系统复位。
看门狗主要分为两类:
- 独立看门狗(IWDG):基于独立时钟源,不受系统时钟影响,适用于硬件级监控。
- 窗口看门狗(WWDG):基于系统时钟,允许在特定时间窗口内喂狗,适用于软件级监控。
三、喂狗时间计算:精准掌握喂狗时机
1. 独立看门狗
喂狗时间(即看门狗超时时间)的计算公式如下:
- Counter:看门狗计数器的初始值。
- Prescaler:预分频系数,用于调整计数器的递减速度。
- Clock:看门狗的时钟频率(Hz)。
示例:假设计数器初始值 (Counter = 4095),预分频系数 (Prescaler = 32),时钟频率 (Clock = 32kHz),则超时时间为:
程序需要在4.095秒内喂狗,否则看门狗将触发复位。
2. 窗口看门狗
窗口看门狗的喂狗时间计算分为三个步骤:
- 计算时钟频率
- 计算触发时间:从计数器初始值(127)递减到触发复位值(63)的时间。
- 计算窗口时间:从计数器初始值(127)递减到窗口值(80)的时间。这里假设窗口值设置为80。
示例:假设PCLK1 = 36MHz,Prescaler = 2,则:
- 时钟频率:约4.394kHz
- 触发时间:约14.57毫秒
- 窗口时间:约12.97毫秒
程序需要在12.97毫秒 < 喂狗时间 < 14.57毫秒期间内喂狗。
四、看门狗配置步骤:手把手教你设置
以下是基于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 |
喂狗时间限制 | 必须在指定的窗口时间内喂狗 | 只需在计数器溢出前喂狗 |
应用场景 | 需要精确控制喂狗时间的场景 | 需要长时间监控的场景 |
- 如果需要精确控制喂狗时间(例如,防止程序在特定时间内卡死),选择窗口看门狗。
- 如果需要长时间监控(例如,防止系统长时间无响应),选择独立看门狗。
六、总结:看门狗是你的系统守护神
通过本教程,你已经掌握了看门狗的基本原理、配置方法以及喂狗技巧。无论是独立看门狗还是窗口看门狗,它们都是提高系统可靠性的重要工具。合理配置和使用看门狗,能够有效防止系统故障,让你的设备更加稳定可靠!