STM32看门狗(IWDG/WWDG)超详细教程+代码实战——系统自救指南

摘要:看门狗(Watchdog)是STM32系统中重要的故障恢复机制。本文将深入讲解独立看门狗(IWDG)和窗口看门狗(WWDG)的工作原理,并提供基于HAL库的配置例程,帮助开发者快速实现系统异常复位功能。


一、看门狗是什么?为什么需要它?

看门狗本质是一个递减计数器,当计数器减到0时会触发系统复位。正常运行时,程序需定期"喂狗"(重置计数器),若程序跑飞或陷入死循环无法及时喂狗,看门狗将强制复位系统。

典型应用场景

  • 防止程序死锁

  • 检测软件故障

  • 应对硬件异常


二、独立看门狗(IWDG)配置

2.1 IWDG特性

  • 使用独立的32kHz LSI时钟(不受主时钟影响)

  • 自由运行递减计数器

  • 复位条件:计数器值减至0x000

2.2 配置步骤(CubeMX+HAL库)

硬件配置
  1. 使能IWDG:在CubeMX中Analog → IWDG激活

  2. 设置分频系数(Prescaler)

  3. 设置重载值(Reload)

核心代码
/* IWDG初始化 */
IWDG_HandleTypeDef hiwdg;

void MX_IWDG_Init(void)
{
  hiwdg.Instance = IWDG;
  hiwdg.Init.Prescaler = IWDG_PRESCALER_32;  // 32分频
  hiwdg.Init.Reload = 0xFFF;                 // 重载值
  if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
  {
    Error_Handler();
  }
}

/* 喂狗函数 */
void Feed_IWDG(void)
{
  HAL_IWDG_Refresh(&hiwdg);
}

/* 主函数示例 */
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_IWDG_Init();

  while (1)
  {
    // 业务代码...
    Feed_IWDG();  // 定期喂狗
    HAL_Delay(500);
  }
}

2.3 超时时间计算

公式:
Timeout = (Prescaler / LSI_freq) * Reload
以LSI=32kHz,Prescaler=32,Reload=0xFFF为例:
Timeout = (32 / 32000) * 4095 ≈ 4.095秒


三、窗口看门狗(WWDG)配置

3.1 WWDG特性

  • 时钟来自APB1(通常36MHz)

  • 必须在指定时间窗口内喂狗

  • 复位条件:

    • 计数器值 > 0x7F(过早喂狗)

    • 计数器减至0x3F(未及时喂狗)

3.2 配置步骤

CubeMX设置
  1. 激活WWDG

  2. 配置Prescaler

  3. 设置窗口值(Window Value)

  4. 设置计数器初值(Counter)

核心代码
WWDG_HandleTypeDef hwwdg;

void MX_WWDG_Init(void)
{
  hwwdg.Instance = WWDG;
  hwwdg.Init.Prescaler = WWDG_PRESCALER_8;
  hwwdg.Init.Window = 0x5F;      // 窗口上限
  hwwdg.Init.Counter = 0x7F;     // 初始计数器值
  hwwdg.Init.EWIMode = WWDG_EWI_DISABLE; // 是否启用提前唤醒中断
  if (HAL_WWDG_Init(&hwwdg) != HAL_OK)
  {
    Error_Handler();
  }
}

/* 喂狗函数 */
void Feed_WWDG(void)
{
  HAL_WWDG_Refresh(&hwwdg);
}

/* 中断回调函数(可选) */
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
  // 提前唤醒处理
}

3.3 超时计算

计算公式:
T_wwdg = (4096 × 2^Prescaler × (Counter - 0x3F)) / PCLK1
示例:PCLK1=36MHz,Prescaler=8,Counter=0x7F
T_wwdg = (4096 × 256 × 64) / 36,000,000 ≈ 18.2ms


四、两种看门狗对比

特性IWDGWWDG
时钟源LSI (~32kHz)APB1 (PCLK1)
复位条件计数器到0窗口外喂狗/超时
配置复杂度简单较复杂
典型应用场景防止系统死锁监测程序时序
唤醒中断不支持支持

五、开发注意事项

  1. 喂狗时机:在多个关键任务中分散喂狗操作

  2. 中断处理:避免在中断中频繁喂狗

  3. 调试影响:调试模式下看门狗可能暂停,需配置DBMC寄存器

  4. 功耗管理:在低功耗模式前禁用看门狗


六、常见问题解答

Q1:喂狗后系统仍复位?
A:检查时钟配置,确保计数器参数设置正确

Q2:如何检测看门狗复位?

if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST)) {
  // 处理IWDG复位
  __HAL_RCC_CLEAR_RESET_FLAGS();
}

Q3:窗口看门狗窗口值如何设置?
建议值:窗口值 = 计数器初值 - 预期喂狗时间对应的计数值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值