IWDG的简单应用
看门狗的简单应用
1、简介
- IWDG(Independent Watchdog)是嵌入式系统中用于监控系统运行状态并防止异常的硬件设备,其核心是一个递减计数器,当计数器减至0时触发系统复位。
2、具体操作
(1)硬件初始化
- 使能串口,用来传输设备状态
- 使能RCC
- 配置时钟频率
- 配置IWDG
- 即
- 配置按钮对应的GPIO管脚
- 在指定位置引入标准库头文件
/* 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"
刚启动单片机
按下按钮后
我发现每次输出都会附带一个奇怪的字符,等我研究一下怎么去掉这个bug,可以插眼等后续