STM32– 看门狗–介绍、使用场景、失效场景
STM32 中的看门狗(Watchdog Timer,简称 WDG)有两种主要类型:独立看门狗(IWDG) 和 窗口看门狗(WWDG)。它们的喂狗机制各有特点,主要区别如下:
1. 独立看门狗(IWDG)
喂狗模式:常规定时喂狗
喂狗方式: 调用 IWDG_ReloadCounter()
函数,在任何时刻都可以重装载计数器,从而避免超时复位。
超时机制: 如果计数器倒计时到 0 且没有及时喂狗,系统会复位。
特点:
优点:
缺点:
2. 窗口看门狗(WWDG)
喂狗模式:窗口限制喂狗
喂狗方式: 调用 WWDG_SetCounter()
函数时,喂狗必须在指定的时间窗口内完成。
超时机制:
特点:
优点:
缺点:
两种模式的对比
特性 | 独立看门狗(IWDG) | 窗口看门狗(WWDG) |
---|---|---|
时钟来源 | 内部低速时钟(LSI,32kHz) | APB1 时钟(PCLK1) |
喂狗机制 | 任何时间都可以喂狗 | 必须在时间窗口内喂狗 |
配置复杂度 | 简单 | 较复杂 |
适用场景 | 通用场景,保证基本的系统稳定性 | 高可靠场景,防止逻辑错误频繁喂狗 |
可靠性 | 更高 | 略低,依赖主系统时钟 |
调试控制 | 不可暂停 | 支持暂停 |
可控性 | 不限制喂狗时间 | 支持细粒度时间窗口控制 |
选择建议
-
使用场景简单,侧重可靠性:选择 独立看门狗(IWDG)。
- 如在嵌入式系统中需要一个独立于系统时钟的简单复位保护机制。
-
高可靠性要求,需防止逻辑错误:选择 窗口看门狗(WWDG)。
- 如工业控制场景,程序卡死可能导致危险,需要精确控制喂狗行为。
代码示例
1. 独立看门狗喂狗
#include "stm32f10x_iwdg.h"
void IWDG_Init(void) {
RCC_LSICmd(ENABLE); // 启用 LSI 时钟
while (!RCC_GetFlagStatus(RCC_FLAG_LSIRDY)); // 等待 LSI 就绪
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); // 使能配置
IWDG_SetPrescaler(IWDG_Prescaler_64); // 设置预分频器为 64
IWDG_SetReload(625); // 设置重装载值(1 秒超时)
IWDG_ReloadCounter(); // 加载值到计数器
IWDG_Enable(); // 启动 IWDG
}
void Feed_Dog(void) {
IWDG_ReloadCounter(); // 喂狗
}
/*上下两种初始化和使用,没有关系*********************/
//在main函数中的使用初始化看门狗,不同库函数,初始化函数不一样
// 启用 LSI 时钟,看门狗要用
RCC_LSICmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET); // 等待 LSI 就绪
// 配置 IWDG,超时时间为 1 秒
IWDG_Config(IWDG_Prescaler_64, 625);
printf("初始化初始化喂狗\n");
// 定时喂狗,防止复位,放在while循环里面
IWDG_ReloadCounter();
printf("喂狗\n");
2. 窗口看门狗喂狗
#include "stm32f10x_wwdg.h"
void WWDG_Init(void) {
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // 启用 WWDG 时钟
WWDG_SetPrescaler(WWDG_Prescaler_8); // 设置预分频器
WWDG_SetWindowValue(80); // 设置窗口值(喂狗窗口)
WWDG_Enable(100); // 启动 WWDG 并设置计数器值
}
void Feed_Dog(void) {
WWDG_SetCounter(100); // 喂狗(需在窗口时间内)
}
还没有使用过,用的时候再说
通过对比,可以根据实际场景选择合适的看门狗类型并合理设置喂狗机制。
看门狗使用场景
在嵌入式系统中,看门狗的主要目的是检测系统异常并自动复位,保障系统的稳定运行。以下是常见需要喂狗的场景:
1. 系统可能出现死循环或卡死的场景
2. 系统存在较高可靠性要求的场景
3. 外设数据采集或处理超时的场景
4. 系统通信异常的场景
5. 电磁干扰或外界环境影响较大的场景
6. 软件升级或运行复杂任务的场景
7. 用户无法频繁维护设备的场景
8. 高安全性场景
总结:典型需要喂狗的场景
场景 | 主要原因 | 示例应用 |
---|---|---|
死循环或逻辑卡死 | 防止程序因意外逻辑错误停滞 | 工业设备、智能终端 |
高可靠性要求 | 长期无人值守,需自我修复 | 医疗设备、交通控制 |
数据采集或超时控制 | 模块运行超时可能影响整个系统 | RTOS 系统、数据采集设备 |
通信异常 | 网络或模块中断可能影响设备响应 | 路由器、物联网设备 |
电磁干扰环境 | 环境干扰可能引起系统故障 | 工业控制、军事设备 |
复杂任务或软件升级 | 防止任务中断导致系统不可恢复 | 人工智能设备、在线升级 |
无法维护的设备 | 减少人工维护频率,提高设备可靠性 | 远程监控设备、无人机 |
高安全性需求 | 确保关键设备在故障时快速恢复 | ATM 机、自动驾驶系统 |
在这些场景中,合理配置看门狗的超时时间和喂狗逻辑,可以有效提升系统的健壮性和可靠性。
看门狗失效的场景
理论上,看门狗是一种硬件模块,独立于主处理器运行,设计上可以在系统卡死时强制复位。但在某些特殊情况下,即使有看门狗,也可能无法复位。这种情况通常与硬件设计或系统架构有关。以下是可能的原因和解决方法:
1. 系统进入低功耗模式
2. 系统总线或时钟停止工作
3. 电源故障
4. 看门狗配置或逻辑错误
5. 硬件设计缺陷
6. 看门狗自身故障
7. 看门狗复位后依旧死循环
8. 极端硬件或环境问题
如何降低看门狗失效的可能性
- 设计冗余系统:
- 使用多个独立的看门狗模块,主从备份。
- 合理选择看门狗类型:
- 使用独立看门狗(如外部芯片)而非依赖于主处理器的内部看门狗。
- 测试看门狗功能:
- 定期在程序中模拟卡死场景,验证看门狗是否能正常复位。
- 使用外部复位电路:
- 配合电源管理芯片(如带复位功能的电源监控芯片),提供额外的复位保障。
- 做好复位后程序设计:
- 确保复位后系统能进入正常工作状态,避免重复复位。
总结
虽然看门狗是一种非常可靠的保护机制,但它并不是万能的。如果系统设计或硬件环境存在问题,看门狗也可能无法复位。通过合理设计、冗余机制和充分测试,可以最大程度地降低看门狗失效的风险。
作者:code_snow