窗口看门狗的学习

窗口看门狗一样的相似于独立看门狗。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的学习教程,若有错误,不足,能够改进的地方欢迎留言交流。                         

相关文章
相关标签/搜索