前言:独立看门狗是用于判断程序是否跑飞的功能,我们可能会遇到程序陷入死循环的情况,在这种情况下监测到异常并复位能很好预防死机的情况。
目录
一、看门狗简介
1、看门狗概述:
看门狗定时器(WDT,Watch Dog Timer)是单片机的一个组成部分,它实际上是一个计数器,一般给看门狗一个数字,程序开始运行后看门狗开始倒计数。如果程序运行正常,过一段时间CPU应发出指令让看门狗复位,重新开始倒计数。如果看门狗减到0就认为程序没有正常工作,强制整个系统复位。
2、看门狗简介:
STM32 结合安全度、计时精确度和易用性提供了IWDG和WWDG两种看门狗
- 监测软件跑飞,或未按预想地运行的情况
- 触发系统复位或产生中断(中断仅针对窗口看门狗)
(1)独立看门狗IWDG
- 专用时钟LSI
- 低功耗模式仍可运行
- 对定时的控制比较松
(2)窗口看门狗WWDG
- 总线时钟APB1
- 对定时控制比较严
- 要求主应用程序在规定时间窗口内喂狗
二、独立看门狗剖析
1、独立看门狗IWDG工作原理框图
状态寄存器是SR
2、功能说明:
3、寄存器配置:
![](https://i-blog.csdnimg.cn/blog_migrate/3d5426fc442ff08fcd5691b64d2ba0cf.png)
IWDG_PR 和 IWDG_RLR 寄存器具有写保护功能。要修改这两个寄存器的值,必须先向
IWDG_KR 寄存器中写入 0x5555。
只要对以上三个寄存器进行相应的设置,我们就可以启动 STM32F4 的独立看门狗。独立
看 门 狗 相 关 的 库 函 数 操 作 函 数 在 文 件 stm32f4xx_hal_iwdg.c 和 对 应 的 头 文 件
stm32f4xx_hal_iwdg.h 中。
三、程序设计
1、程序思路
开启STM32的独立看门狗,按键按下即喂狗,如果超时未喂狗,则看门狗复位系统,用指示灯指示系统复位。分别演示喂狗和不喂狗的两种状态。
2、cubmx配置
(1)开启rcc时钟,串口通信配置、独立开门狗配置、一个按键PA0、一个led等PF9
(2)独立开门狗配置
rc时钟源是32khz左右,这样设置相当于3秒。
3、编程思路
初始化进入while(1)之前,设置一个led的亮灭并打印一行信息代表复位
while循环内按键代表喂狗,使用函数HAL_IWDG_Refresh(&hiwdg);
int fputc(int ch ,FILE *p)
{
while(!(USART1->SR & (1<<7)));
USART1->DR = (uint8_t)ch;
return ch;
}
/* USER CODE END 0 */
/**
* @brief The application entry point.
*
* @retval None
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_IWDG_Init();
/* USER CODE BEGIN 2 */
printf("this is IWDG\r\n");
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_SET);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_SET)
{
HAL_Delay(20);
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_SET) //按键判断
{
HAL_IWDG_Refresh(&hiwdg); //看门狗喂狗操作
}
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
4、项目展示
独立看门狗实验演示