窗口看门狗同样的类似于独立看门狗。

      相比于独立看门狗,窗口看门狗就是喂狗的时间是一个有上下限的范围内(窗口),我们可以通过设定相关的寄存器,设定其上线时间(下线固定)。喂狗的时间不能够过早也不能够过晚。

       窗口看门狗的下限时间是固定的,是0x3ff。当七位递减计数器从0x7f逐个递减到0x3ff时,等到了0x40时(如果此时是打开了早期看门狗中断的情况下)就会进入早期看门狗中断,在中断里面可以进行喂狗。从而防止复位情况的发生。如果计数器从0x40跳变到0x3ff时,也就是说第6位从1跳变成了0。就会执行复位的操作。

       如果在上窗口的计数值之前就喂狗,也会进入复位。

       所以喂狗的时间不能太早也不能太晚,需要在正常的窗口期内。

       关于窗口期的时间的计算。

       主要取决于两点 , 一点是:分频以后的送入窗口看门狗的时钟频率。

                                    第二点是:上限窗口计数值的设置。

        最大的时间设置就是把上限设置成111 1111 (7f)这样子整个窗口的计数值有7f-3f;也就是上限减去下线的计数值。表明了进行了多少次的计数。

         最小的时间设置就是把上限设置成0x40 这样子       整个窗口的计数值有40-3f =1;也就是一个时钟的周期的时间就是最小的时间。     

          也可以设置成其他的值,计算方法同上。就是计数的次数*一个周期所需要花费的时间。   

WWDG操作HAL库函数      

HAL_StatusTypeDef   HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg);
void     HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg);
HAL_StatusTypeDef HAL_WWDG_Start(WWDG_HandleTypeDef *hwwdg);
HAL_StatusTypeDef HAL_WWDG_Start_IT(WWDG_HandleTypeDef *hwwdg);
HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg);
void     HAL_WWDG_IRQHandler(WWDG_HandleTypeDef *hwwdg);
void     HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef* hwwdg);

窗口看门狗配置过程

//1.使能窗口看门狗时钟:
     HAL_WWDG_MspInit中
//2. 初始化窗口看门狗:设置分频系数,窗口值,计数值等。
     HAL_WWDG_Init(); 
     该函数还可以使能窗口看门狗提前唤醒中断 。
//3.设置提前唤醒中断优先级:
    HAL_WWDG_MspInit
//4.编写提前唤醒中断处理函数,喂狗:
   HAL_WWDG_EarlyWakeupCallback();
   HAL_WWDG_Refresh();

 

                下面是实列的代码,小伙伴们可以参考。用作使用窗口看门狗的使用案例:

wwdg.h

#ifndef _WWDG_H

#define _WWDG_H
#include "sys.h"
void WWDG_Init(void);

#endif

wwdg.c

#include "sys.h"
#include "wwdg.h"
#include "led.h"
WWDG_HandleTypeDef wwdg_handler;
void WWDG_Init(void)
{
	wwdg_handler.Instance=WWDG;
	wwdg_handler.Init.Counter=0x7f;//设置重新装载值
	wwdg_handler.Init.Prescaler=WWDG_PRESCALER_8; 
	wwdg_handler.Init.Window=0x5f;//设置窗口值
	HAL_WWDG_Init(&wwdg_handler);//窗口看门狗的初始化设置
	
	HAL_WWDG_Start_IT(&wwdg_handler);//开启带有中断功能的看门狗使能,其实开启看门狗这句代码,写在哪里都可以,具体的看情况。
}
void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg)//写入关于MCU级别的一些配置。
{
	__HAL_RCC_WWDG_CLK_ENABLE();
	
	HAL_NVIC_EnableIRQ(WWDG_IRQn);
	HAL_NVIC_SetPriority(WWDG_IRQn,2,2);
		
}
void WWDG_IRQHandler(void)
{
	HAL_WWDG_IRQHandler(&wwdg_handler);
}
void HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef* hwwdg)
{
	HAL_WWDG_Refresh(&wwdg_handler,0x7f);
	LED1=!LED1;//通过对于初始的装载值和发生中断的值0x40之间的关系计算得到
	            //大约0.046s喂狗一次,也就说正常的情况下,正常喂狗的情况下。大约0.046s
	           //LED1的状态就会改变一次
}

main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "wwdg.h"

int main(void)
{

    HAL_Init();                     //初始化HAL库   
    Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz
    delay_init(180);                //初始化延时函数
    uart_init(115200);              //初始化USART
    LED_Init();                     //初始化LED 
    KEY_Init();                     //初始化按键
	LED0=0;
	delay_ms(300);
	WWDG_Init();
    while(1)
    {
        LED0=1;
    }
}

 

             程序参考了正点原子系列的f429的学习教程,如有错误,不足,可以改进的地方欢迎留言交流。