STM32单片机WDG看门狗详解

文章目录

1. WDG简介

2. IWDG框图

3. IWDG键寄存器

4. IWDG超时时间

5. WWDG框图

6. WWDG工作特性

7. WWDG超时时间

8. IWDG和WWDG对比

9. 代码示例


1. WDG简介

WDG(Watchdog)看门狗

看门狗可以监控程序的运行状态,当程序因为设计漏洞、硬件故障、电磁干扰等原因,出现卡死或跑飞现象时,看门狗能及时复位程序,避免程序陷入长时间的罢工状态,保证系统的可靠性和安全性。

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

STM32内置两个看门狗

  • 独立看门狗(Independent WDG):独立运行(独立看门狗的时钟是专用的LSI,内部低速时钟),对时间精度要求低(只有一个最晚时间界限)
  • 窗口看门狗(Window WDG):要求看门狗在精确计时窗口起作用(喂狗时间有个最晚的界限,也有个最早的界限),使用APB1的时钟(没有专用时钟,不算独立)

2. IWDG框图

看门狗定时器溢出时会直接产生复位信号,然后执行喂狗操作,实质上是重置计数器。这是一个递减计数器,减到0后就会复位。因此,为了避免复位,在计数器减到0之前必须及时进行喂狗操作并把计数值加大。

  • 输入时钟LSI(内部低速时钟40KHz)后,时钟进入预分频器(8位,最大256分频)进行分频。预分频寄存器(Prescaler)配置分频系数后,经过预分频器分频后,时钟驱动递减计数器。计数器每次递减一个单位,另有计数器设为12位(2^12=4096)。当计数器减到0时,产生IWDG复位。为了避免复位,可以提前在重装载寄存器写一个值,这个过程和定时器的ARR(Auto Reloader)是一样的。当我们预先写好值之后,在运行过程中,我们在这个键寄存器里写一个特定的数据,控制电路进行喂狗。这时计数器会得到当前的计数器重装载,重新开始减计数。

  • 状态寄存器SR(只读寄存器)标志电路运行状态,只有两个更新同步位。

3. IWDG键寄存器

键寄存器本质上是控制寄存器,用于控制硬件电路的工作

在可能存在干扰的情况下,一般通过在整个键寄存器写入特定值来代替控制寄存器写入一位的功能,以降低硬件电路受到干扰的概率

写入键寄存器的值作用

0xCCCC

启用独立看门狗

0xAAAA

IWDG_RLR中的值重新加载到计数器(喂狗)

0x5555

解除IWDG_PR和IWDG_RLR的写保护

0x5555之外的其他值

启用IWDG_PR和IWDG_RLR的写保护

可以对RP、SR、RLR的写操作进行保护,只有在键寄存器写入5555,才能解除写保护,一旦写入其他值,PR和RLR再次被保护。这样PR和RLR就跟随键寄存器一起被保护了起来,防止误操作。 

4. IWDG超时时间

 

 

5. WWDG框图

窗口看门狗没有重装寄存器,直接在CNT写入数据就行。

时钟来源是PCLK1(APB1时钟默认36MHz),进入后先经过预分频器分频,然后驱动递减计数器(T5~T0这6位是有效的计数值,最高位T6用来作为溢出标志位 -> T6=1时,表示计数器溢出,0溢出)。如果T6位当成溢出标志位,低6位当作计数器,那么低6位的计数值减到0之后溢出。

WDGA是窗口看门狗的激活位,也就是使能。WDGA写入1,启用窗口看门狗。

喂狗最早时间窗口的实现流程:一旦我们执行写入CR操作时,那个与门开关就会打开,写入CR,就是写入计数器(喂狗),喂狗时比较器开始工作,一旦它比较,我们当前的计数器T6:0>窗口值W6:0,比较结果=1,闹过或门申请复位。把当前计数值和预设的窗口值进行比较,就会发现频次太高或太低,说明喂狗频次异常,就有问题,复位一下。

喂狗太晚,6位计数器减到0,复位。喂狗太早,计数器的值超过窗口值,复位。

6. WWDG工作特性

递减计数器T[6:0]的值小于0x40时,WWDG产生复位

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

递减计数器T[6:0]等于0x40时可以产生早期唤醒中断(EWI),用于重装载计数器以避免WWDG复位。

定期写入WWDG_CR寄存器(喂狗)以避免WWDG复位

唤醒中断(EWI):这个中断其实就是溢出的前一刻发生,也称作“死前中断”,马上就要溢出复位,再提醒一下,要不要干点啥,所以在这个早期唤醒中断里,我们一般可以用来执行一些紧急操作,比如保存重要数据,关闭危险设备等。

7. WWDG超时时间

8. IWDG和WWDG对比

IWDG独立看门狗WWDG窗口看门狗
复位

计数器减到0后

计数器T[5:0]减到0后、过早重装计数器

中断

早期唤醒中断

时钟源

LSI(40KHz)

PCLK1(36MHz)

预分频系数

4、8、32、64、128、256

1、2、4、8

计数器

12位

6位(有效计数)

超时时间

0.1ms~26214.4ms

113us~58.25ms

喂狗方式

写入键寄存器,重装固定值RLR

直接写入计数器,写多少重装多少

防误操作

键寄存器和写保护

用途

独立工作,对时间精度要求较低

要求看门狗在精确计时窗口起作用

9. 代码示例

STM32实现独立看门狗和窗口看门狗

STM32实现独立看门狗和窗口看门狗-CSDN博客

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

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

相关文章

Docker Compose--安装Nginx--方法/实例

原文网址:Docker Compose--安装Nginx--方法/实例_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Docker Compose如何安装Nginx。 目录结构 ├── config │ ├── cert │ │ ├── xxx_bundle.pem │ │ └── xxx.key │ ├── conf.d │ …

【ONLYOFFICE震撼8.1】ONLYOFFICE8.1版本桌面编辑器测评

随着远程工作的普及和数字化办公的发展,越来越多的人开始寻找一款具有强大功能和便捷使用的办公软件。在这个时候,ONLYOFFICE 8.1应运而生,成为了许多用户的新选择。ONLYOFFICE 8.1是一种办公套件软件,它提供了文档处理、电子表格…

jupyter中如何看plt.plot的局部细节

在Jupyter中使用matplotlib时,如果你想要放大图表的某一部分,可以使用matplotlib的交互式方式查看局部细节。 %matplotlib notebook # 在Jupyter中使用交互式后端 import matplotlib.pyplot as plt import numpy as np# 生成数据 x np.linspace(0, 10…

TiDB 资源管控的对撞测试以及最佳实践架构

作者: GreenGuan 原文来源: https://tidb.net/blog/bc405c21 引言 TiDB 是一个存算分离的架构,资源管控对这种分离的架构来说实现确实有非常大的难度,TiDB 从 7.1 版本开始引入资源管控的概念,在社区也有不少伙伴测…

论文速递 | Management Science 4月文章合集(下)

编者按 在本系列文章中,我们梳理了运筹学顶刊Management Science在2024年4月份发布有关OR/OM以及相关应用的13篇文章的基本信息,旨在帮助读者快速洞察领域新动态。本文为第二部分(2/2)。 推荐文章1 ● 题目:Social Le…

模拟面试之外卖点单系统(高频面试题目mark)

今天跟大家分享一个大家简历中常见的项目-《外卖点单系统》,这是一个很经典的项目,有很多可以考察的知识点和技能点,但大多数同学都是学期项目,没有实际落地,对面试问题准备不充分,回答时抓不到重点&#x…

Handling `nil` Values in `NSDictionary` in Objective-C

Handling nil Values in NSDictionary in Objective-C When working with Objective-C, particularly when dealing with data returned from a server, it’s crucial (至关重要的) to handle nil values appropriately (适当地) to prevent unexpected crashes. Here, we ex…

VBA递归过程快速组合数据

实例需求:数据表包含的列数不固定,有的列(数量和位置不固定)包含组合数据,例如C2单元格为D,P,说明Unit Config有两种分别为D和P,如下图所示。 现在需要将所有的组合罗列出来,如下所示…

git上传本地项目及更新项目

1、注册GitHub账号和下载git 2、在GitHub上新建一个仓库,点击号——>New repository,给仓库起一个名字,点击Create repository 3、进入要上传的项目中,右键点击git back here,命令行输入git init初始化&#xff0c…

全球电力电子测试方案专业提供商「艾诺仪器」×企企通召开项目启动会,推进企业采购数智化升级

导读 供应链管理已成为企业的核心竞争力之一,为应对快速变化的市场环境,艾诺仪器亟需强化采购管理和供应链协同的竞争力。SRM涉及到各事业部、各所属企业等多个层面,希望通过双方优势资源的整合,打造高效协同、科学智能的数字化采…

数据挖掘概览

数据挖掘(Data Mining)就是从大量的,不完全的,有噪声的,模糊的,随机的实际应用数据中,提取隐含在其中的,人们事先不知道的,但又是潜在有用的信息和知识的过程. 预测性数据挖掘 分类 定义:分类就是把一些新的数据项映射到给定类别中的某一个类别 分类流程&#x…

Python | Leetcode Python题解之第189题轮转数组

题目&#xff1a; 题解&#xff1a; def reverse(nums: List[int], left, right) -> None:i, j left, rightwhile i < j:nums[i], nums[j] nums[j], nums[i]i1j-1 class Solution:def rotate(self, nums: List[int], k: int) -> None:n len(nums)k % nreverse(num…

Midway + TypeORM项目部署到BT后启动失败,MySQL报错

Midway TypeORM项目部署到BT后启动失败&#xff0c;MySQL报错 前沿 您需要先了解这篇文章&#xff1a;https://blog.csdn.net/weixin_45687201/article/details/139336111 错误日志 服务状态开启后就失败项目日志&#xff0c;输出 \> my-midway-project1.0.0 start \&…

【Python新手入门指南】Linux-conda环境安装与使用参考

文章目录 前言一、conda是什么&#xff1f;二、安装步骤三、使用Conda来管理Python环境1. 创建环境2. 激活环境3. 安装软件包4. 查看环境5. 删除环境&#xff1a;如果您不再需要某个环境&#xff0c;可以使用以下命令将其删除&#xff1a; 前言 如果你是一位经验丰富的Python开…

【SQL Server数据库】熟悉DBMS的基本操作及数据库的创建

目录 一、SQL SERVER基本操作 二、用Management Studio创建数据库 1、使用Management Studio创建数据库bookdb&#xff0c;各项参数采用默认设置。 2、使用Management Studio创建数据库EDUC 3. 在EDUC中创建三个表&#xff0c;根据下面要求创建Student&#xff0c;Course&am…

昇思25天学习打卡营第01天|基本介绍快速入门

一、什么是昇思MindSpore&#xff1f; 昇思MindSpore是一个全场景深度学习框架&#xff0c;详见基本介绍 那什么是深度学习呢&#xff1f; 深度学习是一种特殊的机器学习&#xff0c;主要是利用了多层神经网络模拟人脑&#xff0c;自动提取特征并进行预测。 什么是机器学习…

【C++】模板详解

前言&#xff1a;在之前的学习我们发现我们无时无刻都用到模板这个东西&#xff0c;但是博主一直没有进行讲解&#xff0c;今天我们就一次性对模板进行一个整体的学习与讲解。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:高质量&#…

计算机毕业设计Python+LSTM+Tensorflow股票分析预测 基金分析预测 股票爬虫 大数据毕业设计 深度学习 机器学习 数据可视化 人工智能

基于TensorFlow-LSTM的股票预测系统开题报告 一、研究背景与意义 随着信息技术的飞速发展&#xff0c;股票市场作为现代经济活动的重要组成部分&#xff0c;其价格波动受到广泛关注。投资者们迫切希望通过科学的方法预测股票价格&#xff0c;以优化投资决策&#xff0c;实现利…

【Java06】Java中的类与对象

1. 类和对象 Java中的类模版如下&#xff1a; [修饰符] class 类名 {0~n个构造器;0~n个成员变量;0~n个成员方法; }构造器是类创建对象的根本途径。如果没有显式定义构造器&#xff0c;系统会默认提供一个。成员变量、成员方法的定义和C类似&#xff0c;只不过多了修饰符。 Ja…

前端基础——自学习梳理

超文本协议HTML <!DOCTYPE HTML> <html><head><meta charset"utf-8"> <style> /*Css*/.sty1{height:100px;width:100px;background-color: red;margin-top: 10px;float:left;margin-left: 10px;box-shadow: 10px 10px 10px #0000…