看门狗(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硬件看门狗模块可能略有差异,具体的实现方法需要参考数据手册或者硬件设计文档进行调整。
评论区