问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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

创作时间:
作者:
@小白创作中心

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

引用
CSDN
1.
https://blog.csdn.net/qq_36979952/article/details/146422792

看门狗(Watchdog Timer,WDT)是单片机系统中用于监控程序运行状态的重要硬件模块。当系统因程序跑飞、死循环或硬件故障导致异常时,看门狗会自动触发复位,确保系统能够恢复正常运行。本文将从看门狗的作用、工作原理、配置方法到具体实践,手把手教你掌握这一关键技能!

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

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

  • 防程序跑飞:防止程序因异常跳转进入死循环或不可预知的代码区域。
  • 防死锁:检测系统是否因资源竞争或逻辑错误导致死锁。
  • 硬件故障恢复:当系统因电源波动、信号干扰等硬件故障导致异常时,自动复位系统。

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

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

  1. 初始化:配置看门狗的计数器初始值和超时时间。
  2. 递减计数:看门狗计数器在系统运行时不断递减。
  3. 喂狗:程序需要在计数器超时前“喂狗”(即重置计数器),表明系统运行正常。
  4. 超时复位:如果程序未及时喂狗,计数器递减到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
喂狗时间限制
必须在指定的窗口时间内喂狗
只需在计数器溢出前喂狗
应用场景
需要精确控制喂狗时间的场景
需要长时间监控的场景
  • 如果需要精确控制喂狗时间(例如,防止程序在特定时间内卡死),选择窗口看门狗
  • 如果需要长时间监控(例如,防止系统长时间无响应),选择独立看门狗

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

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

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号