WWDG(窗口看门狗)知识总结及编程实战

1.WWDG基础知识总结

1.1WWDG工作原理

在这里插入图片描述
1)产生系统复位信号和提前唤醒中断的计数器
2)当递减计数器值从 0x40减到0x3F时复位(即T6位跳变到0)
3)计数器的值大于W[6:0]值时喂狗会复位
4)提前唤醒中断 (EWI):当递减计数器等于 0x40 时可产生
5)在窗口期内重装载计数器的值,防止复位

1.2WWDG超时时间计算在这里插入图片描述

1.3 WWDG寄存器

控制寄存器 (WWDG_CR):用于使能窗口看门狗工作,以及重装载计数器值(即喂狗)
配置寄存器 (WWDG_CFR):用于使能窗口看门狗提前唤醒中断( 0x40 ),设置预分频系数,设置窗口上限值
状态寄存器 (WWDG_SR):用于判断是否发生了WWDG提前唤醒中断

1.4WWDG工作原理

在这里插入图片描述
复位三个条件:使能、T6跳变为0,在非窗口期喂狗,

1.5 WWDG配置步骤

1,WWDG工作参数初始化 HAL_WWDG_Init()
2,WWDG Msp初始化 HAL_WWDG_MspInit() 配置NVIC、CLOCK等
3,设置优先级,使能中断 HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
4,编写中断服务函数 WWDG_IRQHandler() ->HAL_WWDG_IRQHandler
5,重定义提前唤醒回调函数 HAL_WWDG_EarlyWakeupCallback()
6,在窗口期内喂狗 HAL_WWDG_Refresh()

2.WWDG编程实战

2.1 wdg.h

#ifndef __WDG_H
#define __WDG_H

#include "./SYSTEM/sys/sys.h"

extern WWDG_HandleTypeDef g_wwdg_handle;

//1,WWDG工作参数初始化  
void wwdg_init(uint8_t tr,uint8_t wr,uint32_t fprer);

#endif

2.2 wdg.c

#include "./BSP/WDG/wdg.h"
#include "./BSP/LED/led.h"

WWDG_HandleTypeDef g_wwdg_handle;

//1,WWDG工作参数初始化  
void wwdg_init(uint8_t tr,uint8_t wr,uint32_t fprer)
{
    g_wwdg_handle.Instance = WWDG;                  //WWDG 寄存器基地址
    g_wwdg_handle.Init.Counter = tr;                //设置计数器值
    g_wwdg_handle.Init.Window = wr;                 //设置窗口值
    g_wwdg_handle.Init.Prescaler= fprer;            //设置分屏系数
 
    g_wwdg_handle.Init.EWIMode = WWDG_EWI_ENABLE;   //使能窗口看门狗前提唤醒中断
    HAL_WWDG_Init(&g_wwdg_handle);                  //初始化WWDG
}


//2,回调函数WWDG Msp初始化            HAL_WWDG_MspInit()    配置NVIC、CLOCK等
void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg)
{
    __HAL_RCC_WWDG_CLK_ENABLE();                    //使能窗口看门狗时钟
    //3,设置优先级,使能中断
    HAL_NVIC_SetPriority(WWDG_IRQn,2,3);            //抢占优先级2,子优先级3
    HAL_NVIC_EnableIRQ(WWDG_IRQn);                  //使窗口看门狗中断
}


//4,编写中断服务函数 WWDG_IRQHandler() ->HAL_WWDG_IRQHandler
void WWDG_IRQHandler(void)
{
    HAL_WWDG_IRQHandler(&g_wwdg_handle);            //调用WWDG共用中断处理函数
}

//5,重定义提前唤醒回调函数   HAL_WWDG_EarlyWakeupCallback()
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
    //6,在窗口期内喂狗 
    HAL_WWDG_Refresh(&g_wwdg_handle);              //更新窗口看门狗值
    LED1_TOGGLE();                                 //绿灯闪烁
}

2.3 main.c

#include "./BSP/WDG/wdg.h"

int main(void)
{    
    HAL_Init();                             /* 初始化HAL库 */
    sys_stm32_clock_init(336, 8, 2, 7);     /* 设置时钟,168Mhz */
    delay_init(168);                        /* 延时初始化 */
    usart_init(115200);                     /* 串口初始化为115200 */
    led_init();                             /* 初始化LED */
    LED0(0);                                /* 初始化LED */
    delay_ms(300);                          /* 延时300s,再初始化看门狗,LED0灯变化可见 */
    wwdg_init(0X7F, 0X5F, WWDG_PRESCALER_8);/* 计数器值为7f,窗口寄存器为5f,分频数为8 */
    
    while(1)
    {
        LED0(1);                            /* 关闭红灯 */
      
    }
}
  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_libinc++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值