STM32使用WWDG窗口看门狗

1 WWDG 介绍

1.1 WWDG 简介

窗口看门狗 WWDG 其实和独立看门狗类似,它是一个 7 位递减计数器不断的往下递减计数,

当减到一个固定值 0X40 时还不喂狗的话,产生一个 MCU 复位,这个值叫窗口的下限,是固定的值,不能改变。

这个和独立看门狗是类似的,不同的是窗口看门狗的计数器的值在减到某一个数之前喂狗的话也会产生复位,这个值叫窗口的上限,上限值由用户独立设置。窗口看门狗计数器的值必须在上窗口和下窗口之间才可以刷新(喂狗),这也是窗口看门狗中“窗口”两个字的含义。

窗口看门狗时序图如下图所示:

从图中可以看到,T[6:0]是窗口控制寄存器(WWDG_CR)的低 7 位,W[6:0]

是窗口配置寄存器(WWDG_CFR)低 7 位。T[6:0]就是窗口看门狗的计数器值,而

W[6:0]是窗口看门狗的上窗口,下窗口是固定值 0X40。当窗口看门狗的计数器

在上窗口值之外或者低于下窗口值被刷新都会产生复位。

上窗口值(W[6:0])是由用户自己设定的,根据实际要求来设计窗口值,但

是一定要确保窗口值大于 0X40,否则窗口就不存在了。

窗口看门狗 WWDG 通常被用来监测,由外部干扰或不可预见的逻辑条件造成

的应用程序背离正常的运行序列而产生的软件故障。

1.2 WWDG 结构框图

(1)标号 1:WWDG 时钟

窗口看门狗(WWDG)的时钟来自 PCLK1,即挂接在 APB1 总线上,由 RCC 时钟控制器开启。

APB1 时钟最大为 36M。

(2)标号 2:WDG 预分频器器

PCLK1 时钟并不是直接提供给窗口看门狗计数器时钟,而是通过一个 WDG 预分频器分频后输入给计数器时钟。

我们可以操作配置寄存器 WWDG_CFR 的位 8:7WDGTB[1:0]来设置分频因子,分频因子可以为 0、1、2、3。

分频后的计数器时钟为:CK_CNT= PCLK1/4096/(2^WDGTB),除以 4096 是中文参考手册内公式规定,没有为什么。PCLK1 等于 APB1 时钟,WDGTB 为分频因子(0-3),2^WDGTB 大小就是 1、2、4、8,与库函数中的分频参数对应。

每经过一个计数器时钟,计数器就减 1。

(3)标号 3:计数器

窗口看门狗的计数器是一个 7 位的递减计数器,计数最大值为 0X7F,其值存放在控制寄存器 WWDG_CR 中的 6:0 位,即 T[6:0]。

当递减到 T6 位变成 0 时,即从 0X40 变为 0X3F 时候,会产生看门狗复位。

这个值 0X40 是窗口看门狗能够递减到的最小值,所以计数器的值只能在 0X40~0X7F 之间,实际上用来计数的是 T[5:0]。

当递减计数器递减到 0X40 的时候,还不会马上产生复位,如果使能了提前唤醒中断,窗口配置寄存器(WWDG_CFR)位 9 EWI 置 1,则产生提前唤醒中断,也就是在快产生复位的前一段时间提醒我们,需要进行喂狗了,否则将复位。

我们通常都是在提前唤醒中断内向 WWDG_CR 重新写入计数器的值, 来达到喂狗的目的。需要注意的是:在进入中断后,必须在不大于 1 个窗口看 门狗计数周期的时间(在 PCLK1 频率为 36M WDGTB 为 0 的条件下,该时间 为 113us)内重新写 WWDG_CR,否则,看门狗将产生复位!

如果不使用提前唤醒中断来喂狗,我们要会计算窗口看门狗的超时时间,

计 算公式如下: Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /PCLK1;

其中: Twwdg 为窗口看门狗的超时时间,单位为 ms。 PCLK1 为 APB1 的时钟频率,最大 36MHz。 WDGTB 为窗口看门狗的预分频系数。 T[5:0]为窗口看门狗的计数器低 6 位。

根据上面的公式,假设 PCLK1=54Mhz,

那么可以得到最小-最大超时时间表, 如下

(4)标号 4:看门狗配置寄存器

我们知道窗口看门狗必须在窗口范围内进行喂狗才不会产生复位,窗口中的下窗口是一个固定值 0X40,上窗口值可以改变,具体的由配置寄存器 WWDG_CFR的位 W[6:0]设置。

其值必须大于 0X40,如果小于或者等于 0X40 就是失去了窗口的意义,而且也不能大于计数器的最大值 0X7F。

窗口值具体要设置成多大,这个得根据我们需要监控的程序的运行时间来决定。

假如我们要监控的程序段 A运行的时间为 Ta,当执行完这段程序之后就要进行喂狗,如果在窗口时间内没有喂狗的话,那程序就肯定是出问题了。

一般计数器的值 TR 设置成最大 0X7F,窗口值为 WW,计数器减一个数的时间为 T,那么时间:(TR-WW)*T 应该稍微大于 Ta 即可,这样就能做到刚执行完程序段 A 之后喂狗,起到监控的作用,这样也就可以算出 WW 的值是多少。

(5)标号 5:系统复位信号

当计数器值超过配置寄存器内的上窗口设置值或者低于下窗口值,并且WDGA 位置 1,即开启窗口看门狗,将产生一个系统复位信号,促使系统复位。

《STM32F10x 中文参考手册》-18 窗口看门狗(WWDG)章节,里面有详细的讲解。

如果看不懂的可以暂时放下,因为我们使用的是库函数开发。

2 WWDG 配置步骤

具体步骤如下:(WWDG 相关库函数在 stm32f10x_wwdg.c 和 stm32f10x_wwdg.h 文件中)

(1)使能 WWDG 时钟

WWDG 不同于 IWDG,IWDG 有自己独立的 LSI 时钟,所以不存在使能问题,而

WWDG 使用的是 APB1 时钟,需要先使能时钟。

在库函数中实现函数如下:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);

(2)设置 WWDG 窗口值、分频数

设置 WWDG 窗口值函数为:

 

void WWDG_SetWindowValue(uint8_t WindowValue);

窗口值最大值为 0X7F,最小不能低于 0X40,否则就失去了窗口的意义。

设置 WWDG 分频数函数为:

 

void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);

分频系数可以为

WWDG_Prescaler_1、WWDG_Prescaler_2、WWDG_Prescaler_4、WWDG_Prescaler_8。

(3)开启 WWDG 中断并分组

通常对窗口看门狗进行喂狗是在提前唤醒中断内操作,所以需要打开 WWDG

的中断功能,并且配置对应的中断通道及分组。

中断分组及通道选择是在 NVIC_Init 初始化内完成,这个在前面章节中都介

绍过,这里我们看下使能 WWDG 中断,库函数如下:

 

WWDG_EnableIT();

(4)设置计数器初始值并使能 WWDG

库函数中提供了一个同时设置计数器初始值和使能 WWDG 的函数,

如下:

void WWDG_Enable(uint8_t Counter);

注意计数器最大值不能大于 OX7F。

库函数还提供了一个独立设置计数器值的函数,如下:

void WWDG_SetCounter(uint8_t Counter);

(5)编写 WWDG 中断服务函数

最后我们还需要编写一个 WWDG 中断服务函数,通过中断函数进行喂狗。

WWDG中断服务函数名在 STM32F1 启动文件内就有,WWDG 中断函数名如下:

WWDG_IRQHandler

在中断内要进行喂狗,可以直接调用 WWDG_SetCounter()函数,给它传递一

个窗口值即可,特别注意,在中断内喂狗一定要快,否则当看门狗计数器值减到

0X3F 时将产生复位。然后清除 WWDG 中断状态标志位 EWIF,

函数如下:

WWDG_ClearFlag(); //清除窗口看门狗状态标志

通过以上几步配置后,我们就可以正常使用窗口看门狗了,我们需要在中断

内快速喂狗,否则系统即会重新启动。

3 硬件设计

本章要实现的功能是:

使用窗口看门狗的中断来喂狗,通过 D1、D2 指示灯提示程序运行状态。

由于 WWDG 是 STM32F1 内部资源,因此本硬件电路非常简单,只有 D1、D2 指

示灯连接,这里就不多说。

D2 指示灯用来提示系统工作状态,D1 指示灯用来作为喂狗提示,每进入中断喂狗 D1 指示灯状态翻转一次。

4 软件设计

系统开启时 D1 指示灯点亮 500ms 时间,然后熄灭。

D1 指示灯不断闪烁表示正在喂狗。

如果喂狗超时将重启系统,D1 指示灯点亮

500ms,然后熄灭,继续喂狗。

程序框架如下:

(1)初始化 WWDG(使能 WWDG 时钟,设置窗口及分频值,使能中断等)

void WWDG_Init(void)
{NVIC_InitTypeDef NVIC_InitStructure;// 第1步:使能RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);        // 第2步:设置 WWDG 窗口值、分频数WWDG_SetWindowValue(0x5f);         //WWDG 窗口值WWDG_SetPrescaler(WWDG_Prescaler_8);        //分频数// 第3步:开启 WWDG 中断并分组// 3-1设置中断优先级,使能定时器中断通道NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; // 外设中断向量表 名NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        NVIC_Init(&NVIC_InitStructure); // 3-2开启 WWDG 使能WWDG_Enable(0x7f); //使能 完毕 进入中断使能// 第4步:设置计数器初始值并使能 WWDGWWDG_ClearFlag(); // 清楚状态标记WWDG_EnableIT();}

(2)编写窗口看门狗中断函数

// 第5步:编写 WWDG 中断服务函数
void WWDG_IRQHandler(void)
{WWDG_SetCounter(0x7f); // 重新写入初值 喂狗WWDG_ClearFlag(); //清除窗口看门狗状态标志LED1=!LED1;}

(3)编写主函数

#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "key.h"
#include "wwdg.h"int main()
{u8 i=0;SysTick_Init(72);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组分2组LED_Init();USART1_Init(115200);LED1 =0;delay_ms(500);WWDG_Init();while(1){        i++;if(i%10==0)LED0=!LED0; // D0 核心板上的灯delay_ms(10);}
}

5 实验现象

窗口库函数介绍

void WWDG_DeInit(void);复位

void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);//WWDG 窗口值

void WWDG_SetWindowValue(uint8_t WindowValue);//分频数

void WWDG_EnableIT(void); 使能中断

void WWDG_SetCounter(uint8_t Counter); 设置计数器值

void WWDG_Enable(uint8_t Counter); 使能串口看门狗,并设置初始值

FlagStatus WWDG_GetFlagStatus(void);获取状态标记

void WWDG_ClearFlag(void); 清楚状态标记

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

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

相关文章

在Linux上安装RStudio工具并实现本地远程访问【内网穿透】

文章目录 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. 公网远程访问RStudio6. 固定RStudio公网地址 前言 RStudio Server 使你能够在 Linux 服务器上运行你所熟悉和喜爱的 RStudio IDE,并通过 Web 浏览器进行访问…

关于Git的入门教程(附GitHub和Gitee的使用方法)

一. Git 概述 Git是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。Git易于学习、占地面积小、性能极快。它具有廉价的本地库,方便的暂存区域和多个工作流分支等特性。其性能优于Subversion、CVS、Perforce和ClearCas…

三分钟实现MQTT协议网关网口连接西门子SMART200PLC上传阿里云服务器

MQTT协议网关网口连接西门子SMART200PLC操作说明v1.4 目录 一. 使用流程 二. 准备工作 2.1 需要准备如下物品 2.2 LF220网关准备工作 2.3 PLC准备工作 2.4 电脑的准备工作 2.5 MQTT服务器准备工作 三. 阿里云IoT平台配置步骤 3.1 创建产品 3.2 添加设备 …

10.22A*算法,华容道,状态压缩

A* P1379华容道 问题是要从初始布局用最少的步骤到目标布局,每次只能动0周围的格子,就是华容道; 怎么用算法的思路解决? 状态压缩思路 每个数字就代表当前的状态,队列和map函数都记录的是当前的状态数,…

FileUpload控件上传文件时出现 不支持给定路径的格式.的解决方法

正常代码,部署到server 2012时,在上传音频mp3文件时,显示错误“不支持给定路径的格式”,上传控件使用FileUpload控件: 因为程序之前是正常的,因此应该不是程序的问题。 上传时,发现在选择文件时…

深入浅出排序算法之归并排序

目录 1. 归并排序的原理 1.1 二路归并排序执行流程 2. 代码分析 2.1 代码设计 3. 性能分析 4. 非递归版本 1. 归并排序的原理 “归并”一词的中文含义就是合并、并入的意思,而在数据结构中的定义是将两个或者两个以上的有序表组合成一个新的有序表。 归并排序…

使用Packstack安装器安装一体化OpenStack云平台

【实训目的】 初步掌握OpenStack快捷安装的方法。掌握OpenStack图形界面的基本操作。 【实训准备】 (1)准备一台能够安装OpenStack的实验用计算机,建议使用VMware虚拟机。 (2)该计算机应安装CentOS 7,建…

电解电容寿命与哪些因素有关?

电解电容在各类电源及电子产品中是不可替代的元器件,这些电子产品中由于应用环境的原因,使它成为最脆弱的一环,所以,电解电容的寿命也直接影响了电子产品的使用寿命。 一、电解电容失效模式与因素概述 铝电解电容器正极、负极引出…

【Redis安装】Ubuntu和Centos

此处安装的是 Redis5 在 Ubuntu 系统上 切换到 root 用户下,su 命令切换使用 apt 可以搜索 redis 相关软件包 apt search redis使用 apt 命令安装 redis apt install redis手动修改配置文件 redis.conf cd /etc/redis/ vim redis.conf修改以下两处 重启服务器 …

【Opencv】OpenCV使用CMake和MinGW的编译安装出错解决

编译时出现的错误: mingw32-make[1]: *** [modules/core/CMakeFiles/opencv_core.dir/all] Error 2 Makefile:161: recipe for target ‘all’ failed mingw32-make: *** [all] Error 2解决方法: 根据贴吧老哥的解答,发现是mingw版本有问题导…

Java基础篇 | Java8流式编程

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: Java从入门到精通 ✨特色专栏&#xf…

虚拟机使用linux常用问题(虚拟机操作系统:ubuntu 22.04LTS)

1.虚拟机连接外网 ubuntu解决网络连接的解决方案 CentOS7联网问题解决 明明连接好了但是没有网络的情况 2.虚拟机磁盘扩容 相关博客 利用gparted工具时,直接将unallocated空间的前一个位置的磁盘resize,将unallocated的空间全部覆盖 3.虚拟机与本机共享文件 安装vmtools 设…

Elasticsearch的聚集统计,可以进行各种统计分析

说明: Elasticsearch不仅是一个大数据搜索引擎,也是一个大数据分析引擎。它的聚集(aggregation)统计的REST端点可用于实现与统计分析有关的功能。Elasticsearch提供的聚集分为三大类。 度量聚集(Metric aggregation):度量聚集可以用于计算搜…

嵌入式实时操作系统的设计与开发(互斥量学习)

一个无论多么小的系统,都会有大系统的缩影,就像俗话说“麻雀虽小五脏俱全”。 嵌入式实时操作系统中除了基本调度机制(创建线程、调度线程、挂起线程等),事件处理机制(中断管理、时钟管理)、内…

【c++】运算符重载实例

重载自增自减运算符 Intger num(2); num; num;对自增运算符的重载要区分前置和后置。在重载之前需要思考一个问题,num是返回一个临时变量还是num对象的本体。 为了解决这个问题可以考虑实现一个Inc_()函数和_Inc()函数分别模仿后置和前置的行为 Integer Inc_(){i…

YOLOv5算法改进(20)— 如何去写YOLOv5相关的论文(包括论文阅读+规律总结+写作方法)

前言:Hello大家好,我是小哥谈。最近一直在阅读关于YOLOv5的相关论文,读着读着我发现一条可以发论文的规律,特此简单总结一下,希望能够对同学们有所启迪!🌈 前期回顾: YOLOv5算法改进(1)— 如何去改进YOLOv5算法

IO文件操作

小王学习录 今日鸡汤文件一. 文件路径1. 绝对路径2. 相对路径二. 文件类型三. 文件操作1. 文件系统操作2. 文件内容操作(字节流)1. 读文件2. 写文件3. 释放资源(.close)3. 文件内容操作(字符流)重识(System.in)今日鸡汤 光阴如骏马加鞭, 日月如落花流水. 文件 狭义上的文件:…

欧拉图和哈密顿图

欧拉图 在连通图G中,经过G的每条边一次且仅一次的通路,称为欧拉通路若欧拉通路为回路,则称为欧拉回路含有欧拉回路的图称为欧拉图有欧拉通路则G可以一笔画出有欧拉回路则G是连通的且无奇点(欧拉图无奇点) 哈密顿图 …

【MATLAB源码-第56期】基于WOA白鲸优化算法和PSO粒子群优化算法的三维路径规划对比。

操作环境: MATLAB 2022a 1、算法描述 1.粒子群算法(Particle Swarm Optimization,简称PSO)是一种模拟鸟群觅食行为的启发式优化方法。以下是其详细描述: 基本思想: 鸟群在寻找食物时,每只鸟都…

Kafka简单入门02——ISR机制

目录 ISR机制 ISR 关键概念 HW和LEO Java使用Kafka通信 Kafka 生产者示例 Kafka 消费者示例 ISR机制 Kafka 中的 ISR(In-Sync Replicas)机制是一种用于确保数据可靠性和一致性的重要机制。ISR 是一组副本,它包括分区的领导者&#xff…