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);//设定计数器的初值,这里设的是最大值0x7f
	WWDG_ClearFlag();
	WWDG_EnableIT();
	
}

void WWDG_IRQHandler(void)
{
	//delay_ms(1);//用来检查不喂狗时的情况
	WWDG_SetCounter(0x7f);
	WWDG_ClearFlag();
	led2=!led2;
}





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

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

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

相关文章

学至乎没而后止也

开场白 学至后没而后止也这个题目的原话来自与荀子《劝学》。大家知道什么意思吗?学习要学到你人没了,才算停止了。通俗点说就是只要没学死就往死里学,高雅点说就是要保持终身学习。 在以前说终身学习好像是一种良好习惯或品德,…

Android NDK系列(一)手动搭建Native Project

使用NDK编写的本地代码具有高性能等特性,在游戏、图形处理等领域有广泛应用,下面介绍如何手动搭建一个纯C版的Android项目,通过该项目可以理解Android的项目结构。 一、创建settings.gradle Android项目是基于Gradle构建的,首先得…

【go项目01_学习记录15】

重构MVC 1 Article 模型1.1 首先创建 Article 模型文件1.2 接下来创建获取文章的方法1.3 新增 types.StringToUint64()函数1.4 修改控制器的调用1.5 重构 route 包1.6 通过 SetRoute 来传参对象变量1.7 新增方法:1.8 控制器将 Int64ToString 改为 Uint64ToString1.9…

ubuntu24.04LVM扩容问题

目录 一、 开机前设置:扩展 二、 开机后设置:分区管理 通过gparted管理分区有效做法。 一、 开机前设置:扩展 虚拟机关机。打开虚拟机设置。 挂起状态是不能扩容的 这里选择扩容到40G 二、 开机后设置:分区管理 使用gpar…

基于Matlab的车道线检测系统 (文末有代码获取链接)【含Matlab源码 MX_001期】

运行环境:Matlab2014b 部分代码: %% 视频流循环处理 % 创建一个循环过程来对给定视频进行车道线检测 % 该循环使用之前初始化的系统对象 warningTextColors {[1 0 0], [1 0 0], [0 0 0], [0 0 0]}; while ~isDone(hVideoSrc) RGB step(hVideoSrc);% …

Java入门基础学习笔记43——包

什么是包? 包是用来分门别类的管理各种不同程序的,类似文件夹,建包有利于程序的管理和维护。 建包的语法规则: package cn.ensource.javabean;public class Car() {} 在自己的程序中调用其他包下的程序的注意事项: 1…

Web3探索加密世界:空投常见类型有哪些?附操作教程

每种空投类型都有独特的特征和目的,我们需要了解不同类型的加密空投。本文给大家介绍的是流行的加密货币空投类型,以及一般空投是如何做的。感兴趣的话请看下去。 一、空投常见类型 1、持有者空投 持有者空投向钱包中持有一定数量数字货币的人免费发放…

探索Python的包与模块:构建项目的基石

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、模块与包的基础认知 1. 模块的定义与创建 2. 包的组织与管理 二、模块与包的进阶使用…

【测评】香橙派 AIpro上手初体验

AI毋庸置疑是近年来,热度最高的技术之一,作为一名工程师拥抱新技术的同时不可或缺的需要一块强悍的开发板,香橙派 AIpro除了拥有好看的皮囊之外,还拥有一个有趣且充满魅力的灵魂。作为一位长期活跃在嵌入式开发领域的工程师&#…

SQL刷题笔记day5

SQL218题目 我的错误代码: select de.dept_no,de.emp_no,s.salary from employees e join dept_emp de on de.emp_no e.emp_no join salaries s on s.emp_no e.emp_no where de.dept_no not in dept_manager.dept_no #not in 好像不能直接这样用 这里报错 正确代…

在树莓派3B+中下载opencv(遇到的各种问题及解决)

目录 前言 1、删除原版本下新版本 2、python虚拟环境 3、python版本共存换链接——给版本降低 4、烧录之前版本的文件(在清华源中可以找,不用官网的烧录文件就行; 比如:(balenaEtcher)重新烧录有问题…

面试二十六、c++语言级别的多线程编程

一、 多线程编程 ​​​​​ 这里的c语言级别的多线程和linux的有一定的区别,c语言级别提供的多线程比较严格,如果主线程结束了,但是子线程没有结束,进程就会异常终止,而linux不会,会继续执行。 二、模拟卖…

三十、openlayers官网示例解析Double click, Drag and Zoom——第二次点击鼠标拖拽缩放地图效果、取消地图双击放大事件

这篇展示了如何在地图上添加第二次按下鼠标移动鼠标实现拖拽缩放地图效果。 官网demo地址: Double click, Drag and Zoom 官网介绍文字的翻译如下: 示例比较简单,直接贴代码: const map new Map({//添加第二次点击拖拽缩放地图i…

es安装错误Exception in thread “main“ java.nio.file.NoSuchFileException解决方案

docker 启动es出现一下错误的解决方案 Exception in thread “main” java.nio.file.NoSuchFileException: /usr/share/elasticsearch/config/jvm.options Exception in thread "main" java.nio.file.NoSuchFileException: /usr/share/elasticsearch/config/jvm.op…

React@16.x(11)ref

目录 1,介绍1.1,得到的结果 2,参数类型2.1,字符串(不再推荐)2.2,对象2.3,函数函数调用时机 3,注意点 1,介绍 reference 引用。和 vue 中的 refs 类似&#x…

装机必备——360压缩安装教程

装机必备——360压缩安装教程 软件下载 软件名称:360压缩 软件语言:简体中文 软件大小:3.38M 系统要求:Windows7或更高, 32/64位操作系统 硬件要求:CPU2GHz ,RAM4G或更高 下载通道①迅雷云盘丨…

python自动化-自动化网络配置工具v2(可巡检,可批量配置)

在日常工作中遇到需要配置相同配置的场景,网络工程师一个个去登陆配置会让工作效率显得没那么高效。 但是随着科技发展,人们不断的学习,我们似乎可以使用一些软件或者脚本来帮助我们实现巡检任务或者配置任务。 今天我想给大家分享一款我自己…

PCIe协议之-DLLP详解

✨前言: 🌟数据链路层的功能 数据链路层将从物理层中获得报文, 并将其传递给事务层; 同时接收事务层的报文, 并将其转发到物理层; 核心的功能有以下三点 1.保证TLP在 PCIe 链路中的正确传递; 2.数据链路层使用了容错…

YOLOv10:实时端到端目标检测

Ao Wang Hui Chen∗  Lihao Liu Kai Chen Zijia Lin  Jungong Han Guiguang Ding Tsinghua University Corresponding Author. 文献来源:中英文对照阅读 摘要 在过去的几年里,YOLO 因其在计算成本和检测性能之间的有效平衡而成为实时目标检测领…

GitLab的安装及基础操作

1. 项目目标 (1)熟练使用rpm包安装gitlab (2)熟练配置gitlab (3)熟练创建gitlab群组、成员、项目 (4)熟练使用gitlab推送和拉取代码 2. 项目准备 2.1. 规划节点 主机名 主机I…