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能够及时检测并恢复系统异常,避免因程序跑飞导致的系统故障。
热门推荐
Ubuntu Server 24.04.1 LTS安装配置图解教程
开发ios应用需要什么硬件
结核病防治指南:从症状识别到日常护理
【健康科普】肺外结核健康宣教
十二生肖与命运性格:从五行理论解读生肖奥秘
河南大学历史文化学院:百年历院用AI技术重塑历史教育新范式
猫咪的哪些行为说明你可能“惹毛”了它?
电子健康证系统:让健康证办理更便捷高效
肠鸣如何治疗
喝茶对牙齿健康的影响:是否会腐蚀牙釉质及其防护措施
等额本金提前还10万能省多少利息?
传统陶瓷艺术与当代生活陶艺的融合发展
由浅入深一步步了解什么是哈希(概念向)
初中小四门是哪些科目 学什么课程
项目工地要怎么管理
荨麻疹,一个让人提心吊胆的“过敏大魔王”
电脑壁纸图标摆放技巧有哪些?
地热供暖:探索可再生能源在供热行业的应用
@农民工朋友,年底若有忧"薪"事,合法维权看这里!
应对流鼻血的正确姿势,劲松中西医结合医院健康科普
流鼻血了怎么办
金融的定义是什么?这个定义如何体现其在经济中的作用?
反流性胃炎的症状及注意事项
河北正定篇:隆兴寺之大悲阁、轮转藏阁、慈氏阁
如果你喜欢《我的青春恋爱喜剧果然有问题》,那么 10 部最佳动漫值得一看
数字“251”的多重含义及其在网络文化中的演变故事
龙息神寂金卡抽取攻略:高效规划与技巧分享
【车管小课堂】如何在线申领机动车注销证明电子凭证?
南方种哪种桂花
淮安美食:一座城市的味觉记忆