细说STM32F407单片机窗口看门狗WWDG的原理及使用方法

目录

一、窗口看门狗的工作原理

1、递减计数器

2、窗口值和比较器

3、看门狗的启动

4、提前唤醒中断

二、窗口看门狗的HAL驱动程序

1、窗口看门狗初始化

2.窗口看门狗刷新

3.EWI中断及其处理

三、不开启EWI的WWDG示例

1、示例功能

2、项目设置

(1) 时钟、Debug

(2)GPIO 

(3) WWDG

(4)NVIC

(5)USART、 CodeGenrator

3、软件设计main.c

4、下载并调试

(1)启动后不按任何键,连续更新

(2) 442ms内按键,更新

(3)442ms~1094ms之间按键,不更新 

(4)1094ms以上按键,更新

四、开启EWI的WWDG示例

1、示例功能、项目配置

2、软件设计

3、下载并调试

(1)不按按任何键

(2)按S2,800ms

(3) 按S3,1200ms

(4)按S4,200ms


        窗口看门狗(Window Watchdog,WWDG)是STM32F407上的另一个看门狗,通常用来监测由外部干扰或不可预见的逻辑条件造成的应用程序软件故障

一、窗口看门狗的工作原理

        窗口看门狗的内部结构如图所示。

1、递减计数器

        窗口看门狗内部有一个7位递减计数器,控制寄存器WWDG_CR中的T[6:0]位,是计数器的计数值。7位计数器的时钟信号来源于PCLK1,看门狗内部首先对PCLK1进行4096分频,然后再经过可配置的预分频器分频,因此7位递减计数器的时钟频率是:

        f_{CNT}=f_{PCLK1}/(4096×DIV)

        f_{PCLK1}是时钟信号PCLK1的频率,4096是看门狗的固定分频系数,DIV是可设置的分频系数,由寄存器WWDG_CFR的WDGTB[1:0]位决定,DIV可取值为1、2、4、8。

        7位递减计数器在T6位由1变为0时,就会使系统产生复位(看门狗必须是激活的,也就是控制寄存器WWDG_CR中的WDGA位是1),也就是计数值由0x40变为0x3F时,产生复位。要避免系统复位,就必须在计数值变为0x3F之前重置计数器,重置计数器的值必须大于0x3F。

        窗口看门狗的递减计数器是自由运行计数器,即使没有开启看门狗,这个计数器也是在计数的。所以,在启动看门狗之前,应该重置计数器的值,以避免因为T6位是0而立刻复位。

2、窗口值和比较器

        在配置寄存器WWDG_CFR中,有个7位的窗口值W[6:0],这个值用来与计数器的当前值T[6:0]进行比较。

        窗口看门狗的工作时序图如图所示。当T[6:0]>W[6:0]时,比较器输出为1这时不允许重置计数器的值,也就是不允许写WWDG_CR否则系统复位。只有当T[6:0]≤W[6:0]时,才可以重置计数器的值,如果在T[6:0]变化到0x3F之前没有重置计数器,就会产生系统复位信号。所以,只能在这样一个窗口期重置看门狗计数器,这也是称为“窗口看门狗”的原因

        根据窗口看门狗的工作特点,在初始化设置时,窗口值W[6:0]必须小于或等于递减计数器的重置值。窗口看门狗的超时(timeout)就是计数器重置后,计数值变化为0x3F的这段时间长度,也就是图中不允许刷新和允许刷新两段的时间长度之和。用户可以根据计数器的时钟信号频率和T[6:0]的重置值计算超时。例如,设置计数器重置值为最大值0x7F,变化到0x3F时的计数周期个数是:

∆=0x7F-0x3F=0x40。

        计数器的时钟周期是:T_{CNT}= \frac{1}{f_{CNT}}= \frac{4096\times DIV}{f_{PCLK1}}

        所以,看门狗的超时是:timeout= \bigtriangleup T_{CNT}= \frac{4096\times DIV\times \Delta }{f_{PCLK1}}

       同样,也可以计算出不允许刷新的时间段的长度。

3、看门狗的启动

        控制寄存器WWDG_CR中的位WDGA用于启动看门狗。系统复位后WDGA被硬件清零,通过向WDGA写1可启动看门狗。此外,启动看门狗后就无法再停止,除非系统复位。

        根据窗口看门狗的特点,可以使用软件使系统立刻复位。具体的操作方法是将WDGA位置1(启动窗口看门狗),并将T6位清零(使看门狗立刻产生复位),也就是设置一个小于0x3F的重置值即可。

4、提前唤醒中断

        窗口看门狗有一个提前唤醒中断(Early Wakeup Interrupt,EWI)事件,如果已开启此中断事件源,且启动了看门狗,在递减计数器的值变为0x40时,就会触发此中断。

        可在此中断服务程序里执行系统复位之前的一些关键操作,但是执行时间有限,只有一个计数器时钟周期。当然,也可以在此中断服务程序里重置计数器的值,避免系统复位,但是这样似乎就违背了使用窗口看门狗的初衷。

二、窗口看门狗的HAL驱动程序

        窗口看门狗的驱动程序的头文件是stm32f4xx_hal_wwdg.h,WWDG的驱动函数不多。

1、窗口看门狗初始化

        使用函数HAL_WWDG_Init()进行窗口看门狗初始化,其原型定义如下:

WWDG_HandleTypeDef hwwdg;  //WWDG外设对象变量

        结构体WWDG_HandleTypeDef的定义如下:

typedef struct
{WWDG_TypeDef *Instance;	//寄存器基址WWDG_InitTypeDef Init;	//WWDG的参数
}WWDG_HandleTypeDef;

        其成员变量Init是结构体类型WWDG_InitTypeDef,包含WWDG的参数。该结构体定义如下,各成员变量意义见注释:

typedef struct
{uint32_t Prescaler;	//WWDG时钟预分频系数uint32_t Window;	//WWDG窗口值,设定值范围为0x40~0x7Euint32_t Counter;	//WWDG自由运行递减计数器的重载值,设定值范围为0×40~0×7Fuint32_t EWIMode;	//WWDG的EWI中断模式,开启或禁止
}WWDG_InitTypeDef;

2.窗口看门狗刷新

        函数HAL_WWDG_Refresh()用于刷新窗口看门狗,其原型定义如下:

HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg);

        其功能就是将计数器重置值加载到看门狗的递减计数器,以避免看门狗触发系统复位。但只能在允许刷新时间段才能刷新看门狗

3.EWI中断及其处理

        WWDG有一个全局中断,只有一个提前唤醒中断(EWI)事件。驱动程序头文件定义了EWI中断事件使能位的宏,也作为中断事件类型定义。

#define WWDG_IT_EWI WWDG_CFR_EWI	//EWI中断事件使能位,也作为中断事件类型

         有一个宏函数用于开启EWI中断事件,即

__HAL_WWDG_ENABLE_IT(__HANDLE__,__INTERRUPT__)

        参数__HANDLE__是WWDG对象指针,__INTERRUPT__就使用WWDG_IT_EWI作为参数值。EWI中断事件开启后就不能关闭,只能在硬件复位时才关闭,所以没有关闭EWI中断事件的函数

        WWDG全局中断ISR里调用的通用处理函数是HAL_WWDG_IRQHandler(),对应于EWI事件中断的回调函数是HAL_WWDG_EarlyWakeupCallback(),其原型定义如下:

void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg);

        若要对EWI事件中断做出处理,重新实现这个回调函数即可。

三、不开启EWI的WWDG示例

1、示例功能

        本文作者旨在介绍如何WWDG及用法。继续使用旺宝红龙开发板STM32F407ZGT6 KIT V1.0。示例功能:看门狗在启动或上次刷新后,在442ms之内不能再刷新,在443ms至1049ms之内可以刷新看门狗,如果超过1049ms没有刷新看门狗,看门狗就会使系统复位

        使用开发板上的3个按键,按下案件后分别执行:在允许刷新的时间段内刷新、超时后刷新、在不允许刷新的时间段内刷新。LED1~LED3分别用于动作指示。

//显示菜单
[S2]KeyUp    = 在允许刷新时间段内,看门狗不会触发复位.         LED1闪烁
[S3]KeyDown  = 超时,看门狗会触发系统复位.                    LED2闪烁
[S4]KeyLeft  = 在不允许刷时间段内,刷新看门狗会导致系统复位.    LED3闪烁

        本示例不开启EWI中断。 

        部分内容需要参考本文作者写的其他文章。参考文章:细说STM32F407单片机独立看门狗IWDG的原理及使用方法-CSDN博客  https://wenchm.blog.csdn.net/article/details/145159637 

2、项目设置

(1) 时钟、Debug

         设置Debug接口为Serial Wire,设置HSE为Crystal/Ceramic Resonator

        配置时钟树,设置HSE为8MHz,HCLK为32MHz,设置APB1 Prescaler为16,使PCLK1为2MHz。这是因为窗口看门狗要用到PCLK1时钟,使PCLK1为2MHz是为得到一个较低频率时钟信号,用于看门狗的递减计数器,便于观察程序运行效果。 

 

(2)GPIO 

        本示例要用到两个LED,配置PA6和PA4引脚,设置初始输出为高电平,两个LED的GPIO引脚的配置结果如图所示,仍然使用keyled.h中的LED驱动函数。

(3) WWDG

        只需激活WWDG即可,参数设置部分的几个参数决定看门狗的特性。

 

  • WWDG counter clock prescaler,看门狗计数器预分频系数,有1、2、4、8几个可选值。
  • WWDG window value,窗口值,也就是W[6:0]的值。这个值必须小于计数器的重置值,也必须大于0x3F(十进制值63)。
  • WWDG free-running downcounter value,递减计数器T[6:0]的重置值,最大值为127(也就是0x7F)必须大于W[6:0]的值。根据设置的参数以及PCLK1为2MHz,可以计算出看门狗的超时为

         timeout= \bigtriangleup T_{CNT}= \frac{4096\times DIV\times \Delta }{f_{PCLK1}}=\frac{4096\times 8\times \left ( 127-63 \right )}{2\times 10^{6}}= 1049ms

        计数器重置后不允许刷新的时间段长度是

         time=\frac{4096\times 8\times \left ( 127-100 \right )}{2\times10 ^{6}}=442ms

        对照WWDG工作原理图,这两个时间对看门狗的意义:看门狗在启动或上次刷新后,在442ms之内不能再刷新,在443ms至1049ms之内可以刷新看门狗,如果超过1049ms没有刷新看门狗,看门狗就会使系统复位

  • Early wakeup interrupt,是否开启提前唤醒中断。这里开启EWI中断。还需要在WWDG的NVIC Settings页面开启WWDG的全局中断,使用默认的优先级即可。

(4)NVIC

        在WWDG的NVIC Settings页面开启WWDG的全局中断,使用默认的优先级。

(5)USART、 CodeGenrator

         与参考文章相同。

3、软件设计main.c

/* USER CODE BEGIN Includes */
#include "keyled.h"
#include <stdio.h>
/* USER CODE END Includes */
/* USER CODE BEGIN 2 *///系统复位、初始状态printf("Demo21_WWDG: Windows Watchdog\r\n\r\n");//显示菜单printf("[S2]KeyUp    = 在允许刷新时间段内,看门狗不会触发复位.\r\n");printf("[S3]KeyDown  = 超时,看门狗会触发系统复位.\r\n");printf("[S4]KeyLeft  = 在不允许刷时间段内,刷新看门狗会导致系统复位.\r\n\r\n");// MCU output low level LED light is onLED1_OFF();LED2_OFF();LED3_OFF();LED4_OFF();/* USER CODE END 2 */
    /* USER CODE BEGIN 3 */KEYS curKey = ScanPressedKey(KEY_WAIT_ALWAYS);switch(curKey){//1. 在允许刷新时间段内,看门狗不会触发复位,LED1闪烁case KEY_UP:{LED1_Toggle();LED2_OFF();LED3_OFF();HAL_Delay(800);HAL_WWDG_Refresh(&hwwdg); 	//刷新看门狗,也就是重置计数器的值printf("The watchdog will not trigger a reset during the allowed refresh period.\r\n\r\n");break;}//2. 超时,看门狗会触发系统自动复位,LED2亮case KEY_DOWN:{LED1_OFF();LED2_ON();LED3_OFF();printf("Timeout, the watchdog will trigger a reset automatically.\r\n\r\n");HAL_Delay(1200);HAL_WWDG_Refresh(&hwwdg);break;}//3. 在不允许刷时间段内,刷新看门狗会导致系统复位,LED3亮case KEY_LEFT:{HAL_Delay(200);LED1_OFF();LED2_OFF();LED3_ON();HAL_Delay(200);HAL_WWDG_Refresh(&hwwdg); 	//刷新看门狗,也就是重置计数器的值printf("During the period of time when refresh is not allowed,\r\n");printf("refreshing the watchdog will cause the system to reset.\r\n\r\n");break;}default:{printf("Keystroke error, refreshing watchdog will not cause system reset.\r\n\r\n");LED1_OFF();LED2_OFF();LED3_OFF();}}HAL_Delay(500);		//消除按键抖动影响}/* USER CODE END 3 */
/* USER CODE BEGIN 4 */
int __io_putchar(int ch)
{HAL_UART_Transmit(&huart6,(uint8_t*)&ch,1,0xFFFF);return ch;
}
/* USER CODE END 4 */

4、下载并调试

        调试的时候,按键按下后不要抬起。 

(1)启动后不按任何键,连续更新

         启动后不按任何键,系统连续启动,串口助手连续显示启动信息,这是因为WWDG的窗口值100,重置值127,当减计数到100后,系统自动重启。

(2) 442ms内按键,更新

        在执行LED3_ON()前后各延时200ms是为了看到LED3的闪烁效果,这两个延时合计400ms,还在不允许刷新时间段内(小于442ms),这时调用HAL_WWDG_Refresh()刷新看门狗会使系统复位,后面如果有程序也是不会被执行的。 

(3)442ms~1094ms之间按键,不更新 

        看门狗在允许刷新的时间段内及时刷新。如果在while循环内调用HAL_Delay(800)延时800ms,然后调用HAL_WWDG_Refresh()刷新看门狗,则可以观察到LED1一直闪烁。因为延时800ms后进入允许刷新的时间段(大于442ms),也没有超过看门狗的超时时间(1049ms),这时候调用HAL_WWDG_Refresh()是可以刷新看门狗的,程序能一直正常运行,所以LED1闪烁,闪烁周期为800ms。

 

(4)1094ms以上按键,更新

        看门狗超时是自动复位的。如果将程序中的延时改为1200ms,则运行时会看到LED1一直亮着。因为在延时1200ms的过程中,看门狗已经超时导致系统复位,while循环里使LED1输出翻转的代码不会被执行。

四、开启EWI的WWDG示例

1、示例功能、项目配置

        除WWDG开启EWI中断外,其余都与三相同。

 

2、软件设计

        在不开启EWI的时候,程序下载后,即使不按任何键,WWDG的减计数器减到阈值后也会自动重置,现象就是串口助手连续不断底显示更新,一般情况下,这不是设计者的设计目的。

        开启EWI后,在EWI的回调函数里执行计数器重置。那么久解决了上面不需要的连续刷新WWDG的现象了。 

/* USER CODE BEGIN 4 */
// EWI中断事件回调函数
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{LED4_Toggle();HAL_WWDG_Refresh(hwwdg); //在此刷新看门狗,看门狗也是能被刷新的
}int __io_putchar(int ch)
{HAL_UART_Transmit(&huart6,(uint8_t*)&ch,1,0xFFFF);return ch;
}
/* USER CODE END 4 */

        看门狗的EWI中断是在递减计数器的值变为0x40时触发的,而递减计数器的值变为0x3F时就会导致系统自动复位。所以,EWI中断相当于在系统复位之前的一个预警,用户可以在此中断里做一些紧急处理,例如关闭某个开关,但是处理时间只有1个计数周期。

3、下载并调试

(1)不按按任何键

(2)按S2,800ms

 

(3) 按S3,1200ms

 

(4)按S4,200ms

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker部署Spring Boot + Vue项目

目录 前提条件 概述 下载代码 打开代码 Docker创建网络 MySQL容器准备 MySQL数据库配置 启动MySQL容器 测试连接MySQL 初始化MySQL数据 Redis容器准备 修改Redis配置 启动redis容器 部署后端 后端代码打包 上传jar包到Linux 创建Dockerfile 构建镜像 运行后…

基于Oracle与PyQt6的电子病历多模态大模型图形化查询系统编程构建

一、引言 1.1 研究背景阐述 在当今数字化时代,医疗行业正经历着深刻的变革,数字化转型的需求日益迫切。电子病历(EMR)作为医疗信息化的核心,其管理的高效性和数据利用的深度对于提升医疗服务质量、优化临床决策以及推动医学研究具有至关重要的意义。传统的电子病历管理系…

万字长文介绍ARINC 653,以及在综合模块化航空电子设备(IMA)中的作用

文章目录 一、引言二、ARINC 653背景三、整体系统架构四、应用/执行&#xff08;APEX&#xff09;接口五、ARINC 653 RTOS内部机制六、健康监测功能七、软件应用八、ARINC 653现状九、总结 一、引言 在现代航空领域&#xff0c;综合模块化航空电子设备&#xff08;IMA&#xf…

在eNSp上telnet一下吧

在上篇博客&#xff1a;DNS 我们提到了telnet和设备带外管理、带内管理&#xff0c;它确实是非常有趣的一个知识点哦&#xff0c;接下来我们一起来学习学习吧~ Telnet&#xff08;远程登陆协议&#xff09; Telnet基于TCP 23号端口&#xff0c;典型的C/S架构模式&#xff0c;是…

音频语言模型与多模态体系结构

音频语言模型与多模态体系结构 多模态模型正在创造语言、视觉和语音等以前独立的研究领域的协同效应。这些模型使用通用架构,将每种模式视为不同的“token”,使它们能够以一种与人类认知非常相似的方式联合建模和理解世界。 ​ ​可以将多模态分为两个主要领域:输入空间(…

【深度学习】关键技术-正则化(Regularization)

正则化&#xff08;Regularization&#xff09; 是一种用于防止模型过拟合的技术。它通过在损失函数中添加额外的约束项&#xff0c;限制模型的复杂度&#xff0c;从而提高模型的泛化能力。 正则化的主要作用 防止过拟合&#xff1a;通过抑制模型对训练数据的过度拟合&#xf…

怎么在iPhone手机上使用便签进行记录?

宝子们&#xff0c;在这个快节奏的时代&#xff0c;灵感的火花总是一闪而过&#xff0c;待办事项也常常让人应接不暇。好在咱们的 iPhone手机便签超给力&#xff0c;能满足各种记录需求&#xff01;今天就来给大家分享一下&#xff0c;如何在 iPhone 手机上巧用便签&#xff0c…

渗透测试之越权漏洞详解 水平越权 垂直越权 目录越权 SQL跨库查询越权 以及未授权漏洞 一篇文章说明白

目录 什么是越权 越权漏洞形成的原因是&#xff1a; 越权常见分类 漏洞产生条件 越权细分类 水平越权&#xff1a; 水平越权解释&#xff1a; 垂直越权&#xff1a; 垂直越权示例: 解释: 修复建议 例如 越权漏洞易发生的点 1.基础参数 2.多阶段验证 3.基于参数的访…

ANSYS Fluent学习笔记(七)求解器四部分

16.亚松弛因子 Controls面板里面设置&#xff0c;它能够稳定计算的过程。如果采用常规的迭代算法可能结果就会发生振荡的情况。采用亚松驰因子可以有助于残差的稳定。 他的取值范围是0-1&#xff0c;0代表没有亚松驰&#xff0c;1表示物理量变化很快&#xff0c;一般情况下取…

ComfyUI安装

项目地址&#xff1a;https://github.xyz/comfyanonymous/ComfyUI 下载地址(我下载时的最新版时v0.3.10)&#xff1a;https://github.xyz/comfyanonymous/ComfyUI/releases/tag/v0.3.10 加速下载地址&#xff1a;https://bgithub.xyz/comfyanonymous/ComfyUI/releases/tag/v0…

《C++11》静态断言(Static Assert)的使用与优势

C11引入了许多新特性&#xff0c;其中之一就是静态断言&#xff08;Static Assert&#xff09;。这是一种在编译时期进行断言的机制&#xff0c;它可以帮助我们在编译阶段就发现错误&#xff0c;而不是等到运行时才发现。这样可以大大提高代码的质量和稳定性。本文将详细介绍静…

cv::moments

1、 代表所有像素值之和。 2、 代表所有像素值乘以该位置处的x坐标&#xff0c;然后再求和。 3、 代表所有像素值乘以该位置处的y坐标&#xff0c;然后再求和。 4、 5、

JavaScript-正则表达式方法(RegExp)

RegExp 对象用于将文本与一个模式匹配。 有两种方法可以创建一个 RegExp 对象&#xff1a;一种是字面量&#xff0c;另一种是构造函数。 字面量由斜杠 (/) 包围而不是引号包围。 构造函数的字符串参数由引号而不是斜杠包围。 new RegExp(pattern[, flags])一.符集合 1.选择…

Apache搭建https服务器

Apache搭建https服务器 REF: 使用OpenSSL自建一个HTTPS服务

从Arrays源码学习定义工具类

背景 在日常编码中&#xff0c;一个比较好的实践是&#xff1a;我们把一些业务无关的、可复用的一些通用逻辑&#xff0c;封装成工具类、甚至jar包。这样一方面方便通用代码抽取、代码复用&#xff0c;同时也隔离经常变动的业务代码和不变的通用代码。那如何定义好一个工具类呢…

w~Transformer~合集11

我自己的原文哦~ https://blog.51cto.com/whaosoft/12472192 #LightSeq 最高加速9倍&#xff01;字节跳动开源8比特混合精度Transformer引擎,近年来&#xff0c;Transformer 已经成为了 NLP 和 CV 等领域的主流模型&#xff0c;但庞大的模型参数限制了它的高效训练和推理。…

【Rust自学】13.1. 闭包 Pt.1:什么是闭包、如何使用闭包

13.1.0. 写在正文之前 Rust语言在设计过程中收到了很多语言的启发&#xff0c;而函数式编程对Rust产生了非常显著的影响。函数式编程通常包括通过将函数作为值传递给参数、从其他函数返回它们、将它们分配给变量以供以后执行等等。 在本章中&#xff0c;我们会讨论 Rust 的一…

Linux服务器配置onnxruntime-gpu

本文实现 onnxruntime-gpu 不依赖于服务器主机上 cuda 和 cudnn&#xff0c;仅使用虚拟环境中的 cuda 依赖包实现 onnx GPU 推理加速的安装教程。为了适配推理节点&#xff0c;因此我们仅在 base 下配置环境&#xff0c;不需要重新创建新的虚拟环境。 升级 pip pip install -…

近红外简单ROI分析matlab(NIRS_SPM)

本次笔记主要想验证上篇近红外分析是否正确&#xff0c;因为叠加平均有不同的计算方法&#xff0c;一种是直接将每个通道的5分钟实时长单独进行叠加平均&#xff0c;另一种是将通道划分为1分钟的片段&#xff0c;将感兴趣的通道数据进行对应叠加平均&#xff0c;得到一个总平均…

G1原理—5.G1垃圾回收过程之Mixed GC

大纲 1.Mixed GC混合回收是什么 2.YGC可作为Mixed GC的初始标记阶段 3.Mixed GC并发标记算法详解(一) 4.Mixed GC并发标记算法详解(二) 5.Mixed GC并发标记算法详解(三) 6.并发标记的三色标记法 7.三色标记法如何解决错标漏标问题 8.SATB如何解决错标漏标问题 9.重新梳…