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的基本步骤如下:
- 激活WWDG:在System Core中选择WWDG并激活。
- 设置参数:
- 预分频器值(WWDG counter clock prescaler)
- 上窗口值(WWDG window value)
- 计数器初始值(WWDG free-running downcounter value)
- 使能提前唤醒中断(Early wakeup interrupt)
- 配置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中断可能遇到以下问题:
- 中断优先级:如果系统负载较高,其他高优先级中断可能影响WWDG中断的及时处理。建议将WWDG中断设置为较高优先级。
- 喂狗时机:确保在关键程序段的正确位置进行喂狗操作,避免过早或过晚。
- 窗口值设置:合理设置窗口上下限,既要保证正常程序执行不会触发复位,又要能在异常情况下及时复位。
通过合理配置和使用WWDG,可以显著提高嵌入式系统的稳定性和可靠性。特别是在对实时性要求较高的应用场景中,WWDG能够及时检测并恢复系统异常,避免因程序跑飞导致的系统故障。
热门推荐
PPT中添加计时器的三种方法
治理达人,闪闪发光丨社区建设带头人,法治宣传小明星
社区专职工作者属于什么编制?外表光鲜,看似公务员实际没有编制
春节手抄报:揭秘传统习俗的秘密
兔年春节手抄报创意文案大集合
金猪迎春:2025年春节手抄报制作指南
薏苡仁:秋季养生的“黄金搭档”
薏苡仁 vs 薏米仁:药食同源的养生瑰宝
聚脲的施工工艺
春季抢“鲜”上市:如何挑选鲜活鲍鱼
鲍鱼虽美味,但这些食用禁忌你一定要知道!
莱芜羊汤的做法(图片)
「AI伦理探讨」人工智能技术的伦理道德规范
神农架国际滑雪场:冬日运动的天堂
手抄报制作:培养创造力的有效途径
2024龙年手抄报插图绘制指南:从线条到色彩的完整教程
如何在房产市场中找到符合预算的房源?这类房源有哪些筛选方法?
在北京通州购房:优势与风险全解析
冷湖石油基地遗址:穿越时空的石油传奇
冷湖镇:从石油重镇到“火星小镇”的华丽转身
用胡萝卜刻字,给TA一个别出心裁的生日惊喜!
如何降低股票佣金:策略、开户流程与优惠费率全攻略
聚脲材料:环保的未来防水防腐解决方案的拓展
唐山大地震:解放军的生死救援
室内瓷砖美缝,为什么必须远离聚脲?健康风险大揭秘!
夏日学习计划:如何在家自学新技能?
唐山大地震背后的板块秘密
如何培养孩子的"自主学习"能力?6大关键策略!
从知识到智慧:提升孩子的自我学习能力
红参果:从野果到新兴水果的华丽转身