细说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.rhkb.cn/news/2864.html

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

相关文章

Windows 蓝牙驱动开发-蓝牙设备栈

蓝牙设备栈 蓝牙驱动程序堆栈包含 Microsoft 为蓝牙协议提供支持的核心部分。 有了这个堆栈&#xff0c;已启用蓝牙的设备可以彼此定位并建立连接。 在此类连接中&#xff0c;设备可以通过各种应用程序交换数据并彼此交互。 下图显示了蓝牙驱动程序堆栈中的模块&#xff0c;以…

港科夜闻 | 香港科大与微软亚洲研究院签署战略合作备忘录,推动医学健康教育及科研协作...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大与微软亚洲研究院签署战略合作备忘录&#xff0c;推动医学健康教育及科研协作。根据备忘录&#xff0c;双方将结合各自于科研领域的优势&#xff0c;携手推动医学健康领域的交流与合作。合作方向将涵盖人才培训、…

设计模式03:行为型设计模式之策略模式的使用情景及其基础Demo

1.策略模式 好处&#xff1a;动态切换算法或行为场景&#xff1a;实现同一功能用到不同的算法时和简单工厂对比&#xff1a;简单工厂是通过参数创建对象&#xff0c;调用同一个方法&#xff08;实现细节不同&#xff09;&#xff1b;策略模式是上下文切换对象&#xff0c;调用…

Spring Boot 下的Swagger 3.0 与 Swagger 2.0 的详细对比

先说结论&#xff1a; Swgger 3.0 与Swagger 2.0 区别很大&#xff0c;Swagger3.0用了最新的注释实现更强大的功能&#xff0c;同时使得代码更优雅。 就个人而言&#xff0c;如果新项目推荐使用Swgger 3.0&#xff0c;对于工具而言新的一定比旧的好&#xff1b;对接于旧项目原…

3 前端(上): Web开发相关概念 、HTML语法、CSS语法

文章目录 前言:导学1 Web开发相关概念2 Web标准(网页标准)3 软件架构(CS/BS)(1)C/S: Client/Server 客户端 / 服务器端(2)B/S: Browser/Server 浏览器 / 服务器端VSCode配置前段开发环境一、HTML概念1 概念2 HTML快速入门(1)语法快速入门(2)VSCode一个 !(快捷键…

目标检测新视野 | YOLO、SSD与Faster R-CNN三大目标检测模型深度对比分析

目录 引言 YOLO系列 网络结构 多尺度检测 损失函数 关键特性 SSD 锚框设计 损失函数 关键特性 Faster R-CNN 区域建议网络&#xff08;RPN&#xff09; 两阶段检测器 损失函数 差异分析 共同特点 基于深度学习 目标框预测 损失函数优化 支持多类别检测 应…

go chan底层分析

go chan底层分析 底层源码hchanmakechan 方法 环形队列阻塞机制向管道写数据流程图源码 从管道读数据流程图源码 关闭通道 底层源码 hchan type hchan struct {qcount uint // 当前队列中剩余元素个数dataqsiz uint // 环形队列长度&#xff0c;即可以…

【Git版本控制器--1】Git的基本操作--本地仓库

目录 初识git 本地仓库 认识工作区、暂存区、版本库 add操作与commit操作 master文件与commit id 修改文件 版本回退 撤销修改 删除文件 初识git Git 是一个分布式版本控制系统&#xff0c;主要用于跟踪文件的更改&#xff0c;特别是在软件开发中。 为什么要版本…

【C语言】_字符串拷贝函数strcpy

目录 1. 函数声明及功能 2. 使用示例 3. 注意事项 4. 模拟实现 4.1 第一版&#xff1a;基本功能判空const修饰 4.2 第二版&#xff1a;优化对于\0的单独拷贝 4.3 第三版&#xff1a;仿strcpy的char*返回值 1. 函数声明及功能 char * strcpy ( char * destination, cons…

AIGC时代:如何快速搞定Spring Boot+Vue全栈开发

文章目录 一、Spring Boot基础二、Vue.js基础三、Spring Boot与Vue.js集成四、性能优化与最佳实践《快速搞定Spring BootVue全栈开发》 内容简介作者简介目录前言/序言本书内容本书特点读者对象 随着人工智能生成内容&#xff08;AIGC&#xff09;技术的迅速发展&#xff0c;…

C语言结构体漫谈:从平凡中见不平凡

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文《1》 结构体的两种声明一、结构…

lwip单网卡多ip的实现

1、今天要实现lwip的多个ip配置&#xff0c;本来以为需要自己修改很多核心代码 2、查阅资料才发现&#xff0c;lwip已经把接口留出来了 /** Define this to 1 and define LWIP_ARP_FILTER_NETIF_FN(pbuf, netif, type) * to a filter function that returns the correct neti…

MySQL NaviCat 安装及配置教程(Windows)【安装】

文章目录 一、 MySQL 下载 1. 官网下载2. 其它渠道 二、 MySQL 安装三、 MySQL 验证及配置四、 NaviCat 下载 1. 官网下载2. 其它渠道 五、 NaviCat 安装六、 NaviCat 逆向工程 软件 / 环境安装及配置目录 一、 MySQL 下载 1. 官网下载 安装地址&#xff1a;https://www.m…

HarmonyOS Next 实现登录注册页面(ARKTS) 并使用Springboot作为后端提供接口

1. HarmonyOS next ArkTS ArkTS围绕应用开发在 TypeScript &#xff08;简称TS&#xff09;生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集 ArkTS在TS的基础上扩展了struct和很多的装饰器以达到描述UI和状态管理的目的 以下代码是一个基于…

Web第一次作业

主页: <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>主页</title> </head> <body> <h1>你好&#xff01; 来到我的网站</h1> <p><a href"login…

大疆最新款无人机发布,可照亮百米之外目标

近日&#xff0c;DJI 大疆发布全新小型智能多光旗舰 DJI Matrice 4 系列&#xff0c;包含 Matrice 4T 和 Matrice 4E 两款机型。DJI Matrice 4E 价格为27888 元起&#xff0c;DJI Matrice 4T价格为38888元起。 图片来源&#xff1a;大疆官网 DJI Matrice 4E DJI Matrice 4T D…

掌握C语言内存布局:数据存储的智慧之旅

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 目录 引言正文一、数据类型介绍1.内置类型2.自定义…

图论的起点——七桥问题

普瑞格尔河从古堡哥尼斯堡市中心流过&#xff0c;河中有小岛两座&#xff0c;筑有7座古桥&#xff0c;哥尼斯堡人杰地灵&#xff0c;市民普遍爱好数学。1736年&#xff0c;该市一名市民向大数学家Euler提出如下的所谓“七桥问题”&#xff1a; 从家里出发&#xff0c;7座桥每桥…

ubuntu20.04安装MySQL5.7

deb安装 下载deb文件并配置 wget https://repo.mysql.com//mysql-apt-config_0.8.12-1_all.deb sudo dpkg -i mysql-apt-config_0.8.12-1_all.deb我使用xshell可以正常。 这个弹出框里&#xff0c;选择的是“ubuntu bionic”。(在终端工具上&#xff0c;有可能显示不了选项)【…

openharmony标准系统方案之瑞芯微RK3568移植案例

标准系统方案之瑞芯微RK3568移植案例 ​本文章是基于瑞芯微RK3568芯片的DAYU200开发板&#xff0c;进行标准系统相关功能的移植&#xff0c;主要包括产品配置添加&#xff0c;内核启动、升级&#xff0c;音频ADM化&#xff0c;Camera&#xff0c;TP&#xff0c;LCD&#xff0c…