IWDG的简单应用

看门狗的简单应用

1、简介

  • IWDG(Independent Watchdog)是嵌入式系统中用于监控系统运行状态并防止异常的硬件设备,其核心是一个递减计数器,当计数器减至0时触发系统复位。

2、具体操作

(1)硬件初始化

  • 使能串口,用来传输设备状态
    img
  • 使能RCC
    img
  • 配置时钟频率
    img
  • 配置IWDG
    img

img

  • img
  • 配置按钮对应的GPIO管脚
    img
    img
  • 在指定位置引入标准库头文件
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */
  • 重定向指定端口
/* USER CODE BEGIN 4 */
int fputc(int ch, FILE *stream){
		HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 10);
	return ch;
}
/* USER CODE END 4 */

(2)操控硬件

  • 在主循环外侧写入以下代码,表明单片机已复位
  /* USER CODE BEGIN 2 */
	printf("Reset\r\n");
  /* USER CODE END 2 */
  • 在主函数外侧写入中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
	//判断中断是否由按钮产生
	if(GPIO_Pin == B1_Pin){
		HAL_Delay(512);//延迟0.513秒,触发看门狗
	}
}
/* USER CODE END 4 */
  • 在主循环内写入"喂狗"操作
  while (1)
  {
	HAL_Delay(99);
	HAL_IWDG_Refresh(&hiwdg);//刷新看门狗计数器
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

流程图

  • 主程序
graph TD; begin((开始)) ---> GPIO_Init[初始化GPIO] ---> IWDG_Init[初始化独立看门狗] ---> print[打印“复位”] ---> Round[循环] ---> Delay[延时0.1秒] ---> Feed[喂狗] Feed ---> Round
  • 中断
graph TD; EXTI((触发外部中断)) ---> pend{是否来自按钮} pend --> |是|Delay[延时0.513秒] ---> Out[退出中断(触发看门狗)] pend --> |否|endin[结束中断]

原理,在按按钮前,单片机会在超时前喂狗,但按按钮后会触发中断回调函数,使单片机延时0.513s,从而触发看门狗

3、最终效果

  • 在最开始,单片机会向串口发送"Reset",按下按钮后,会再发送一次"Reset"

刚启动单片机

img

按下按钮后

img

我发现每次输出都会附带一个奇怪的字符,等我研究一下怎么去掉这个bug,可以插眼等后续
img

posted @ 2025-09-02 17:15  奶龙大王  阅读(13)  评论(0)    收藏  举报