STM32看门狗配置实践:从配置到喂狗,一篇文章让你彻底搞懂!

引言

你是否曾遇到单片机程序跑飞、死循环导致系统崩溃的情况?看门狗(Watchdog Timer,WDT)就是解决这类问题的“终极法宝”!它可以自动检测系统异常并触发复位,让系统恢复到正常状态。本教程将带你从零开始,深入理解看门狗的作用、工作原理、配置方法以及喂狗技巧,助你轻松掌握这一关键技能!


一、看门狗的作用:系统稳定的守护者

看门狗是一种硬件定时器,主要用于监控系统运行状态。当系统因程序跑飞、死循环或硬件故障导致异常时,看门狗会自动触发复位,确保系统能够恢复正常运行。

主要作用

  • 防程序跑飞:防止程序因异常跳转进入死循环或不可预知的代码区域。

  • 防死锁:检测系统是否因资源竞争或逻辑错误导致死锁。

  • 硬件故障恢复:当系统因电源波动、信号干扰等硬件故障导致异常时,自动复位系统。


二、看门狗的工作原理:定时器的魔法

看门狗的核心是一个递减计数器,其工作原理如下:

  1. 初始化:配置看门狗的计数器初始值和超时时间。

  2. 递减计数:看门狗计数器在系统运行时不断递减。

  3. 喂狗:程序需要在计数器超时前“喂狗”(即重置计数器),表明系统运行正常。

  4. 超时复位:如果程序未及时喂狗,计数器递减到0时,看门狗会触发系统复位。

看门狗分类

  • 独立看门狗(IWDG):基于独立时钟源,不受系统时钟影响,适用于硬件级监控。

  • 窗口看门狗(WWDG):基于系统时钟,允许在特定时间窗口内喂狗,适用于软件级监控。


三、喂狗时间计算:精准掌握喂狗时机

1. 独立看门狗

喂狗时间(即看门狗超时时间)的计算公式如下:

T_{timeout} = \frac{Counter \times Prescaler}{Clock}

  • Counter:看门狗计数器的初始值。

  • Prescaler:预分频系数,用于调整计数器的递减速度。

  • Clock:看门狗的时钟频率(Hz)。

示例: 假设计数器初始值 (Counter = 4095),预分频系数 (Prescaler = 32),时钟频率 (Clock = 32kHz),则超时时间为:

T_{timeout} = \frac{4095 \times 32}{32000} = 4.095 \, \text{秒}

程序需要在 4.095秒内 喂狗,否则看门狗将触发复位。

2. 窗口看门狗

窗口看门狗的喂狗时间计算分为三个步骤:

(1)计算时钟频率

{Frequency} = \frac{PCLK1}{4096 \times Prescaler}

(2)计算触发时间:从计数器初始值(127)递减到触发复位值(63)的时间。

{触发时间} = \frac{127 - 63}{Frequency}

(3)计算窗口时间:从计数器初始值(127)递减到窗口值(80)的时间。这里假设窗口值设置为80。

{窗口时间} = \frac{127 - 80}{Frequency}

示例: 假设PCLK1 = 36MHz,Prescaler = 2,则:

  • 时钟频率:约4.394kHz

  • 触发时间:约14.57毫秒

  • 窗口时间:约12.97毫秒

程序需要在 12.97毫秒 < 喂狗时间 < 14.57毫秒 期间内喂狗。


四、看门狗配置步骤:手把手教你设置

注意:STM32CubeMx软件的基础使用本文档不再赘述,本文章主要讲解看门狗的配置;

以下是基于STM32CubeMx配置配置看门狗的示例:

上图是STM32CubeMx中对应的芯片时钟树,其中①处对应的是独立看门狗的频率,②处对应窗口看门狗的频率。

1. 独立看门狗配置

①点击IWDG-->②勾选激活-->③配置分频系数和计数器

以上图的分频系数16、计数器4095、芯片的独立看门狗频率40000Hz为例,可计算得出喂狗的时间为

[ T_{timeout} = \frac{4095 \times 16}{40000} = 2.0475 \, \text{秒} ]

根据公式计算喂狗时间,并在主循环中定期调用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
喂狗时间限制必须在指定的窗口时间内喂狗只需在计数器溢出前喂狗
应用场景需要精确控制喂狗时间的场景需要长时间监控的场景
  • 如果需要精确控制喂狗时间(例如,防止程序在特定时间内卡死),选择 窗口看门狗

  • 如果需要长时间监控(例如,防止系统长时间无响应),选择 独立看门狗


六、总结:看门狗是你的系统守护神

通过本教程,你已经掌握了看门狗的基本原理、配置方法以及喂狗技巧。无论是独立看门狗还是窗口看门狗,它们都是提高系统可靠性的重要工具。合理配置和使用看门狗,能够有效防止系统故障,让你的设备更加稳定可靠!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值