1. 看门狗是什么?为什么需要它?
大家好,我是老李,在嵌入式行业摸爬滚打十多年了。今天想和大家聊聊STM32的看门狗功能,特别是如何用HAL库配置独立看门狗(IWDG)和窗口看门狗(WWDG)。如果你曾经遇到过程序跑飞、死机或者莫名其妙重启的情况,那看门狗就是你的救星。
简单来说,看门狗就是一个硬件定时器,它需要你的程序定期去"喂狗"(重置计数器)。如果程序正常运行,就会按时喂狗;如果程序跑飞或者陷入死循环,看门狗就会超时,触发系统复位,让设备重新回到正常状态。这就好比养了一只忠诚的护卫犬,需要定期喂食,如果主人出事不能喂食,狗狗就会叫醒所有人来帮忙。
在实际项目中,我看过太多因为没用好看门狗而导致的故障。有一次,一个工业控制设备在现场运行几个月后突然死机,最后发现就是因为看门狗配置不当。所以今天我会详细讲解两种看门狗的特点、适用场景,以及如何准确计算超时时间,帮你避开这些坑。
2. 独立看门狗(IWDG)实战配置
2.1 IWDG的工作原理和特点
独立看门狗是我最常用的看门狗类型,因为它简单可靠。IWDG使用独立的低速内部时钟(LSI),典型频率是40kHz,这个时钟即使在主时钟失效时也能正常工作。这意味着即使你的主晶振出了问题,IWDG仍然能正常工作,确保系统安全。
IWDG的核心是一个12位递减计数器,从初始值开始不断递减,当减到0时就会产生复位信号。我们需要在计数器归零前通过喂狗操作重置计数器,防止系统复位。这个过程就像给一个漏水的桶不断加水,如果停止加水,水漏光了就会触发警报。
2.2 HAL库配置步骤
配置IWDG其实很简单,只需要几个步骤。首先在STM32CubeMX中启用IWDG,设置预分频系数和重装载值。然后在代码中调用HAL库函数即可:
IWDG_HandleTypeDef hiwdg;
void MX_IWDG_Init(void)
{
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_32;
hiwdg.Init.Reload = 1250;
hiwdg.Init.Window = 0xFFF;
if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
{
Error_Handler();
}
}
初始化完成后,只需要在程序中的合适位置定期喂狗:
HAL_IWDG_Refresh(&hiwdg);
我通常会在主循环的关键节点和重要任务完成后喂狗,确保这些核心功能正常运行。
2.3 超时时间计算方法
这是很多人容易混淆的地方,我来详细解释一下。IWDG的超时时间计算公式为:
Tout = (4 × 2^prescaler) × reload / LSI_frequency
其中:
prescaler
2190



被折叠的 条评论
为什么被折叠?



