WDG看门狗---独立看门狗和窗口看门狗

news2024/11/30 2:36:48

目录

一. 前言

        1. STM32内置看门狗

        2. 看门狗的实质

二. 独立看门狗

        1. 独立看门狗的系统框图

        2. 键寄存器

        3. IWDG的超时时间

三. 窗口看门狗

        1. 窗口看门狗的系统框图

        2. WWDG的工作特性

四. 独立看门狗和窗口看门狗的代码配置

        1. 独立看门狗

        2. 窗口看门狗


一. 前言

        1. STM32内置看门狗

STM具有两个内置看门狗,分别是独立看门狗(IWDG)和窗口看门狗(WWDG)。其中,独立看门狗独立工作,对时间精度要求较低。窗口看门狗则要求看门狗在精确计时窗口起作用。

        2. 看门狗的实质

看门狗实质上是一个定时器,当在指定时间范围内,程序没有执行喂狗(重置计数器)操作时,看门狗硬件电路就会自动产生复位信号。

所以看门狗专门用来监控程序的运行状态,当发生程序卡死或跑飞等情况的时候,看门狗能够及时复位程序,防止陷入长时间的卡死。这大大提高了我们程序的健壮性。

二. 独立看门狗

        1. 独立看门狗的系统框图

如下所示:

从这个系统框图中的左下角部分我们可以看到,输入时钟是LSI内部低速时钟,频率是40KHz。

当时钟进入后,看门狗就会对重装载值进行递减,如果递减到0,还没有进行喂狗(手动重装计数器)操作,那么就会使IWDG复位,也就是触发了我们的独立看门狗进行复位。

对于右上角的这个键寄存器,也可以说是很重要的。键寄存器本质上是一个控制寄存器,用于控制硬件电路的工作。所以我们可以对它写入一些值,用来实现某些功能。

        2. 键寄存器

如下所示:

从中我们可以看出,我们的喂狗操作,就是在键寄存器中写入0xAAAA来完成的。

由于我们的这个喂狗等操作并不是根据标志位来决定的,而是通过写入值得方式,所以我们的指令抗干扰能力是非常强的。

键寄存器有抗干扰能力,不能偏心,所以在IWDG框图中的PR,SR,RLR这三个寄存器也要有抗干扰能力,所以就给了它们一个写保护。只有当我们写入0x5555给键寄存器的时候,才能解除它的写保护。这个在后面我们编写代码的时候就会出现,当我们想要写入预分频器值和重装载值的时候,就需要先进行这一步操作。

        3. IWDG的超时时间

公式如下所示:

其中PR预分频系数和RL重装载值都不是固定的。

三. 窗口看门狗

        1. 窗口看门狗的系统框图

 我们窗口看门狗跟独立看门狗的区别之一就在于它拥有一个最晚超时时间和一个最早超时时间。

其中看门狗配置寄存器CFR就是窗口时间(也就是喂狗的最早时间界限)。

        2. WWDG的工作特性

1)当CNT递减计数器值小于0x40时,WWDG会产生复位,也就是触发了WWDG看门狗。

2)CNT递减计数器在窗口值W[6:0]外被重新装载时,WWDG产生复位。

所以我们需要定期写入WWDG_CR寄存器(喂狗),才能避免WWDG复位。

        3. WWDG的超时和窗口时间

 之所以多乘以一个4096,是因为在上面窗口看门狗框图里的PCLK1进来时,是先执行了一个固定的4096分频。主要是为了降低速度。毕竟36MHz还是很快的。

四. 独立看门狗和窗口看门狗的代码配置

        1. 独立看门狗

独立看门狗的配置流程如下所示:

1)开启时钟,LSI必须开启。在手册6.2.9看门狗时钟这一节中,有一句话,如果独立看门狗已经由硬件选项或软件启动,那么LSI振荡器将被强制在打开状态,并且不能关闭。在LSI振荡器稳定后,时钟供应给IWDG。

2)写入预分频器和重装载值

这个别忘了上面我们说的先解除写保护哦。

3)写入键值启动开门狗

4)写入键值不断喂狗

相关代码如下所示:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Key.h"

int main(void)
{
	OLED_Init();
	Key_Init();
	
	OLED_ShowString(1, 1, "IWDG TEST");
	
	if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) == SET)
	{
		OLED_ShowString(2, 1, "IWDGRST");
		Delay_ms(500);
		OLED_ShowString(2, 1, "       ");
		Delay_ms(100);
		
		RCC_ClearFlag();
	}
	else
	{
		OLED_ShowString(3, 1, "RST");
		Delay_ms(500);
		OLED_ShowString(3, 1, "   ");
		Delay_ms(100);
	}
	
	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
	IWDG_SetPrescaler(IWDG_Prescaler_16);
	IWDG_SetReload(2499);					//1000ms
	IWDG_ReloadCounter();
	IWDG_Enable();
	
	while (1)
	{
		Key_GetNum();
		
		IWDG_ReloadCounter();
		
		OLED_ShowString(4, 1, "FEED");
		Delay_ms(200);
		OLED_ShowString(4, 1, "    ");
		Delay_ms(600);
	}
}

        2. 窗口看门狗

配置流程如下所示:

1)开启窗口看门狗APB1的时钟。

2)配置各个寄存器。比如预分频和窗口值。窗口看门狗没有写保护,所以第二步就可以直接写这些寄存器了。

3)写入控制寄存器CR。控制寄存器包括看门狗使能位,计数器溢出标志位和计数器有效位。这些东西需要一起设置。

相关代码如下所示:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Key.h"

int main(void)
{
	OLED_Init();
	Key_Init();
	
	OLED_ShowString(1, 1, "WWDG TEST");
	
	if (RCC_GetFlagStatus(RCC_FLAG_WWDGRST) == SET)
	{
		OLED_ShowString(2, 1, "WWDGRST");
		Delay_ms(500);
		OLED_ShowString(2, 1, "       ");
		Delay_ms(100);
		
		RCC_ClearFlag();
	}
	else
	{
		OLED_ShowString(3, 1, "RST");
		Delay_ms(500);
		OLED_ShowString(3, 1, "   ");
		Delay_ms(100);
	}
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
	
	WWDG_SetPrescaler(WWDG_Prescaler_8);
	WWDG_SetWindowValue(0x40 | 21);		//30ms
	WWDG_Enable(0x40 | 54);				//50ms
	
	while (1)
	{
		Key_GetNum();
		
		OLED_ShowString(4, 1, "FEED");
		Delay_ms(20);
		OLED_ShowString(4, 1, "    ");
		Delay_ms(20);
		
		WWDG_SetCounter(0x40 | 54);
	}
}

 

 

 

               

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

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

相关文章

一篇文章讲透数据结构之二叉搜索树

前言 在前面的学习过程中,我们已经学习了二叉树的相关知识。在这里我们再使用C来实现一些比较难的数据结构。 这篇文章用来实现二叉搜索树。 一.二叉搜索树 1.1二叉搜索树的定义 二叉搜索树(Binary Search Tree)是基于二叉树的一种升级版…

python:ADB通过包名打开应用

一、依赖库 os 二、命令 1.这是查看设备中所有应用包名的最简单方法。只需在命令行中输入以下命令: adb shell pm list packages 2.打印启动的程序包名 adb shell am monitor回车,然后启动你想要获取包名的那个应用,即可获得 3.查看正在运…

【AI开源项目】LangChain-3分钟让你知道什么是LangChain,以及LangChain的部署配置全流程

文章目录 什么是 LangChain?LangChain 概述主要特点 理解 Agent 和 ChainChainAgent示例简单顺序链示例 检索增强生成(RAG)LLM 面临的主要问题RAG 的工作流程 LangChain 核心组件1. 模型输入/输出(Model I/O)2. 数据连…

CXL与近内存计算结合,会发生什么?--part1

一、基础背景 传统的冯诺依曼架构虽然广泛应用于各类计算系统,但其分离的数据存储与处理单元导致了数据传输瓶颈,特别是在处理内存密集型任务时,CPU或GPU需要频繁地从内存中读取数据进行运算,然后再将结果写回内存,这…

React + Vite + TypeScript + React router项目搭建教程

一、创建项目 运行项目 二、目录结构 项目目录: ├─node_modules //第三方依赖 ├─public //静态资源(不参与打包) └─src├─assets //静态资源├─components //组件├─config //配置├─http //请求方法封装├─layout //页面…

SCI一区级 | Matlab实现SSA-TCN-LSTM-Attention多变量时间序列预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.基于SSA-TCN-LSTM-Attention麻雀搜索算法优化时间卷积长短期记忆神经网络融合注意力机制多变量时间序列预测,要求Matlab2023版以上,自注意力机制,一键单头注意力机制替换成多头注…

【Linux学习】(9)调试器gdb

前言 Linux基础工具:安装软件我们用的是yum,写代码用的是vim,编译代码用gcc/g,调试代码用gdb,自动化构建用make/Makefile,多人协作上传代码到远端用的是git。 在前面我们把yum、vim、gcc、make、git都已经学…

Linux系统下minio设置SSL证书进行HTTPS远程连接访问

文章目录 1.配置SSL证书使用HTTPS访问2.MINIO SDK 忽略证书验证3.使用受信任的证书 1.配置SSL证书使用HTTPS访问 生成域名对应的SSL证书,下载Apache版本,我目前只发现Apache这个里面有对应的私钥和证书 私钥重命名为private.key证书重命名为public.crt&…

Diffusion原理

Diffusion 文章目录 Diffusion前置知识基本介绍数学推导前向过程反向过程损失求解前置知识 马尔科夫链: 第 i i i时刻上的状态条件依赖于且仅依赖于第 i − 1 i-1 i−1时刻的状态条件,即 ​ P ( x i ∣ x i − 1 , x i − 2 , . . . , x 1 ) = P ( x i ∣ x i − 1 ) P(x…

以通俗易懂的仓库来讲解JVM内存模型

JVM内存模型可以想象成一个大型的仓库,这个仓库被分成了几个不同的区域,每个区域都有特定的用途和规则。下面我们用一个仓库的比喻来介绍JVM内存模型: 仓库大门(JVM启动): 当JVM启动时,就像打开…

排查PHP服务器CPU占用率高的问题

排查PHP服务器CPU占用率高的问题通常可以通过以下步骤进行: 使用top或htop命令:这些命令可以实时显示服务器上各个进程的CPU和内存使用情况。找到CPU使用率高的进程。 查看进程日志:如果PHP-FPM或Apache等服务器进程的日志记录了具体的请求…

Django入门教程——用户管理实现

第六章 用户管理实现 教学目的 复习数据的增删改查的实现。了解数据MD5加密算法以及实现模型表单中,自定义控件的使用中间件的原理和使用 需求分析 系统问题 员工档案涉及到员工的秘密,不能让任何人都可以看到,主要是人事部门进行数据的…

su user更换用户后无法打开图形屏幕Cannot open your terminal ‘/dev/pts/0‘ 解决办法

我在docker内使用了su john更换了用户,执行petalinux-config -c kernel时打不开图形屏幕窗口,需要执行命令script /dev/null 进入docker和配置状态的所有命令行命令如下: johnjohn-hp:~/zynq$ ./docker_ubuntu16.sh rootjohn-hp:/home/john/…

2024最新版鸿蒙纯血原生应用开发教程文档丨HarmonyOS 开发准备-成为华为开发者

1. 成为华为开发者 在开始应用开发前,需要先完成以下准备工作。在华为开发者联盟网站上,注册成为开发者,并完成实名认证,从而享受联盟开放的各类能力和服务。 1.1. 注册账号 如果您已经有华为开发者联盟帐号,点击右…

记录如何在RK3588板子上跑通paddle的OCR模型

官网文档地址 rknn_zoo RKNPU2_SDK RKNN Model Zoo 一、PC电脑是Ubuntu22.04系统中完成环境搭建(板子是20.04) 安装模型转换环境 ​conda create -n rknn2 python3.10 conda activate rknn2 安装Ubuntu依赖包 su…

CloudStack云平台搭建:XenServer服务器系统安装

1.打开VMware虚拟机,点击“创建新的虚拟机” 2. 点击“自定义(高级)” → “下一步” 3. 点击“下一步” 4. 点击“稍后安装操作系统” → “下一步” 5. 选择“其他” → “其他64位” → “下一步” 6. 修改“虚拟机名称” 、“位置”&…

记录运维大屏监控平台的开发、springboot实现服务器性能监测分析系统

1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:windows 7…

h5小游戏5--杀死国王(附源码)

源代码如下 1.游戏基本操作 用空格键攻击,kill the king。 css样式源码 charset "UTF-8";font-face {font-family: "AddLGBitmap09";src: url("https://assets.codepen.io/217233/AddLGBitmap09.woff2") format("woff2"…

Canvas简历编辑器-选中绘制与拖拽多选交互设计

Canvas简历编辑器-选中绘制与拖拽多选交互设计 在之前我们聊了聊如何基于Canvas与基本事件组合实现了轻量级DOM,并且在此基础上实现了如何进行管理事件以及多层级渲染的能力设计。那么此时我们就依然在轻量级DOM的基础上,关注于实现选中绘制与拖拽多选交…

系统安全隐患设计面面观

如果只是靠程序员去设计系统的话,估计会有很多安全问题,所以才需要有架构师、设计师,来面面俱到的设计系统安全模块,来应对外部的威胁。 功能开发在系统设计中往往优先考虑,但忽视安全问题可能导致重大隐患。为了解决…