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能够及时检测并恢复系统异常,避免因程序跑飞导致的系统故障。
热门推荐
情绪低落怎么办
留学生必学:地道春节祝福语
茶叶与免疫力:科学饮用茶叶提升身体防御力
蜜桶花:一种传统中药材的全面解析
飞机座位分布图 飞机选座最佳位置 飞机座位号排布图
费曼路径积分简单示例
费曼路径积分简单示例
许馨文变身“甜美公主”:从校园歌手到全能艺人的蜕变之路
许馨文新剧《一起长大的约定》定档,青春校园剧再掀热潮
软糖储存与异味处理全攻略
特伦顿战役:华盛顿的逆袭时刻
零添加橘子软糖DIY,健康美味两不误!
乔治·华盛顿的治国智慧,竟藏在这场战争中?
乔治·华盛顿的领导力:现代企业管理的启示
光速旅行的时间膨胀效应揭秘
虫洞科技:星际旅行的未来之路
光速旅行引发的时间膨胀效应揭秘
华为手机的密码解锁详细步骤及特殊情况处理
王音棋和任鲁豫:央视新生代主持人的崛起之路
《不差钱》:一部现象级小品的诞生与影响
创意抠糖饼 vs 糖饼抠抠乐:谁才是益智王者?
《鱿鱼游戏》同款:周末聚会玩转抠糖饼
育贤小学推荐:亲子互动抠糖饼游戏
曹云金新歌《百日红》:映照追梦路上的坚韧与温柔
狂飙的黄金与脱钩的美元:支撑金价新高的因素是什么?
赵露思患重病后首发复健视频,蹒跚学步让人心疼
朝阳三大区域规划出炉,未来可期!
朝阳龙城区:一座五线城市的冰雪经济突围之路
人参的采收、加工与贮藏方法简介
秒懂!“Min” 究竟是什么意思?多种含义深度解析