侧边栏壁纸
博主头像
丛庆

没事儿写代码,有事写代码。email:1024@cong.zone

  • 累计撰写 116 篇文章
  • 累计创建 97 个标签
  • 累计收到 4 条评论

【STM32】什么是看门狗定时器(Watchdog Timer),喂狗是什么意思

丛庆
2023-04-24 / 0 评论 / 0 点赞 / 722 阅读 / 808 字 / 正在检测是否收录...
温馨提示:
部分资料和图片来源于网络,如有危害到您的利益请与我联系删除,1024@cong.zone。

看门狗(Watchdog)也叫看门狗定时器(Watchdog Timer),是一种硬件设备或软件程序,用于监测计算机系统或嵌入式系统的运行状态,确保系统能够正常工作。如果系统出现故障导致停止响应,看门狗就会自动重启系统,从而防止系统因为软件错误、异常情况等原因而崩溃。

在嵌入式系统中,看门狗通常是一个硬件定时器,它在系统启动后开始计时,如果在一定时间内没有接收到喂狗信号,就会认为系统出现故障,并触发硬件复位,将系统恢复到初始状态。

喂狗是指周期性地向看门狗发送信号,以表明系统仍然处于正常运行状态。这样可以防止看门狗误判系统故障而进行强制重启。喂狗信号可以是任何需要执行的操作,例如设置一个特殊的寄存器位或向特定的IO口写入数据。通过喂狗操作,可以让看门狗始终感知到系统的正常运行状态,从而确保系统的稳定性和可靠性。

以下是一个基于STM32F103C8T6芯片的看门狗定时器和喂狗的代码示例:

#include "stm32f1xx_hal.h"

WWDG_HandleTypeDef hwwdg;  // 定义看门狗句柄

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_WWDG_Init(uint32_t timeout);

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_WWDG_Init(4095);  // 初始化看门狗,设置喂狗时间为4095ms
  
  while (1)
  {
    HAL_Delay(1000);   // 延时1秒
    HAL_WWDG_Refresh(&hwwdg);  // 喂狗,重置看门狗计数器
  }
}

void MX_WWDG_Init(uint32_t timeout)
{
  hwwdg.Instance = WWDG;
  hwwdg.Init.Prescaler = WWDG_PRESCALER_8;   // 预分频系数,可选值有WWDG_PRESCALER_1 ~ WWDG_PRESCALER_8
  hwwdg.Init.Window = 127;                   // 窗口值,范围为1~127,应小于或等于配置的喂狗时间
  hwwdg.Init.Counter = timeout;              // 计数器初值,范围为1~4095,表示看门狗的最大喂狗时间,单位为毫秒
  if (HAL_WWDG_Init(&hwwdg) != HAL_OK)
  {
    Error_Handler();
  }
}

void Error_Handler(void)
{
  while(1)
  {
    // 出错处理代码
  }
}

在主函数中,首先调用HAL_Init()和SystemClock_Config()进行系统初始化,然后调用MX_GPIO_Init()和MX_WWDG_Init(uint32_t timeout)函数初始化GPIO和看门狗。其中,MX_WWDG_Init(uint32_t timeout)函数会根据输入的喂狗时间设置看门狗的相关参数,并调用HAL_WWDG_Init(&hwwdg)函数进行初始化。

随后,进入while循环,每隔1秒钟调用一次HAL_WWDG_Refresh(&hwwdg)函数进行喂狗操作,该函数会重置看门狗计数器。如果程序出现异常情况导致无法正常执行喂狗操作,则看门狗将在预设的时间内未得到喂狗信号而触发复位操作。

由于不同型号的MCU硬件看门狗模块可能略有差异,具体的实现方法需要参考数据手册或者硬件设计文档进行调整。

0

评论区