打印
[应用相关]

库函数实现看门狗( 独立看门狗(IWDG)、 窗口看门狗(WWDG))

[复制链接]
748|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
荣陶陶|  楼主 | 2025-4-15 08:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
摘要
本文详细介绍了基于STM32 HAL库的独立看门狗(IWDG)和窗口看门狗(WWDG)的实现原理与应用方法。通过实验验证了看门狗在嵌入式系统中的重要作用,包括系统异常检测与自动恢复功能。文章涵盖了看门狗的基本概念、STM32 HAL库中的相关函数、硬件设计、软件实现以及实验结果分析,为嵌入式系统开发者提供了实用的参考方案。

关键词:STM32;HAL库;独立看门狗;窗口看门狗;系统监控

1. 引言
在嵌入式系统开发中,系统稳定性和可靠性是至关重要的设计指标。由于电磁干扰、电源波动、软件缺陷等因素,微控制器可能会出现程序跑飞或死循环等异常情况。看门狗定时器(Watchdog Timer)作为一种硬件级别的监控机制,能够有效检测系统异常并在预设时间内未收到"喂狗"信号时自动复位系统,从而保证系统能够从故障中恢复。

STM32系列微控制器提供了两种看门狗定时器:独立看门狗(IWDG)和窗口看门狗(WWDG)。本文将基于STM32 HAL库,详细介绍这两种看门狗的实现原理与使用方法,并通过实验验证其功能。

2. 看门狗基本原理
2.1 独立看门狗(IWDG)
独立看门狗(IWDG)是一个基于独立RC振荡器的12位递减计数器,具有以下特点:

独立于主时钟工作,即使在主时钟失效时仍能正常工作

时钟源为内部低速时钟(LSI),典型频率为32kHz

计数器从初始值递减至0时产生系统复位

通过写入键值(0xAAAA)来"喂狗",防止复位

可配置的预分频器和重装载值,决定超时时间

2.2 窗口看门狗(WWDG)
窗口看门狗(WWDG)是一个基于APB1时钟的7位递减计数器,具有以下特点:

时钟源为PCLK1(APB1总线时钟)

具有可配置的"窗口",必须在特定时间范围内喂狗

过早或过晚喂狗都会导致系统复位

提供早期唤醒中断(EWI),可在复位前进行紧急处理

3. 硬件设计
3.1 实验平台
本实验基于STM32F407ZGT6,主要硬件资源包括:

8MHz外部晶振

32.768kHz低速外部晶振(可选)

LED指示灯(PC13)

USART1用于调试信息输出

按键(PA0)用于模拟系统故障

3.2 硬件连接
LED: PC13(用于指示系统运行状态)

按键: PA0(用于模拟系统故障,按下时停止喂狗)

USART1_TX: PA9(连接至串口转USB模块)

USART1_RX: PA10(连接至串口转USB模块)

4. 软件实现
4.1 开发环境
固件库: STM32 HAL库

调试工具: ST-Link V2

4.2 独立看门狗实现
4.2.1 IWDG初始化

IWDG_HandleTypeDef hiwdg;
//喂狗时间:T = 32/32*100=100ms;
void MX_IWDG_Init(void)
{
  hiwdg.Instance = IWDG;
  hiwdg.Init.Prescaler = IWDG_PRESCALER_32;  // 预分频系数32
  hiwdg.Init.Reload = 100;                 // 重装载值100
  if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
  {
    Error_Handler();
  }
}

4.2.2 喂狗操作
void Feed_IWDG(void)
{
  HAL_IWDG_Refresh(&hiwdg);
}
4.2.3 主程序中的使用
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_IWDG_Init();

  printf("System Start...\r\n");

  while (1)
  {
    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
    HAL_Delay(100);

    // 正常情况下定期喂狗
    if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET)
    {
      Feed_IWDG();
      printf("Feed IWDG...\r\n");
    }
  }
}

4.3 窗口看门狗实现
4.3.1 WWDG初始化

WWDG_HandleTypeDef hwwdg;
//窗口上限时间:T = 4096X8X(0X7F-0X5F)/42M,下限时间:T = 4096x8x(0x7F-0X3F)/42M;
void MX_WWDG_Init(void)
{
  hwwdg.Instance = WWDG;
  hwwdg.Init.Prescaler = WWDG_PRESCALER_8;  // 预分频系数8
  hwwdg.Init.Window = 0x5F;                 // 窗口上限值
  hwwdg.Init.Counter = 0x7F;                // 计数器初始值
  hwwdg.Init.EWIMode = WWDG_EWI_ENABLE;     // 使能早期唤醒中断

  if (HAL_WWDG_Init(&hwwdg) != HAL_OK)
  {
    Error_Handler();
  }
}

4.3.2 早期唤醒中断处理
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
  // 在复位前进行紧急处理
  printf("WWDG Early Wakeup! System will reset...\r\n");
  // 可以在此保存关键数据或发送警报
}
4.3.3 喂狗操作
void Feed_WWDG(void)
{
  HAL_WWDG_Refresh(&hwwdg, 0x7F); // 重装载计数器
}
4.3.4 主程序中的使用
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_WWDG_Init();

  printf("System Start...\r\n");

  while (1)
  {
    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
    HAL_Delay(50);

    // 在窗口内正确喂狗
    if(/* 满足喂狗条件 */)
    {
      Feed_WWDG();
      printf("Feed WWDG...\r\n");
    }
  }
}

5. 实验结果与分析
5.1 独立看门狗测试
实验结果如下:

正常工作时,程序每100ms喂狗一次,LED正常闪烁,系统稳定运行。

按下按键(PA0)模拟系统故障,停止喂狗操作:

约1秒后,系统自动复位

复位后通过串口可观察到系统重启信息

LED重新开始闪烁

实验结果表明,独立看门狗能有效检测系统异常并自动恢复系统。

5.2 窗口看门狗测试
在窗口看门狗实验中,我们设置了约58ms的窗口时间(APB1=36MHz/8/(127-95)≈58ms)。实验结果如下:

正常工作时,程序在窗口期内正确喂狗,LED正常闪烁,系统稳定运行。

修改喂狗时间,使其过早或过晚喂狗:

过早喂狗(计数器值>窗口上限):立即触发复位

过晚喂狗(计数器值<0x40):触发早期唤醒中断后复位

通过串口可观察到相应的警告信息

实验结果表明,窗口看门狗能更精确地监控程序执行流程,确保关键代码按时执行。

5.3 性能分析
独立看门狗:

优点:独立时钟源,可靠性高;配置简单

缺点:时间精度较低;无法提供复位前的预警

窗口看门狗:

优点:时间精度高;提供早期预警;可监控代码执行时序

缺点:依赖主时钟;配置较复杂

6. 应用建议
在实际项目中使用看门狗时,应考虑以下建议:

关键系统建议同时使用IWDG和WWDG,实现双重保护

喂狗操作应放在主循环中,确保系统正常运行

避免在中断服务程序中喂狗,除非能保证中断不会被意外屏蔽

对于WWDG,应仔细计算窗口时间,确保关键任务按时完成

在早期唤醒中断中,可记录故障信息或保存关键数据

看门狗超时时间应根据实际应用需求设置,不宜过短或过长

7. 结论
本文基于STM32 HAL库实现了独立看门狗和窗口看门狗的完整实验方案。通过实验验证了看门狗在嵌入式系统中的重要作用,包括系统异常检测与自动恢复功能。实验结果表明,合理配置的看门狗能显著提高系统可靠性,是嵌入式系统设计中不可或缺的安全机制。

STM32 HAL库提供了简洁的API接口,大大简化了看门狗的配置和使用流程。开发者应根据具体应用场景选择合适的看门狗类型和参数,充分发挥其系统监控功能,构建更加稳定可靠的嵌入式系统。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/m0_75187370/article/details/147116973

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

150

帖子

1

粉丝