STM32第6章、WWDG

一、简介

        WWDG:全称Window watchdog,即窗口看门狗,本质上是一个能产生系统复位信号和提前唤醒中断的计数器。

        特性:

                是一个递减计数器。

                看门狗被激活后,

                        当递减计数器值从 0x40减到0x3F时会产生复位(即T6位跳变到0)。

                        当计数器的值大于W[6:0]值时喂狗会产生复位。

                        当递减计数器等于 0x40 时可产生提前唤醒中断 (EWI)。

        喂狗操作:在窗口期内重装载计数器的值,防止复位。

        作用:

                由于外界电磁干扰或者自身系统(硬件或软件)异常,会造成程序跑飞,如:陷入某个不正常的死循环,打断正常的程序运行。

                WWDG解决的问题就是:由于软件异常导致的程序跑飞问题。

        应用:

                WWDG主要应用于一些需要高稳定性的产品中,并且需要精准监测程序运行时间的场合。

二、工作原理        

        W[6:0]  <  非窗口期  <= T[6:0] 

        0x3F  <  窗口期  <= W[6:0] 

        复位信号:

                在非窗口期喂狗时,会生成复位信号;

                当递减计数器值减到0x3F时,会产生复位信号。

        提前唤醒中断:

                当递减计数器值减到0x40时,可产生提前唤醒中断 (EWI)。

三、功能框图                

1. 时钟信号        

        时钟源:

                PCLK是时钟源。

                PCLK时钟频率十分精确,例如:F1用36MHz,F4用42MHz。

                PCLK时钟需要程序员手动开启。

        WWDG时钟:

                由时钟源PCLK经过分频器进行4096分频后,再经过WWDG预分频器进行分频后得到的时钟频率,就是WWDG的时钟。

                WWDG时钟为递减计数器提供时钟信号,每发生一个WWDG时钟,递减计数器的值就会减1。

2. 模块       

        ①  WWDG_CFR配置寄存器:

                此寄存器装载着WWDG的窗值W[6:0],用来与WWDG_CR中的T[6:0]进行比较。

        ②  WWDG_CR控制寄存器:

                一共8个bit,第7bit也就是WDGA位是WWDG开启位,当WDGA位置1时,窗口看门狗开启。如果在选项字节中使能了硬件开启窗口看门狗的功能,则WDGA位不起作用。T[6:0]位是一个7位向下递减计数器,取值范围是0x7F至0x40。如果T[6:0]由0x40变为0x3F,即T[6]变为0时,取反输入或门 ⑤ ,则或门 ⑤ 输入1,产生窗口看门狗复位。

        ③  比较器:

                用来比较T[6:0]是否大于W[6:0],如果是,则输出1,否则输出0。如果T[6:0]大于W[6:0],意味着计数器的值现在不在窗口内。如果T[6:0]小于W[6:0],且T[6]不为0,也就是没有递减到0x3F,则计数器的值现在在窗口内,可以重载WWDG_CR,也就是可以喂狗。

        ④  二输入与门:

                一个输入来自比较器 ③,另一个输入来自是否重载WWDG_CR(喂狗),是的话输入1。当T[6:0]大于W[6:0],也就是计数器的值不在窗口内,此时喂狗与门输出1,引发系统复位。

        ⑤  二输入或门:

                一个输入来自于与门 ④ ,另一个输入来自T[6]取反。

        ⑥  二输入与门:

                一个输入来自于或门 ⑤,另一个输入来自WDGA位。

3. 寄存器

        3.1 控制寄存器            

                使能窗口看门狗工作;

                以及重装载计数器值(即喂狗)。 

        3.2 配置寄存器                

                使能窗口看门狗提前唤醒中断;

                设置预分频系数;

                设置窗口上限值。

        3.3 状态寄存器           

                用于判断是否发生了WWDG提前唤醒中断。

四、溢出时间计算

1. 公式      

2. 最短最长溢出时间计算  

五、开发流程

1. 开发步骤        

2. 函数详解

        2.1 HAL_WWDG_Init()函数

                功能:

                        设置预分频系数和窗口值,并使能WWDG。

                函数原型:

                        HAL_StatusTypeDef   HAL_WWDG_Init(WWDG_HandleTypeDef   *hwwdg);

                参数:

                        hwwdg:WWDG句柄。

                                typedef struct
                                {
                                        WWDG_TypeDef      *Instance;    /* WWDG寄存器基地址 */
                                        WWDG_InitTypeDef  Init;             /* WWDG初始化 */
                                } WWDG_HandleTypeDef;

                                

                                typedef struct

                                {  

                                        uint32_t   Prescaler;         /* 预分频系数 */  

                                        uint32_t   Window;            /* 窗口值 */  

                                        uint32_t   Counter;            /* 计数器值 */  

                                        uint32_t   EWIMode;         /* 提前唤醒中断使能 */

                                }WWDG_InitTypeDef;

                返回值:

                        typedef enum
                        {
                                HAL_OK             = 0x00U,         /* 成功 */
                                HAL_ERROR     = 0x01U,         /* 失败 */
                                HAL_BUSY        = 0x02U,         /* 忙碌 */
                                HAL_TIMEOUT  = 0x03U          /* 超时 */
                        } HAL_StatusTypeDef;

                相关寄存器:

                        WWDG_CR、

                        WWDG_CFG。

        2.2 HAL_WWDG_Refresh()函数

                功能:

                        重装载计数器,即喂狗。

                函数原型:

                        HAL_StatusTypeDef  HAL_WWDG_Refresh(WWDG_HandleTypeDef   *hwwdg);

                参数:

                        hwwdg:WWDG句柄。

                返回值:

                        typedef enum
                        {
                                HAL_OK             = 0x00U,         /* 成功 */
                                HAL_ERROR     = 0x01U,         /* 失败 */
                                HAL_BUSY        = 0x02U,         /* 忙碌 */
                                HAL_TIMEOUT  = 0x03U          /* 超时 */
                        } HAL_StatusTypeDef;

                相关寄存器:

                        WWDG_CR。

六、编程实战

1. 思路        

2. 代码

        wwdg.c文件

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


WWDG_HandleTypeDef g_wwdg_handle;

/* 窗口看门狗初始化函数 */
void wwdg_init(uint8_t tr, uint8_t wr, uint32_t fprer)
{
    g_wwdg_handle.Instance = 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 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(&g_wwdg_handle);
}

/* WWDG提前唤醒回调函数 */
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
    HAL_WWDG_Refresh(&g_wwdg_handle);
    LED1_TOGGLE();
}

        main.c文件

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/WDG/wdg.h"


int main(void)
{
    HAL_Init();                                 /* 初始化HAL库 */
    sys_stm32_clock_init(RCC_PLL_MUL9);         /* 设置时钟,72M */
    delay_init(72);                             /* 初始化延时函数 */
    usart_init(115200);                         /* 波特率设置为115200 */
    led_init();                                 /* 初始化LED */
    
    if(__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST) != RESET)
    {
        printf("窗口看门狗复位\r\n");
        __HAL_RCC_CLEAR_RESET_FLAGS();
    }
    else
    {
        printf("外部复位\r\n");
    }
    
    delay_ms(500);
    printf("请在窗口期内喂狗\r\n\r\n");
    wwdg_init(0x7f, 0x5f, WWDG_PRESCALER_8);
    
    while(1)
    {
        delay_ms(90);
        HAL_WWDG_Refresh(&g_wwdg_handle);
        LED0_TOGGLE();
    }
}

七、IWDG与WWDG的主要区别        

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

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

相关文章

国产fpga nvme ip高速存储方案设计

国产高速存储方案主要是使用nvme ip实现高速存储方案&#xff0c;nvme ip采用纯verilog语言实现&#xff0c;用户拿到nvme ip使用起来也很简单。 先看看效果如 zu7eg板子&#xff0c;这个芯片支持pcie3.0 x4. zynq 7045板子只支持pcie 2.0 x4 速度测试&#xff0c;测试nvme …

《框架程序设计》复习题解析-1

目录 单选题 1.以下关于Maven说法错误的是&#xff1f;&#xff08; &#xff09;。 2.在项目的开发过程中&#xff0c;MyBatis承担的责任是( ) 3.当项目引用依赖的范围设置为以下&#xff08; &#xff09;选项时&#xff0c;表示依赖在编译时是必需的&#xff0c;但在运…

STM32F103的ADC通道映射

ADC通道映射 STM32F103带3个ADC控制器&#xff0c;一共支持23个通道&#xff0c;包括21个外部和2个内部信号源。ADC1控制器最多有18个通道&#xff0c;包括16个外部和2个内部信号源。 ADC1和ADC2的16个外部通道相同&#xff0c;且ADC1和ADC2共用一个系统中断向量&#xff0c;A…

Vue2+OpenLayers使用Overlay实现点击获取当前经纬度信息(提供Gitee源码)

目录 一、案例截图 二、安装OpenLayers库 三、代码实现 关键参数&#xff1a; 实现思路&#xff1a; 核心代码&#xff1a; 完整代码&#xff1a; 四、Gitee源码 一、案例截图 二、安装OpenLayers库 npm install ol 三、代码实现 覆盖物&#xff08;Overlay&#xf…

[Transformer] The Structure of GPT, Generative Pretrained Transformer

The Structure of Generative Pretrained Transformer Reference: The Transformer architecture of GPT models How GPT Models Work

【芯片封测学习专栏 -- Substrate | RDL Interposer | Si Interposer | 嵌入式硅桥(EMIB)详细介绍】

请阅读【嵌入式开发学习必备专栏 Cache | MMU | AMBA BUS | CoreSight | Trace32 | CoreLink | ARM GCC | CSH】 文章目录 OverviewSubstrate&#xff08;衬底或基板&#xff09;Substrate 定义Substrate 特点与作用Substrate 实例 RDL Interposer&#xff08;重布线层中介层&a…

基于单片机的无线气象仪系统设计(论文+源码)

1系统方案设计 如图2.1所示为无线气象仪系统设计框架。系统设计采用STM32单片机作为主控制器&#xff0c;结合DHT11温湿度传感器、光敏传感器、BMP180气压传感器、PR-3000-FS-N01风速传感器实现气象环境的温度、湿度、光照、气压、风速等环境数据的检测&#xff0c;并通过OLED1…

【JavaWeb】JavaWeb入门之Tomcat详解

目录 1.Java Web前奏 1.1.C/S结构 1.2.B/S结构 1.3.静态网页和动态网页 1.4.常见的网页 1.5.Web服务器 2.HTTP协议 2.1.HTTP协议概念 2.2.无状态协议 2.3.HTTP1.0和HTTP1.1 2.4.请求协议和响应协议 2.5.请求协议 2.5.1.GET请求 2.5.2.POST请求 2.6.响应协议 1.J…

【SpringBoot】@Value 没有注入预期的值

问题复现 在装配对象成员属性时&#xff0c;我们常常会使用 Autowired 来装配。但是&#xff0c;有时候我们也使用 Value 进行装配。不过这两种注解使用风格不同&#xff0c;使用 Autowired 一般都不会设置属性值&#xff0c;而 Value 必须指定一个字符串值&#xff0c;因为其…

nginx反向代理和负载均衡的区别

1、反向代理&#xff0c;不需要服务器池&#xff0c;直接代理某台服务器 location / {proxy_pass http://192.168.18.201;proxy_set_header Host $host;proxy_set_header X-Forwarded-For $remote_addr; }proxy_set_header Host $host; …

uniApp通过xgplayer(西瓜播放器)接入视频实时监控

&#x1f680; 个人简介&#xff1a;某大型国企资深软件开发工程师&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主&#xff0c;华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码喽的自我修养&#x1f9…

数据结构与算法之二叉树: LeetCode 701. 二叉搜索树中的插入操作 (Ts版)

二叉搜索树中的插入操作 https://leetcode.cn/problems/insert-into-a-binary-search-tree/description/ 描述 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树返回插入后二叉搜索树的根节点。 输入数据 保…

vue el-table 数据变化后,高度渲染问题

场景&#xff1a;el-table设置了height属性&#xff0c;但是切换查询条件后再次点击查询重新获取data时&#xff0c;el-table渲染的高度会有问题&#xff0c;滚动区域变矮了。 解决办法&#xff1a;使用doLayout方法‌&#xff0c;在表格数据渲染后调用doLayout方法可以重新布局…

代码的形状:重构的方向

大概2周前写了一篇《代码的形状:从外到内的探索与实践》 涵树&#xff1a;代码的形状:从外到内的探索与实践 觉得这个话题还可以继续&#xff0c;它是一个从无形到有形的过程&#xff0c;而这个过程感觉就是王阳明先生说的“心即理”的探寻过程。 我讨论代码的形状&#xff…

检验统计量与p值笔记

一、背景 以雨量数据为例&#xff0c;当获得一个站点一年的日雨量数据后&#xff0c;我们需要估计该站点的雨量的概率分布情况&#xff0c;因此我们利用有参估计的方式如极大似然法估计得到了假定该随机变量服从某一分布的参数&#xff0c;从而得到该站点的概率密度函数&#x…

【Linux】Linux基础命令(二)

locate命令 locate命令可以用于快速查找文件的路径&#xff0c;比如我要查找所有.cpp文件的路径&#xff1a; sudo locate *.cppless 命令 less命令和more命令类似&#xff0c;都是查看文件内容&#xff0c;但less命令更强大 可以使用光标上下&#xff08;左右&#xff09;…

精选2款.NET开源的博客系统

前言 博客系统是一个便于用户创建、管理和分享博客内容的在线平台&#xff0c;今天大姚给大家分享2款.NET开源的博客系统。 StarBlog StarBlog是一个支持Markdown导入的开源博客系统&#xff0c;后端基于最新的.Net6和Asp.Net Core框架&#xff0c;遵循RESTFul接口规范&…

多线程 - wait 和 notify

wait wait(等待)/notify(通知) 线程在操作系统上的调度是随机的 多个线程&#xff0c;需要控制线程之间执行某个逻辑的先后顺序&#xff0c;就可以让后执行的逻辑&#xff0c;使用wait&#xff0c;先执行线程&#xff0c;完成某些逻辑之后&#xff0c;通过notify唤醒对应的wait…

IDEA的常用设置

目录 一、显示顶部工具栏 二、设置编辑区字体按住鼠标滚轮变大变小&#xff08;看需要设置&#xff09; 三、设置自动导包和优化导入的包&#xff08;有的时候还是需要手动导包&#xff09; 四、设置导入同一个包下的类&#xff0c;超过指定个数的时候&#xff0c;合并为*&a…

Xcode 正则表达式实现查找替换

在软件开发过程中&#xff0c;查找和替换文本是一项常见的任务。正则表达式&#xff08;Regular Expressions&#xff09;是一种强大的工具&#xff0c;可以帮助我们在复杂的文本中进行精确的匹配和替换。Xcode 作为一款流行的开发工具&#xff0c;提供了对正则表达式的支持。本…