窗口看門狗的學習

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

相關文章
相關標籤/搜索