STM32---WWDG(窗口看门狗)超详细

写在前面:上节我们学习了独立看门狗(IWDG)相关知识,本节我们来学习另外一个看门狗——WWDG窗口看门狗,内容并不难,但是目前这些看门狗的具体内容,还没有得到一个很好的应用,还是先学习吧,后面应该会得到一个应用。

目录

一、WWDG介绍

二、WWDG工作原理

三、WWDG工作框图

  四、WWDG相关寄存器      

4.1控制寄存器WWDG_CR

4.2配置寄存器(WWDG_CFR)

4.3状态寄存器WWDG_SR

4.4WWDG超时时间计算

五、WWDG配置步骤

5.1配置步骤

5.2相关HAL库函数介绍

六、实验源码 

6.1实验说明

6.2源码

6.3实验现象

6.4 IWDG同WWDG的区别:  

一、WWDG介绍

全称:Windows watchdog,即窗口看门狗;

本质:能产生系统复位信号提前唤醒中断的计数器;

特性:1、递减计数器;

           2、产生复位信号的条件有两个:当递减计数器从0x40减至0x3F时会产生复位信号当计数器的值大于W[6:0]值时,喂狗会产生复位信号。后面会对这两点做详细的说明。

          3、提前唤醒中断(EWI):当递减计数器等于0x40时,会产生一个提前唤醒中断。

喂狗:在窗口期内重装载计数器的值,防止复位信号的产生;

作用:用于监测单片机程序运行时效是否准确,主要检测软件异常。

应用:在需要精准检测程序运行时间的场合;

二、WWDG工作原理

其工作原理用下图可以进行一个很好的说明:

        如上图所示:首先WWDG的本质是一个递减计数器,是一个能够产生复位信号以及中断信号的递减计数器 ,纵坐标为递减计数器的值,此递减计数器共有7位(T[6:0]),这样递减计数器的最大值位127,而且递减计数器的值是可以进行软件设置的。

        递减计数器的值一旦给定后,随着时钟信号的到来,递减计数器的值进行递减。此时我们会设置一个窗口上限值W[6:0],窗口上限值共7位,最大值为127。在递减计数器初值与窗口上限期这一段时间,我们称为非窗口期,这个时期内喂狗就会产生复位。

        既然有窗口上限值,那么也一定有窗口下限值,窗口下限值为0x3F,是固定的不能改变。那么窗口上限值就必须比窗口下限值高,否则无窗口期。窗口期就是窗口上限值到窗口下限值之间的时期。在窗口期内进行喂狗是不会产生复位的,而当递减计数器的值减至窗口下限值时,也会产生复位。

        此外,如果启动了看门狗并且允许中断,当递减计数器等于0x40时产生早期唤醒中断(EWI)。

综上所述:

产生复位的条件:1、当递减计数器的值小于0x40,(若看门狗被启动)则产生复位。2、 当递减计数器在窗口外被重新装载,(若看门狗被启动)则产生复位。

产生中断的条件:启动了看门狗并且允许中断,当递减计数器等于0x40时产生早期唤醒中断(EWI)。

三、WWDG工作框图

        如上图所示,其WWDG的工作框图或者说是工作流程,首先,WWDG的的时钟信号来自PCLK1,(即图1部分)然后经过看门狗预分频器进行分频(即图2部分)此处也涉及相关的寄存器进行操作。然后再到看门狗控制寄存器(即图3部分),共8位,其中首位为激活位,后面为T[6:0]的值。 

        看门狗配置寄存器(即图4部分),为窗口上限值,当图3看门狗控制寄存器的值W6大于图4看门狗配置寄存器的值T6,则说明已经进入窗口期(比较器输出0),否则为非窗口期(比较器输出1)。

        在上图的左边还有三个逻辑门电路,

        a为一个与门,即要产生复位信号必须有两点:1、WDGA(激活位值1);2、b门输出1。

        b为一个或门,要产生1有两种选择,1、T6为0(取翻后就是1)即递减计数器减至窗口下限值。2、c门输出1。

        c为一个与门,要产生1必须有两个条件:1、进行喂狗。2、非窗口期(比较器输出1)。

        这个电路也满足我们所说的产生复位的两种选择:当递减计数器的值小于0x40,(若看门狗被启动)则产生复位 当递减计数器在窗口外被重新装载,(若看门狗被启动)则产生复位。

  四、WWDG相关寄存器      

4.1控制寄存器WWDG_CR

该寄存器的功能为:用于使能窗口看门狗工作,以及计数器的值。

控制寄存器共有8位:位7:为上面流程图中的WDGA激活位 。T[6:0]用来存储看门狗的计数器的值,随时更新的,每隔 (4096×2^ WDGTB[2:0])PCLK 个周期减 1。当该计数器的值从 0x40 变为 0x3F 的时候,将产生看门狗复位。

注:此处同IWDG不同的是,WWDG中计数器的值可以直接赋,不要在经过什么其他的寄存器进行赋值。

4.2配置寄存器(WWDG_CFR)

该寄存器共有10位;

位9;WEI:提前唤醒中断,如果该位置 1,当递减计数器等于 0x40 时产生提前唤醒中断,我们就可以及时喂狗以避免 WWDG 复位。我们一般都会用该位来设置中断,当窗口看门狗的计数器值减到 0X40 的时候,如果该位设置,并开启了中断,则会产生中断,我们可以在中断里面向 WWDG_CR 重新写入计数器的值,来达到喂狗的目的。需要注意这里在进入中断后,必须在不大于 1 个窗口看门狗计数周期的时间(在 pclk1 频率为 36M 且 WDGTB 为 0 的条件下,该时间为 113us)内重新写 WWDG_CR,否则,看门狗将产生复位!

位8:7 WDGTB:设置预分频系数。

位6:0 W[6:0]设置窗口上限值。

4.3状态寄存器WWDG_SR

        该寄存器只有一位有效,当计数器值达到40h时,此位由硬件置’1’。它必须通过软件写’0’来清除。对此位写’1’无效。若中断未被使能,此位也会被置’1。主要用于判断是否发生了WWDG提前唤醒中断。

4.4WWDG超时时间计算

五、WWDG配置步骤

5.1配置步骤

1、WWDG工作参数初始化 HAL_WWDG_Init();

2、WWDGMsp初始化 HAL_WWDG_MspIint(); 配置NVIC,Clock等

3、设置优先级,使能中断 HAL_NVIC_SetPriority()、NVIC_EnabledPQ();

4、编写中断服务函数 WWDG_IPQHandler()、HAL_WWDG_IPQHandler();

5、重定义提前唤醒回调函数 HAL_WWDG_EarlyWakeup Callback();

6、在窗口期喂狗 HAL_WWDG_Refresh();

5.2相关HAL库函数介绍

HAL_WWDG_Init()使能WWDG,设置预分频系数和窗口值等

该函数的参数主要有:外设基地址,预分频系数,窗口值,计数器值,以及是否开启中断。

HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg)进行重装载值,也就是喂狗。

六、实验源码 

6.1实验说明

        本次我们所设计的实验,主要是基于WWDG的一个操作,利用喂狗进行LED等的控制。设置一个计数器值为0X7F,窗口值为0X5F,预分频系数为8。在中断中喂狗,并且LED1 开始不停的闪烁。喂一次狗,LED1的状态发生一个转变。

6.2源码

main.c

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/wwdg/wwdg.h"
#include "./BSP/led/led.h"
int main(void)
{
    HAL_Init();                              /* 初始化HAL库 */
    sys_stm32_clock_init(RCC_PLL_MUL9);      /* 设置时钟, 72Mhz */
    delay_init(72);                          /* 延时初始化 */
    led_init();                              /* LED初始化 */
    led0(0);                                 /* LED点亮 */
    delay_ms(300);                           /* 延时 300ms*/
    wwdg_init(0X7F,0X5F,WWDG_PRESCALER_8 );  /* 计数值为 7f,窗口值为 5f,分频数为 8 */
    while(1)
    { 
       led0(1);
    }
}

wwdg.c

#include "./BSP/wwdg/wwdg.h"
#include "./BSP/led/led.h"
WWDG_HandleTypeDef wwdg_handler;

//窗口看门狗初始化函数
void wwdg_init(uint8_t tr,uint8_t wr,uint32_t fprer )
{
   wwdg_handler.Instance= WWDG;                 //设置寄存器基地址;
   wwdg_handler.Init.Counter= tr;               //设置计数器的值;
   wwdg_handler.Init.Prescaler= fprer;          //设置预分频系数;
   wwdg_handler.Init.Window= wr;                //设置窗口值;
   wwdg_handler.Init.EWIMode=WWDG_EWI_ENABLE;   //设置使能窗口看门狗唤醒中断; 
        HAL_WWDG_Init(&wwdg_handler);
}
//WWDG.Msp回调函数
void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg)
{
    __HAL_RCC_WWDG_CLK_ENABLE();               //使能窗口看门狗时钟;
    HAL_NVIC_SetPriority(WWDG_IRQn, 2, 3);      //设置抢占优先级,子优先级;
    HAL_NVIC_EnableIRQ(WWDG_IRQn);
}


//WWDG中断服务函数
void WWDG_IRQHandler(void)
{
  HAL_WWDG_IRQHandler(&wwdg_handler);//HAL库函数中断服务函数,会进行回调函数
}

//WWDG提前唤醒函数
 void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
 {
         HAL_WWDG_Refresh(&wwdg_handler);
     HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_5);//led1的状态发生转变。
 }

 led.c

#include "./BSP/led/led.h"

void led_init(void)
{
   GPIO_InitTypeDef led_Init0;
    __HAL_RCC_GPIOB_CLK_ENABLE();
    led_Init0.Mode= GPIO_MODE_OUTPUT_PP;
    led_Init0.Pin=GPIO_PIN_5;
    led_Init0.Pull=GPIO_PULLUP;
    led_Init0.Speed=GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &led_Init0);
    
    GPIO_InitTypeDef led_Init1;
    __HAL_RCC_GPIOE_CLK_ENABLE();
    led_Init1.Mode= GPIO_MODE_OUTPUT_PP;
    led_Init1.Pin=GPIO_PIN_5;
    led_Init1.Pull=GPIO_PULLUP;
    led_Init1.Speed=GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOE, &led_Init1);
    
    
     HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5, GPIO_PIN_SET);
     HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5, GPIO_PIN_SET);
}


void led0(uint8_t i)
{
if(i==1)
{
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5, GPIO_PIN_SET);
}
else
     HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5, GPIO_PIN_RESET);
   
}


链接:https://pan.baidu.com/s/14dAl0T__LOvOIa1t6NTFaA 
提取码:1022

6.3实验现象

        我们首先进入main函数,初始化系统和用户外设,然后点亮LED0,延时300ms后,初始化看门狗,进入循环,关闭LED0。然后在看门狗中进行LED1的状态转变与喂狗,如果LED1的状态发生转变,则说明喂狗成功。

窗口看门狗

6.4 IWDG同WWDG的区别 

STM32---IWDG(独立看门狗),超详细,小白入-CSDN博客

IWDGWWDG
时钟源LSI 40KHzPCLK1
复位条件递减计数到0

计数值大于窗口值,喂狗

计数值减到0X3F

中断没有中断计数值减到0x40可产生中断
递减计数器12位7位
应用场合防止程序跑飞,死循环检测程序时效

总结:本节我们接着独立看门狗的内容,讲述了窗口看门狗的内容,主要有简介、工作原理、工作框图、相关寄存器以及配置步骤,还有相关实验进行说明,以及IWDG同WWDG的对比。内容不算太难,大家可以多多尝试。

创作不易,还请大家多多点赞支持!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/305355.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于apache的http文件服务配置

背景: 公司的产品使用的第三方模组可以OTA,厂家提供的是window开启软件,这样就可以在本机做http下载服务器,然后使用端口映射的方式,公开到外网,这样就可以进行4G网络访问内网服务器了。但这个有个弊端&am…

【前沿技术杂谈:ChatGPT】ChatGPT——热潮背后的反思

【前沿技术杂谈:ChatGPT】ChatGPT——热潮背后的反思 缘起:无中生有,涅槃重生人工智能技术人工智能的发展史无中生有内容自动生成技术的发展代表企业OpenAI-GPT系列技术的发展历程ChatGPT新特点 热潮:万众瞩目,群雄逐鹿…

YOLOv5改进 | 主干篇 | EfficientNetV2均衡缩放网络改进特征提取层

一、本文介绍 这次给大家带来的改进机制是EfficientNetV2,其在其V1版本通过均衡地缩放网络的深度、宽度和分辨率,以提高卷积神经网络的性能的基础上,又提出了一种改进的渐进式学习方法,通过在训练过程中逐步增加图像尺寸并适应性调整正则化来加快训练速度,同时保持准确性…

Apollo基础 - Frenet坐标系

Frenet与笛卡尔坐标系的转换详细推导见&#xff1a;b站老王 自动驾驶决策规划学习记录&#xff08;四&#xff09; Apollo相关代码&#xff1a; modules/common/math/cartesian_frenet_conversion.h #pragma once #include <array> #include "modules/common/mat…

2024年,前端必会的console骚操作

调试。程序员们努力地避免的东西,只为在代码中制造更多的错误。 编写无错误的代码是即使是最好的程序员也会觉得难以实现的。这就是为什么你应该总是调试代码。 而调试JavaScript代码的最好方法之一就是了不起的console.log()。除此之外,还有更好的方法。 这也正是本文的重点…

网络多线程开发小项目--QQ登陆聊天功能(用户登陆功能实现)

9.1.1用户登陆功能实现 1、需求分析 2、代码实现 2.1、Client和Server端共有类 1&#xff09;cn.com.agree.qqcommon.Message package cn.com.agree.qqcommon;import lombok.Data; import lombok.extern.slf4j.Slf4j;import java.io.Serializable; Slf4j Data public class M…

python 基础笔记

基本数据类型 函数 lamda 匿名函数 成员方法 类 类与对象 构造方法 魔术方法 私有成员 私有方法 继承 注解 变量注解 函数注解 Union类型 多态 参考链接&#xff1a;黑马程序员python教程&#xff0c;8天python从入门到精通&#xff0c;学python看这套就够了_哔哩哔哩_bilib…

PTA✨C语言 求1到N的和

7-6 求1到N的和 分数 15 全屏浏览题目 切换布局 作者 颜晖 单位 浙大城市学院 本题要求编写程序&#xff0c;计算序列 1 2 3 ... 的前N项之和。 输入格式: 输入在一行中给出一个正整数N。 输出格式: 在一行中按照“sum S”的格式输出部分和的值S&#xff0c;请注意…

HttpClient调用外部接口业务别忘了超时配置!公司工具类打包好啦

前言 在工作中&#xff0c;往往会遇到需要对接外部接口的业务需求&#xff0c;根据接口文档确定请求IP以及相关的参数数据需求后&#xff0c;通过HttpClient进行第三方外部接口的调用。在这种业务中&#xff0c;也要考虑好请求超时导致的接口报错的处理。为什么呢&#xff1f;就…

Python教程37:使用turtle画一个戴帽子的皮卡丘

---------------turtle源码集合--------------- Python教程36&#xff1a;海龟画图turtle写春联 Python源码35&#xff1a;海龟画图turtle画中国结 Python源码31&#xff1a;海龟画图turtle画七道彩虹 Python源码30&#xff1a;海龟画图turtle画紫色的小熊 Python源码29&a…

在Ubuntu中检查内存的五个命令,总有一种适合你

序言 作为Ubuntu用户,尤其是管理员,我们需要检查系统使用了多少内存资源,以及有多少是可用的。我们还知道,大多数管理任务最好从Linux命令行完成,而不是从图形用户界面完成。例如,服务器通常在shell上工作,没有图形用户界面。由于控制服务器上的内存资源是最重要的,因…

平衡搜索二叉树(AVL树)

前言 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查 找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-Velskii 和E.M.Landis在1962年 发明了一种解决上述…

体元法--体积计算

文章目录 环境&#xff1a;1.1 体元法介绍&#xff1a;2.1 python代码3.1 可视化 环境&#xff1a; Open3D 1.1 体元法介绍&#xff1a; 用一个个体素去占据点云&#xff0c;然后对所有体素求和 2.1 python代码 conda activete deeplabv3plus(环境名称–安装好open3D的) py…

【Python机器学习】决策树集成——随机森林

理论知识&#xff1a; 集成是合并多个机器学习模型来构建更强大模型法方法。 随机森林本质上是许多决策树的集合&#xff0c;其中每棵树都和其他数略有不同&#xff0c;随机森林背后的思想是&#xff1a;每棵树的预测可能都比较好&#xff0c;但是可能对部分数据过拟合&#…

若依项目的table列表中对每一个字段增加排序按钮(单体版和前后端分离版)

一、目标:每一个字段都添加上下箭头用来排序 只需要更改前端代码,不需要更改后端代码,后面会讲解原理 二、单体版实现方式: 1.在options中添加sortable:true 2.在需要排序的字段中添加sortable:true 三、前后端分离版 1.el-table上添加@sort-change=“handleSortChange”…

MySQL的导入导出及备份

一.准备导入之前 二.navicat导入导出 ​编辑 三.MySQLdump命令导入导出 四.load data file命令的导入导出 五.远程备份 六. 思维导图 一.准备导入之前 需要注意&#xff1a; 在导出和导入之前&#xff0c;确保你有足够的权限。在进行导入操作之前&#xff0c;确保目标数据…

Tensorflow2.0笔记 - 创建tensor

tensor创建可以基于numpy&#xff0c;list或者tensorflow本身的API。 笔记直接上代码&#xff1a; import tensorflow as tf import numpy as np import matplotlib.pyplot as plttf.__version__#通过numpy创建tensor tensor0 tf.convert_to_tensor(np.ones([2,3])) print(te…

GitHub 一周热点汇总 第4期 (2024/01/01-01/06)

GitHub一周热点汇总第四期 (2023/12/24-12/30)&#xff0c;梳理每周热门的GitHub项目&#xff0c;了解热点技术趋势&#xff0c;掌握前沿科技方向&#xff0c;发掘更多商机。2024年到了&#xff0c;希望所有的朋友们都能万事顺遂。 说明一下&#xff0c;有时候本周的热点项目会…

null和undefined的区别

null 和 undefined 是 JavaScript 中的两个基础类型特殊值。它们都表示“空”&#xff0c;但是有一些区别。 一、null 在 JavaScript 内部&#xff0c;null 被视为一个表示空值或缺少值的对象指针。在计算机内存中&#xff0c;它通常被表示为一个指向内存空间的空指针。这意味…

源码开发实践:搭建企业培训APP的技术难题及解决方案

在企业培训源码开发实践中&#xff0c;各位开发者可能遇到各种各样的问题&#xff0c;本文将深入探讨这些挑战&#xff0c;并提供解决方案&#xff0c;助力你顺利搭建企业培训APP。 1.多平台兼容性 企业中员工使用的设备多种多样&#xff0c;包括iOS、Android等不同操作系统。…