窗口看門狗一樣的相似於獨立看門狗。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的學習教程,若有錯誤,不足,能夠改進的地方歡迎留言交流。