STM32--WDG看门狗

文章目录

  • WDG简介
  • IWDG
  • IWDG的超时计算
  • WWDG
  • WWDG超时和窗口值设定
  • 独立看门狗工程
  • WWDG工程

WDG简介

WDG看门狗(Watchdog Timer)是一种常见的硬件设备,在STM32F10系列中,有两种看门狗,分别是独立看门狗和窗口看门狗,可以用来监测系统的运行状态,并在系统出现故障或停止运行时采取相应措施,以确保系统的稳定性和可靠性。

WDG看门狗一般采用一个计时器和一个喂狗机制组成。计数器会周期性的计数,当计数器所计次数达到阈值时,就会产生一个中断或系统复位;喂狗机制是在系统正常运行时,定期向看门狗喂狗,也就是重置计数器的计数值,防止计时器达到阈值导致系统复位。

IWDG独立看门狗由内置的低速时钟(LSI)产生时钟频率,即使主时钟发生故障它也有效;
适用场景:可在主程序之外,独立工作、时钟要求精度低的场合

WWDG窗口看门狗由APB1时钟分频后所驱动
适用场景:在精度要求比较高的场合下,常用来监测编程程序不可逆转的错误或卡死等软件故障。

IWDG

在这里插入图片描述
独立看门狗产生的时钟频率一般认为是40kHz(LSI时钟频率设定在30kHz至60kHz),通过8位的预分频器到12位的递减计数器,计时器可以产生复位;

12位递减计数器,也就说最高能计算到4095个数,从大往小依次递减,达到阈值时产生复位;

预分频器寄存器:
在这里插入图片描述
可以调节7个分频系数

状态寄存器:
在这里插入图片描述
分别是对重装载值的更新和预分频器值的更新进行状态检测;对于多个重装载值和预分频值,就必须清除RVU和PVU才能重新改变值

重装载寄存器:
在这里插入图片描述

重装载寄存器也就是喂狗,需要通过键寄存器来控制,将重装载值加载到计数器中。

键寄存器(重点):
在这里插入图片描述
对于独立看门狗来说,需要通过键寄存器来启用,输入特定值0xCCCC即可开启;第一次开始时从0xFFF开始计数递减,到0产生复位;之后通过重装载值加载到指定值;
预分频器寄存器和重装载值寄存器都会受到看门狗的保护,要使用看门狗必须将它们解除保护,才得以使用,输入0x5555解除保护;
重装载值的加载,需要靠0xAAAA的命令来执行。

写入键寄存器的值执行
0xAAAAIWDG_RLR中的值重新加载到计数器(喂狗)
0xCCCC启用看门狗
0x5555解除IWDG_PR和IWDG_RLR寄存器的保护

IWDG的超时计算


40kHz倒置过来就是0.025ms;计数值范围限定在4096到0之间;由于从0开始计算,所以计数值需要加1;

WWDG

在这里插入图片描述
通过PCLK1产生时钟频率,通过预分频器到6位的递减计数器;当看门狗被启动后WDGA(激活位)就会被置‘1’,T6:0与W6:0进行比较,只有T6:0大于W6:0才能产生‘1’;这样产生结果和CR激活位‘1’通过与门产生‘1’到达或门;或门的较下面的线是当看门狗允许产生中断,递减计数器到0x40时会产生一个早期唤醒中断(EWI),也可以使WWDG产生复位;最后到达与门,或门产生的‘1’与激活位‘1’即可产生复位。

这里递减计数器只有6位,而在CR寄存器中达到7位,所以规定当递减计数器小于0x40时,也就是T6位从1变为0时,将产生复位
所以CR寄存器中的数值须在0xFF到0xC0之间

框图可以知道,计数值必须大于窗口值,如果计数值小于窗口值,也就是过快喂狗的话,也会产生复位;
在这里插入图片描述

注意:
在这里插入图片描述

WWDG超时和窗口值设定

在这里插入图片描述
WDGTB是时基,2的时基次方就是预分频值,也就是会产生1,2,4,8的分频;4096是PCLK1除以4096产生的CK时钟频率;

窗口值
在这里插入图片描述

独立看门狗工程

接线:
在这里插入图片描述

通过屏幕来观察是否是看门狗复位的效果;

int main()
{OLED_Init();Key_Init();OLED_ShowString(1,1,"WatchDog :");if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST)==SET){OLED_ShowString(2,1,"IWDG RST");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);}//初始化看门狗,LSI时钟已经打开IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//解除PR RLR的保护IWDG_SetPrescaler(IWDG_Prescaler_16);//设置分频值IWDG_SetReload(2499);//设置加载值IWDG_Enable();//启动独立看门狗//循环喂狗while(1){uint8_t num=Key_GetNum();//按键一直按住表示死机IWDG_ReloadCounter();//喂狗OLED_ShowString(4,1,"Feeding");Delay_ms(800);OLED_ShowString(4,1,"       ");Delay_ms(180);}
}

当看门狗产生复位时,会产生一个复位标志位,利用该特性来检查是否产生看门狗复位,如果是,那么将在屏幕闪烁“IWDG RST”,否则闪烁“RST”表示是系统复位;

对于初始化看门狗我们根据框图来执行操作;
在这里插入图片描述

这里有规定LSI会被强制打开,所以不用管它;
接着是解除保护:
在这里插入图片描述
这里的超时值我们设定是1000ms,根据上图可知,分频至少是16分频;
计算可知计数器值为2500;(也可以是其他分频,我测试结果都差不多,接近980ms左右,超过980ms时就会产生复位);
最后启动看门狗:
在这里插入图片描述

之后在循环中不断喂狗,经过测试,16分频下至少喂狗时间为980ms,与实际的1000ms还是比较大的;
在这里插入图片描述

我们还可通过按键不放的方式,由于我们采用循环法,一直按住不放也就会程序卡死,所以不能及时喂狗就产生看门狗复位;

WWDG工程

接线图与上面一致;思路方法也与上面一致;

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Key.h"int main()
{OLED_Init();Key_Init();OLED_ShowString(1,1,"WatchDog :");if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST)==SET){OLED_ShowString(2,1,"WWDG RST");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_APB1ENR_WWDGEN,ENABLE);//开启时钟WWDG_SetPrescaler(WWDG_Prescaler_8);//设置预分频器值WWDG_SetWindowValue(21|0x40);//设置窗口值 30msWWDG_Enable(54|0x40);//启动并设置计数值  50ms//循环喂狗while(1){Key_GetNum();//按键一直按住表示死机OLED_ShowString(4,1,"Feeding");Delay_ms(20);OLED_ShowString(4,1,"       ");Delay_ms(19);WWDG_SetCounter(54|0x40);}
}

初始化过程中,需要打开APB1的PCLK1时钟;
我们要设定一个窗口值为30ms,超时值为50ms的区间;
由上图看出我们预分频值至少为8,再计算计数器值约为55,
在这里插入图片描述

而窗口值的设定也是同样的道理:
在这里插入图片描述
经计算,对应值T5:0-W5:0=33,W5:0为21;

这里需要注意:
不能将重新转载值放到前面的地方,
在这里插入图片描述
原因是会导致喂狗时间过短,还没有达到窗口值;解决方法就是放在延迟之后,或者可以判断喂狗是否为第一次,是第一次就跳过;来进行解决。

最后经过测试,喂狗区间为31ms到50ms(包括31和50)之间,还是比较精准的(相对独立看门狗),而如果像上面使用的闪烁‘Feeding’来表示,那么区间为[31-49],原因是执行语句有延迟。

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

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

相关文章

【算法|双指针系列No.6】leetcode LCR 179. 查找总价格为目标值的两个商品

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…

设计模式 - 行为型模式考点篇:模板方法模式(概念 | 案例实现 | 优缺点 | 使用场景)

目录 一、行为型模式 1.1、模板方法模式 1.1.1、概念 1.1.2、案例实现 1.1.3、优缺点 1.1.4、使用场景 一、行为型模式 一句话概括行为型模式 行为型模式:类或对象间如何交互、如何划分职责,从而更好的完成任务. 1.1、模板方法模式 1.1.1、概念 …

Ansys Zemax | 如何建立LCD背光源模型

本文建立了楔形LCD背光源模型,并对其进行分析,并按照照明输出标准对其进行优化。 附件下载 联系工作人员获取附件 简介 液晶显示器 (LCDs) 作为一种显示技术,在当今社会中已经得到了广泛的应用。在商业领域中最突出的应用包括计算机显示器…

自定义类型

目录 结构体 匿名结构体 结构体嵌套 结构体大小 设置默认对齐数 位段 位段的跨平台问题 Enum枚举 枚举的好处 union联合体 判断大小端 内存大小 结构体 前面我们讲了结构体的基本知识,还有一些知识并没有罗列完全,这篇将结构体剩余的一些小知…

Windows mysql 5.7 msi版、mysql 8.0 msi版下载、安装教程,附详细图文

大家好,今天为大家带来的是 mysql 5.7 msi , MySql 8.0 版本的下载、安装教程,附详细图文。本文以 5.7 版本为例子,帮助大家讲解。希望对大家有所帮助 文章首发地址 一、下载地址 这里提供一下 CSDN 镜像下载地址,有…

Spring5应用之事务属性

作者简介:☕️大家好,我是Aomsir,一个爱折腾的开发者! 个人主页:Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏:Spring5应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言事务…

python sqlalchemy(ORM)- 01 简单使用

[doc] 简介 sqlalchemy 是python操作sql数据库的工具,是一个对象关系映射的框架;在python中提供高效、高性能的数据库访问,企业级的数据持久化模式;pypi 地址sqlalchemy官网 sqlalchemy架构 sql操作是独立于ORM操作的&#xf…

vscode 资源管理器移动到右边

目录 vscode 资源管理器移动到右边 vscode 资源管理器移动到右边 点击 文件》首选项》设置》工作台》外观》 找到这个配置下拉选择左右

单元测试很难么?也没有吧

前言 你可能会用单元测试框架,python的unittest、pytest,Java的Junit、testNG等。 那么你会做单元测试么!当然了,这有什么难的? test_demo.py def inc(x):return x 1def test_answer():assert inc(3) 4 inc() 是…

三次挥手和四次握手

TCP建立连接(三次握手) 经过DNS域名解析后,获取到了服务器的IP地址,在获取到IP地址后,便会开始建立一次连接,这是由TCP协议完成的,主要通过三次握手进行连接。 第一次握手: 建立连…

(部署服务器系列一)虚拟机模拟部署服务器

1、下载安装vmware 15 (win7最高支持版) 2、下载安装CentOS 配置2核2g(最少)磁盘100g(不会实际占有)选择时区-上海配置分区:https://blog.csdn.net/qq_35363507/article/details/127390889 &a…

设计模式02———建造者模式 c#

首先我们打开一个项目 在这个初始界面我们需要做一些准备工作 建基础通用包 创建一个Plane 重置后 缩放100倍 加一个颜色 更换天空盒(个人喜好) 任务:使用【UI】点击生成6种车零件组装不同类型车 【建造者模式】 首先资源商店下载车模型 将C…

虚幻引擎:如何才能对音波(声音资产)进行逻辑设置和操作

案列:调整背景音乐大小 1.创建一个SoundCue 2.进入创建的SoundCue文件 3. 创建音效类和音效类混合 4.进入SoundCue选择需要的音效类 5.然后音效类混合选择相同的音效类 6.然后蓝图中通过节点进行控制音量大小

把二叉搜索树转换为累加树

题目链接 把二叉搜索树转换为累加树 题目描述 注意点 树中的节点数介于 0 和 10000 之间每个节点的值介于 -10000 和 10000 之间树中的所有值 互不相同给定的树为二叉搜索树 解答思路 因为二叉搜索树的性质是左子树的值始终小于根节点的值,右子树的值始终大于根…

Android组件通信——ActivityGroup(二十五)

1. ActivityGroup 1.1 知识点 (1)了解ActivityGroup的作用; (2)使用ActivityGroup进行复杂标签菜单的实现; (3)使用PopupWindow组件实现弹出菜单组件开发; 1.2 具体…

el-upload手动上传图片,上传后隐藏上传样式(el-upload上传单张图片,vue2)

简介:上期介绍了使用el-upload上传文件,这次来介绍一下如何使用el-upload上传图片,只能上传一次,上传图片后隐藏上传按钮部分。 实现效果图: 1、首先,想要在项目中使用el-upload组件,同样&#…

检验检疫系统(LIS)源码:C# + MVC + SQLserver + Redis

LIS系统源码技术特点:采用.Net Core新的技术框架、DEV报表、前端js封装、分布式文件存储、分布式缓存等,支持LIS独立部署,Docker部署等多种方式。 技术架构:ASP.NET CORE 3.1 MVC SQLserver Redis等 开发语言:C…

基于全景运动感知的飞行视觉脑关节神经网络全方位碰撞检测

https:/doi.org/10.1155/2023/5784720 摘要: 生物系统有大量的视觉运动检测神经元,其中一些神经元可以优先对特定的视觉区域做出反应。然而,关于如何使用它们来开发用于全向碰撞检测的神经网络模型,很少有人做过工作。为此&#…

【算法优选】 二分查找专题——贰

文章目录 😎前言🌲[山脉数组的峰顶索引](https://leetcode.cn/problems/peak-index-in-a-mountain-array/)🚩题目描述:🚩算法思路🚩代码实现: 🌴[寻找峰值](https://leetcode.cn/pro…

Oracle 简介与 Docker Compose部署

最近,我翻阅了在之前公司工作时的笔记,偶然发现了一些有关数据库的记录。当初,我们的项目一开始采用的是 Oracle 数据库,但随着项目需求的变化,我们不得不转向使用 SQL Server。值得一提的是,公司之前采用的…