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能够及时检测并恢复系统异常,避免因程序跑飞导致的系统故障。
热门推荐
高压锅黄豆炖猪肉的做法
白掌怎么才能养长得快
白掌浇水的注意事项(浇水要浇透,多少合适?)
为什么代码编译没有错误,但没有任何显示呢?
间叶源性恶性肿瘤的治疗方法全解析
家庭教育的新理念:培养孩子的自主思考与问题解决能力
专家提建议前,应该做详细的实地调查研究!
冰箱拔插电源的注意事项(为什么冰箱不能随意拔插电源)
线性反馈移位寄存器的理论概述和应用
脾胃不和的中医调理与养生
皮衣选购与保养全攻略:五种材质特点与护理要点详解
电动两轮车分类与限速方式解析:从技术角度详解电压、容量与性能的关系
周一枪杀案件的法律剖析与启示
AI技术与摄影启示
考研复试材料清单(建议收藏)
早上喝可乐会怎么样?医生的专业解答来了
2024年中国年轻人运动消费新趋势:从健身房到户外,细节决定成败
西瓜是寒性的水果吗?科普揭秘,让你了解清楚西瓜属性
听说晚饭吃西瓜能减肥?你是一个合格的吃瓜选手吗?
锦河大峡谷:黑龙江黑河市的自然奇观
美登木:一种具有抗癌活性的药用植物
AI绘画:SD与MJ的区别解析
城管“督促”商户摆摊,是促消费也是增年味
美国特勤局如何保护政要?
如何缓解头皮疼痛,找到有效治疗方法
支付宝基金如何卖出,有以下七个步骤
国际金价上涨逻辑,你看清了吗?
减肥期间喝低脂牛奶还是脱脂牛奶?营养师给出专业解答
支撑位:金融市场技术分析中的重要概念
京畿胜境,魅力保定之历史古迹:千年岁月的沉淀