窗口看门狗同样的类似于独立看门狗。
相比于独立看门狗,窗口看门狗就是喂狗的时间是一个有上下限的范围内(窗口),我们可以通过设定相关的寄存器,设定其上线时间(下线固定)。喂狗的时间不能够过早也不能够过晚。
窗口看门狗的下限时间是固定的,是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的学习教程,如有错误,不足,可以改进的地方欢迎留言交流。