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

STM32窗口看门狗中断回调:原理与实践

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

STM32窗口看门狗中断回调:原理与实践

引用
CSDN
6
来源
1.
https://blog.csdn.net/qq_36347513/article/details/113370522
2.
https://community.st.com/t5/stm32-mcus-products/wwdg-interrupt/td-p/544827
3.
https://stackoverflow.com/questions/62951093/stm32f4-adc-analog-watchdog-interrupt-doesnt-work
4.
https://community.st.com/t5/stm32-mcus-embedded-software/ewi-interrupt/td-p/679870
5.
https://community.st.com/t5/stm32-mcus-products/wwdg-early-wake-interrupt-to-prevent-reset/td-p/655021
6.
http://47.111.11.73/thread-338620-1-1.html

在嵌入式系统开发中,窗口看门狗(WWDG)是一个重要的系统监控外设,用于防止程序跑飞或陷入死循环。STM32微控制器提供了两种看门狗:独立看门狗(IWDG)和窗口看门狗(WWDG)。其中,WWDG具有更灵活的监控机制,能够检测程序执行异常并及时复位系统。

WWDG的基本原理和应用场景

窗口看门狗本质上是一个递减计数器,其工作原理与独立看门狗类似,但增加了窗口限制。具体来说:

  • 计数器递减:WWDG从一个初始值开始递减计数。
  • 窗口限制:计数器值必须在上窗口(用户可配置)和下窗口(固定为0x40)之间才能进行喂狗操作。
  • 中断和复位:当计数器减到0x40时产生早期唤醒中断(Early Wakeup Interrupt),如果在计数器减到0x3F之前没有喂狗,将触发系统复位。

WWDG通常用于监测关键程序段的执行时间。例如,如果一个程序段正常运行时间是50ms,可以在该程序段开始时启动WWDG,并在结束时喂狗。如果在规定时间内没有完成喂狗操作,说明程序可能陷入异常,WWDG将触发系统复位,重启系统。

WWDG中断处理机制

在STM32中,WWDG中断通过HAL库进行处理。关键的函数包括:

  • HAL_WWDG_IRQHandler:中断服务例程,用于处理WWDG中断。
  • HAL_WWDG_EarlyWakeupCallback:中断回调函数,用于实现具体的中断处理逻辑。

配置WWDG中断

使用STM32CubeMX配置WWDG的基本步骤如下:

  1. 激活WWDG:在System Core中选择WWDG并激活。
  2. 设置参数
    • 预分频器值(WWDG counter clock prescaler)
    • 上窗口值(WWDG window value)
    • 计数器初始值(WWDG free-running downcounter value)
  3. 使能提前唤醒中断(Early wakeup interrupt)
  4. 配置NVIC:使能WWDG中断

实现中断回调函数

在用户代码中,需要重写HAL_WWDG_EarlyWakeupCallback函数来处理中断事件。这个函数是一个弱化函数,可以在用户文件中重新实现。

void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
    // 用户自定义的中断处理逻辑
    // 例如:记录错误日志、重启关键任务等
}

实际应用案例

下面是一个完整的WWDG配置和中断处理示例:

#include "stm32f1xx_hal.h"

// WWDG配置结构体
WWDG_HandleTypeDef hwwdg;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_WWDG_Init(void);

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_WWDG_Init();

    while (1)
    {
        // 主程序循环
        // 在关键程序段开始时启动WWDG
        HAL_WWDG_Refresh(&hwwdg, 0x7F);
        // 关键程序段
        // ...
        // 在关键程序段结束时喂狗
        HAL_WWDG_Refresh(&hwwdg, 0x7F);
    }
}

// WWDG初始化函数
static void MX_WWDG_Init(void)
{
    hwwdg.Instance = WWDG;
    hwwdg.Init.Prescaler = WWDG_PRESCALER_8;
    hwwdg.Init.Window = 90;
    hwwdg.Init.Counter = 127;
    hwwdg.Init.EWI = WWDG_EWI_ENABLE;
    if (HAL_WWDG_Init(&hwwdg) != HAL_OK)
    {
        // 初始化错误处理
    }
}

// 中断回调函数
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
    // 处理WWDG中断
    // 例如:记录错误日志、重启关键任务等
    // 可以通过hwwdg参数获取看门狗状态
}

注意事项和常见问题

在实际应用中,WWDG中断可能遇到以下问题:

  1. 中断优先级:如果系统负载较高,其他高优先级中断可能影响WWDG中断的及时处理。建议将WWDG中断设置为较高优先级。
  2. 喂狗时机:确保在关键程序段的正确位置进行喂狗操作,避免过早或过晚。
  3. 窗口值设置:合理设置窗口上下限,既要保证正常程序执行不会触发复位,又要能在异常情况下及时复位。

通过合理配置和使用WWDG,可以显著提高嵌入式系统的稳定性和可靠性。特别是在对实时性要求较高的应用场景中,WWDG能够及时检测并恢复系统异常,避免因程序跑飞导致的系统故障。

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