窗口看门狗一样的相似于独立看门狗。ide
相比于独立看门狗,窗口看门狗就是喂狗的时间是一个有上下限的范围内(窗口),咱们能够经过设定相关的寄存器,设定其上线时间(下线固定)。喂狗的时间不可以过早也不可以过晚。函数
窗口看门狗的下限时间是固定的,是0x3ff。当七位递减计数器从0x7f逐个递减到0x3ff时,等到了0x40时(若是此时是打开了早期看门狗中断的状况下)就会进入早期看门狗中断,在中断里面能够进行喂狗。从而防止复位状况的发生。若是计数器从0x40跳变到0x3ff时,也就是说第6位从1跳变成了0。就会执行复位的操做。学习
若是在上窗口的计数值以前就喂狗,也会进入复位。spa
因此喂狗的时间不能太早也不能太晚,须要在正常的窗口期内。code
关于窗口期的时间的计算。教程
主要取决于两点 , 一点是:分频之后的送入窗口看门狗的时钟频率。it
第二点是:上限窗口计数值的设置。io
最大的时间设置就是把上限设置成111 1111 (7f)这样子整个窗口的计数值有7f-3f;也就是上限减去下线的计数值。代表了进行了多少次的计数。class
最小的时间设置就是把上限设置成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的学习教程,若有错误,不足,能够改进的地方欢迎留言交流。