STM32学习和实践笔记(30):窗口看门狗(WWDG)实验

1.WWDG介绍

1.1 WWDG简介

  上一章我们已经介绍了IWDG,知道它的工作原理就是一个12位递减计数器不断递减计数,当减到0之前还未进行喂狗的话,产生一个MCU复位。

窗口看门狗WWDG其实和独立看门狗类似,它是一个7位递减计数器不断的往下递减计数,当减到一个固定值 0X40 时还不喂狗的话,产生一个MCU复位,这个值叫窗口的下限,是固定的值,不能改变,这个和独立看门狗是类似的。只不过独立看门狗是减0之前要复位,这里要在0X40之前要复位。

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

这很容易理解,7位计数器的最大值是127,   窗口下限 0X40是64,这是固定的。假定我将窗口上限值设为100,那么,当窗口看门狗启动后,它就从127开始递减,在它减到100之前,不能去刷新也就是重新装载100,否则会产生复位。只有在其递减到100以下,64之前,才可以重载100。如果掉到64以下(64来还不会复位,63就复位)还没有重载(喂狗)100,那么也会产生复位。

1.2 WWDG结构框图

  要更好的理解窗口看门狗,就需要了解它内部的结构

(1)标号1:WWDG时钟(在APB1总线上,因此需要将APB1总线时钟打开.APB1总线时钟通常为36MHZ。)

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

  分频后的计数器时钟为:CK_CNT= PCLK1/4096/(2^WDGTB)。

除以4096是中文参考手册内公式规定,没有为什么。WDGTB叫做分频因子,取值可以是0,1,2,3四种情况。

假定取值为0,那么2的0次方为1.CK_CNT= PCLK1/4096/1=36MHZ/4086=8.78KHZ。

3)标号3:7位递减计数器

  窗口看门狗的超时时间计算公式如下:

  Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /PCLK1;

          Twwdg为窗口看门狗的超时时间,单位为ms。

          PCLK1为APB1的时钟频率,最大36MHz。

          WDGTB为窗口看门狗的预分频系数。

          T[5:0]为窗口看门狗的计数器低6位。

通常不使用这个公式来计算溢出时间,因为当计数由最大值0X7F(或者用户指定某个超过0X40的值)递减到0X40(0011 1111)时,如果我们打开了提前唤醒中断功能,那么这时就会产生一个中断提醒我们应该喂狗了,于是重置初值,重新开始计数。因为计到0X40时可以产生中断,所以不需要计算溢出时间以决定在多长时间内必须喂狗。当然,计算一下,心里了解多长时间必须喂狗也是可以的。

当递减到0X40并且产生中断喂狗时,必须在一个计数周期内完成喂狗,否则0X40再减1,就会启动MCU复位,程序就会重启。

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

这个就是喂狗时设置上窗口值,其值范围就是0X7F到0X40之间

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

2.WWDG配置步骤

  接下来我们介绍下如何使用库函数对WWDG进行配置。这个也是在编写程序中必须要了解的。具体步骤如下:(WWDG相关库函数在stm32f10x_wwdg.c和stm32f10x_wwdg.h文件中)。

1)使能WWDG时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);

2)设置WWDG窗口值和分频数

void WWDG_SetWindowValue(uint8_t WindowValue);

void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);

分频系数可以为WWDG_Prescaler_1、WWDG_Prescaler_2、WWDG_Prescaler_4、W

WDG_Prescaler_8

(3)开启WWDG中断并分组                              

NVIC_Init();

WWDG_EnableIT();

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

void WWDG_Enable(uint8_t Counter);

void WWDG_SetCounter(uint8_t Counter);

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

WWDG_IRQHandler

WWDG_ClearFlag();

3.硬件电路

  由于WWDG是STM32内部资源,因此本硬件电路非常简单,只有D1、D2指示灯连接,D1指示灯用来提示系统是否被复位,D2指示灯用来作为喂狗提示,每进入中断喂狗D2指示灯状态翻转一次。

4.写窗口看门狗控制程序

  本实验所要实现的功能是:

用D1指示灯的先亮后灭,表示系统重启了,系统每次重启时D1指示灯点亮500ms时间,然后熄灭。

用D2指示灯不断翻转闪烁来表示正在喂狗。

程序框架如下:

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

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

(3)编写主函数

main.c

#include "system.h"
#include "led.h"
#include "SysTick.h"
#include "wwdg.h"int main()
{SysTick_Init(72);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组LED_Init();led1=0;delay_ms(500);//LED1 如果没有及时喂狗,LED就会熄灭500ms,提示系统重启了WWDG_Init();while(1){led1=1;}
}

wwdg.c

#include "wwdg.h"
#include "led.h"
#include "SysTick.h"void WWDG_Init()
{NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);   WWDG_SetPrescaler(WWDG_Prescaler_8);WWDG_SetWindowValue(0x5f);//只有在0x5F到0x40之间喂狗,系统才不会复位,不会重启//设置中断优先级,使能定时器中断通道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);WWDG_Enable(0x7f);//设定计数器的初值,这里设的是最大值0x7fWWDG_ClearFlag();WWDG_EnableIT();}void WWDG_IRQHandler(void)
{//delay_ms(1);//用来检查不喂狗时的情况WWDG_SetCounter(0x7f);WWDG_ClearFlag();led2=!led2;
}

程序烧写到开发板上运行后是正常的,实验成功!

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

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

相关文章

C语言之指针进阶(3),函数指针

目录 前言: 一、函数指针变量的概念 二、函数指针变量的创建 三、函数指针变量的使用 四、两段特殊代码的理解 五、typedef 六、函数指针数组 总结: 前言: 本文主要讲述C语言指针中的函数指针,包括函数指针变量的概念、创建…

aws msk加密方式和问控制连接方式

msk加密方式 msk提供了两种加密方式 静态加密传输中加密 创建集群时可以指定加密方式,参数如下 aws kafka create-cluster --cluster-name "ExampleClusterName" --broker-node-group-info file://brokernodegroupinfo.json --encryption-info file:/…

【基于springboot+vue的房屋租赁系统】

介绍 本系统是基于springbootvue的房屋租赁系统,数据库为mysql,可用于日常学习和毕设,系统分为管理员、房东、用户,部分截图如下所示: 部分界面截图 用户 管理员 联系我 微信:Zzllh_

Wpf 使用 Prism 实战开发Day24

自定义询问窗口 当需要关闭系统或进行删除数据或进行其他操作的时候&#xff0c;需要询问用户是否要执行对应的操作。那么就需要一个弹窗来给用户进行提示。 一.添加自定义询问窗口视图 (MsgView.xaml) 1.首先&#xff0c;添加一个自定义询问窗口视图 (MsgView.xaml) <Use…

qmt量化教程4----订阅全推数据

文章链接 qmt量化教程4----订阅全推数据 (qq.com) 上次写了订阅单股数据的教程 量化教程3---miniqmt当作第三方库设置&#xff0c;提供源代码 全推就主动推送&#xff0c;当行情有变化就会触发回调函数&#xff0c;推送实时数据&#xff0c;可以理解为数据驱动类型&#xff0…

使用 Flask 和 Celery 构建异步任务处理应用

文章目录 什么是 Flask&#xff1f;什么是 Celery&#xff1f;如何在 Flask 中使用 Celery&#xff1f;步骤 1&#xff1a;安装 Flask 和 Celery步骤 2&#xff1a;创建 Flask 应用程序步骤 3&#xff1a;运行 Celery Worker步骤 4&#xff1a;启动 Flask 应用程序 结论 在构建…

C# NetworkStream 流的详解与示例

文章目录 一、NetworkStream类的基本概念1.1 NetworkStream类概述1.2 NetworkStream类属性1.3 NetworkStream类方法 二、NetworkStream的连接方式三、NetworkStream的传输模式四、NetworkStream类示例服务器端代码&#xff1a;客户端代码&#xff1a; 五、总结 在C#中&#xff…

刷代码随想录有感(77):回溯算法——含有重复元素的全排列

题干&#xff1a; 代码&#xff1a; class Solution { public:vector<int> tmp;vector<vector<int>> res;void backtracking(vector<int> nums, vector<int> used){if(tmp.size() nums.size()){res.push_back(tmp);return;}sort(nums.begin(),…

iCloud 照片到 Android 指南:帮助您快速将照片从 iCloud 传输到安卓手机

​ 概括 iOS 和 Android 之间的传输是一个复杂的老问题。将 iCloud 照片传输到 Android 似乎是不可能的。放心。现在的高科技已经解决了这个问题。尽管 Apple 和 Android 不提供传输工具&#xff0c;但您仍然有其他有用的选项。这篇文章与您分享了 5 个技巧。因此&#xff0c;…

云部署最简单python web

最近在玩云主机&#xff0c;考虑将简单的web应用装上去&#xff0c;通过广域网访问一下&#xff0c;代码很简单&#xff0c;所以新手几乎不会碰到什么问题。 from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return Hello, World!app.route(/gree…

plsql 学习

过程化编程语言 赋值&#xff1a;&#xff1a; ||&#xff1a;连接符号 dbms_output.put_line() :输出的语句 var_name ACCOUNTLIBRARY.USERNAME%type; 变量名&#xff1b;某个表的数据类型&#xff1b;赋值给变量名 用下面的方法更好用 异常exception 循…

Linux网络编程:HTTP协议

前言&#xff1a; 我们知道OSI模型上层分为应用层、会话层和表示层&#xff0c;我们接下来要讲的是主流的应用层协议HTTP&#xff0c;为什么需要这个协议呢&#xff0c;因为在应用层由于操作系统的不同、开发人员使用的语言类型不同&#xff0c;当我们在传输结构化数据时&…

算法打卡 Day9(字符串KMP 算法)-实现 strStr+ 重复的子字符串

KMP 算法 KMP 算法解决的是字符串匹配的问题&#xff0c;其经典思想是&#xff1a;当出现的字符串不匹配时&#xff0c;可以记录一部分之前已经匹配的文本内容&#xff0c;利用这些信息避免从头再去做匹配。 前缀表 next 数组就是一个前缀表。前缀表是用来回退的&#xff0c…

【启明智显技术分享】SOM2D02-2GW核心板适配ALSA(适用Sigmastar ssd201/202D)

提示&#xff1a;作为Espressif&#xff08;乐鑫科技&#xff09;大中华区合作伙伴及sigmastar&#xff08;厦门星宸&#xff09;VAD合作伙伴&#xff0c;我们不仅用心整理了你在开发过程中可能会遇到的问题以及快速上手的简明教程供开发小伙伴参考。同时也用心整理了乐鑫及星宸…

TypeScript学习日志-第三十二天(infer关键字)

infer关键字 一、作用与使用 infer 的作用就是推导泛型参数&#xff0c;infer 声明只能出现在 extends 子语句中&#xff0c;使用如下&#xff1a; 可以看出 已经推导出类型是 User 了 二、协变 infer 的 协变会返回联合类型&#xff0c;如图&#xff1a; 三、逆变 infer…

【C++】详解AVL树——平衡二叉搜索树

个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 祝福语&#xff1a;愿你拥抱自由的风 目录 二叉搜索树 AVL树概述 平衡因子 旋转情况分类 左单旋 右单旋 左右双旋 右左双旋 AVL树节点设计 AVL树设计 详解单旋 左单旋 右单旋 详解双旋 左右双旋 平衡因子情况如…

默认路由实现两个网段互通实验

默认路由实现两个网段互通实验 **默认路由&#xff1a;**是一种特殊的静态路由&#xff0c;当路由表中与数据包目的地址没有匹配的表项时&#xff0c;数据包将根据默认路由条目进行转发。默认路由在某些时候是非常有效的&#xff0c;例如在末梢网络中&#xff0c;默认路由可以…

ant design pro 6.0搭建教程

一、搭建 环境&#xff1a; Node.js 18.16.1 ant design pro 6.0 注意&#xff1a;选择umi3时&#xff0c;使用node.js 18版本的会报错&#xff0c;可以实践一下&#xff0c;这里就不再进行实践了。 umi3需要版本是低于node.js 18的 node下载地址&#xff1a; https://nodejs.…

韭菜的自我总结

韭菜的自我总结 股市技术面量价关系左侧右侧右侧技术左侧技术洗盘 韭菜的自我修养虚拟货币的启示韭菜的买入时机韭菜的心理压力成为优秀玩家的关键 股市技术面 技术面分析可以作为买卖时机判定的工具&#xff0c;但是投资还是需要基本面的分析作为支撑。也就是基本面选股&…

【C++】C++的心脏:深入理解内存管理中的 new 和 delete

欢迎来到CILMY23的博客 &#x1f3c6;本篇主题为&#xff1a; C的心脏&#xff1a;深入理解内存管理中的 new 和 delete &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux &a…