STM32-窗口看门狗WWDG剖析与实例

窗口看门狗

窗口看门狗WWDG简介

        窗口看门狗(WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在 T6 位(WWDG->CR 的第六位)变成 0 前被刷新,看门狗电路在达到预置的时间周期时,会产生一个 MCU 复位。在递减计数器达到窗口配置寄存器(WWDG->CFR)数值之前,如果 7位的递减计数器数值(在控制寄存器中)被刷新, 那么也将产生一个 MCU 复位。

STM32-窗口看门狗WWDG剖析与实例_第1张图片

WWDG的特性

可配置的时间窗,用来检测应用程序非预期中的运行流程(过早或过晚)

看门狗复位条件

计数器值=0x40产生早期唤醒中断(EWI)WWDG的特性

①使能了看门狗的情况下,自减计数器值小于0x40

②使能了看门狗的情况下,喂狗时间大于上窗口的值

STM32-窗口看门狗WWDG剖析与实例_第2张图片

WWDG工作原理框图分析

STM32-窗口看门狗WWDG剖析与实例_第3张图片

窗口看门狗的时钟

窗口看门狗时钟来自 PCLK1,PCLK1 最大是 42M,由 RCC 时钟控制器开启。

STM32-窗口看门狗WWDG剖析与实例_第4张图片

计数器的时钟

计数器时钟由 CK计时器时钟经过预分频器分频得到,分频系数由配置寄存器 CFR 的位 8:7 WDGTB[1:0]配置

STM32-窗口看门狗WWDG剖析与实例_第5张图片

计数器

窗口看门狗的计数器是一个递减计数器,共有 7 位,其值存在控制寄存器 CR 的位6:0,

即 T[6:0],当 7 个位全部为 1时是 0X7F,这个是最大值

当递减到 T6 位变成 0时,即从0X40 变为 0X3F时候,会产生看门狗复位。这个值0X40 是看门狗能够递减到的最小值,

当递减计数器递减到 0X40 的时候,还不会马上产生复位,如果使能了提前唤醒中断:CFR 位 9 EWI 置 1,则产生提前唤醒中断,如果真进入了这个中断的话,就说明程序肯定是出问题了,

那么在提前唤醒中断的处理程序中我们就需要做最重要的工作,比如保存重要数据,或者报警等,这个中断我们也叫它死前中断。

窗口值

窗口值得范围:

        下窗口的值是固定的 0X40,上窗口的值可以改变,具体的由配置寄存器 CFR 的位 6:0 W[6:0]设置。其值必须大于 0X40,如果小于或者等于 0X40就是失去了窗口的价值,而且也不能大于计数器的值,所以必须得小于 0X7F。

如何设置窗口值:

        这个得根据我们需要监控的程序的运行时间来决定。如果我们要监控的程序段 A 运行的时间为Ta,当执行完这段程序之后就要进行喂狗,如果在窗口时间内没有喂狗的话,那程序就肯定是出问题了。一般计数器的值 TR设置成最大 0X7F,窗口值为 WR,计数器减一个数的时间为 T,那么时间:

        (TR-WR)*T 应该稍微小于 Ta即可

STM32-窗口看门狗实例讲解

实验要求:

开启STM32的窗口看门狗,并使能唤醒中断。主程序正常运行时喂狗,用按键中断模拟程序故障死机,此时将触发唤醒中断并产生复位,用LED灯指示唤醒中断的触发。

cubemx配置

注意使能WWDG中断

STM32-窗口看门狗WWDG剖析与实例_第6张图片

程序部分

我们使用按键中断去模拟程序出错,即:在按键中断中不断延时或死循环使主程序无法喂狗
 

​​​​​​​void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin == GPIO_PIN_0){
        printf("程序故障\n");
        while(1);            //模拟死机
    }
}

 WWDG唤醒中断

void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
	HAL_GPIO_WritePin(GPIOF, GPIO_PIN_8, GPIO_PIN_RESET);
	printf("WWDG_EarlyWakeupCallback\n");
}

主程序

	printf("this is WWDG test\n");
	HAL_GPIO_WritePin(GPIOF, GPIO_PIN_8, GPIO_PIN_SET);	//先熄灭LED灯
	wr = WWDG->CFR & 0x7f;	//获取上窗口的值
	
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		tr = WWDG->CR & 0x7f;
		if(tr < wr){
			HAL_WWDG_Refresh(&hwwdg);
		}
		
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

实验现象

STM32-窗口看门狗WWDG剖析与实例_第7张图片

可以发现 WWDG唤醒中断中的printf中的内容并不能完全打印,所以我们要尽可能地把最重要的信息放在 WWDG唤醒中断中保存

你可能感兴趣的:(stm32开发,stm32,嵌入式硬件,单片机)