STM32--WDG看门狗

news2025/6/26 4:25:18

文章目录

  • 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);//设置窗口值 30ms
    WWDG_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.coloradmin.cn/o/1085863.html

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

相关文章

Django 静态自定义化配置

STATIC # APP本地静态资源目录(就APP对应的) STATIC_URL "/static/"# 远程静态文件URL(少用) REMOTE_STATIC_URL# 外部引用静态文件目录(外层的) STATICFILES_DIRS [os.path.join(BASE_DIR, &…

Ubuntu系统下安装rpm安装包的方法

前言 Ubuntu的软件包格式为deb 而RPM格式的包归属于红帽子Red Hat 在这直接使用命令是安装不了的 需要通过一个桥梁进行转换 方法 将其rpm的格式包转换为deb的格式包 具体转换通过alien进行转换 这个安装包默认是没有安装的 sudo apt-get install alien 之后通过这个命令将…

相交链表Java

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 nu11。 以下有两种解决方法: 一种是用Map,利用其key值唯一的方法去判断(也可以使用set,set在add时,已存在的元素会返回false,不存在的返回…

元宇宙虚拟展厅:沉浸式体验、个性化互动、全新展示

近年来,大多数企业开始注重线上虚拟展厅的搭建,元宇宙虚拟展厅也为众多企业创造了更多有趣的体验,为商企带来了全新的宣传方式。相对于传统展厅而言,元宇宙虚拟展厅在场景真是复刻的基础上,做到了超越真实。 传统展厅的…

关于网络协议的若干问题(三)

1、当发送的报文出问题的时候,会发送一个 ICMP 的差错报文来报告错误,但是如果 ICMP 的差错报文也出问题了呢? 答:不会导致产生 ICMP 差错报文的有: ICMP 差错报文(ICMP 查询报文可能会产生 ICMP 差错报文…

核心期刊发布通知:养育三孩家庭作者免收版面费!(附免收期刊盘点)

免收版面费通知 近日,中文核心期刊《财会通讯》在其官方微信平台发布通知《关于对养育三孩家庭的作者免收版面费的通知》。 图源:《财会通讯》官方微信平台 通知称:为落实党的二十大报告中关于“优化人口发展战略,建立生育支持…

如何在STM32中实现TCP通信?

如何在STM32中实现TCP通信? TCP通信在计算机网络中扮演着重要角色,实现它需要兼顾硬件和软件因素。 硬件层面,某些STM32处理器内置了Ethernet MAC,这有利于简化网络通信的部署。若处理器缺乏内置MAC,需外接以太网控制…

22字符串-简单反转

目录 BM(Boyer-Moore) 坏字符 好后缀 什么情况用哪个规则? LeetCode之路——151. 反转字符串中的单词 分析: 字符串匹配中除了简单的BF(Brute Force)、RK(Rabin-Karp)算法,还有…

物业巡检系统能做什么?物业服务如何提升管理效率?

随着科技的快速发展,物业管理行业也在寻求着更加高效、智能化的解决方案,以应对日益复杂的设备和环境巡检上的需求。目前传统的纸质巡检方式已经无法满足现代物业管理的要求,“的修”工单管理系统应运而生,它通过数字化、智能化的…

软件成果鉴定测试应该怎么做?对软件产品起到什么作用?

软件成果鉴定测试是指对一个软件产品进行全面、系统的测试,以评估其是否符合预期的要求、是否满足特定的标准和规范。该测试旨在发现和解决软件产品中的缺陷和问题,确保其质量和可靠性。 一、软件成果鉴定测试包括以下内容   1、需求分析:…

ctfshow-ssti

web361 名字就是考点,所以注入点就是name 先测试一下存不存在ssti漏洞 利用os模块,脚本 查看一下子类的集合 ?name{{.__class__.__base__.__subclasses__()}} 看看有没有os模块,查找os 利用这个类,用脚本跑他的位置 import …

【USRP】NI PCIe-8371

什么是 NI PCIe-8371 PXI远程控制设备。 x4 Gen1 PCI Express主机,832 MB/s,铜缆MXI-Express设备,用于PXI远程控制—PCIe‑8371是一款MXI‑Express远程控制器,用于控制通过有线PCI连接到计算机PCI Express插槽的设备或系统。 当…

oracle手工创建数据库?稳健一文

一、描述 新加了一块盘做手工创建数据库的数据文件目录 oradata; 这台服务器上本来就有一个单机asm数据库,我内存不够先关闭了 二、手工创建oracle数据库 1、设置ORACLE_SID [oracleoomcserver ~]$ cp .bash_profile .bash_profile_omccdb [oracleoomc…

再谈Java泛型

一.类型参数的约束 我们可以对泛型传进来的参数做一些约束,比如说 用extends表明传进来的参数类型必须是必须是某个类型的子类型或者本身 当然也可以用接口约束,也是用extends表明传进来的参数类型必须实现某个接口。用&连接,注意class…

SpringBoot-黑马程序员-学习笔记(四)

40.业务层Service的快速开发 1.写业务层接口并且继承IService类,泛型是对应的实体类 2.写实现类,除了和之前一样的实现Service类外,还要继承ServiceImpl类,泛型有2个,第一个是对应的Dao层,第2个是对应的实…

深入解析Spring Cloud Gateway的GlobalFilter

文章目录 摘要引言GlobalFilter的作用使用GlobalFilter默认的GlobalFilter自定义GlobalFilter 示例代码配置GlobalFilter配置文件方式代码方式 高级用法:重写GlobalFilter思路代码实现 结论参考文献 摘要 本文将详细介绍Spring Cloud Gateway中的GlobalFilter&…

一文理清JVM结构

JVM结构介绍 JVM一共分为三个组成部分: 1 类加载子系统 主要是将class文件加载到内存中的一个系统,其核心组件是类加载器 2 运行时数据区子系统 1 JVM私有部分 1 虚拟机栈 描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧&…

语言模型编码中/英文句子格式详解

文章目录 前言一、Bert的vocab.txt内容查看二、BERT模型转换方法(vocab.txt)三、vocab内容与模型转换对比四、中文编码总结 前言 最近一直在学习多模态大模型相关内容,特别是图像CV与语言LLM模型融合方法,如llama-1.5、blip、meta-transformer、glm等大…

程序员如何用海外平台接单?

作为一名能力超群的码农,基本工资肯定是到位的。 那你是否想过锦上添花,试着找找兼职呢? 相信不少人已经在接单平台上接单了, 但是,在众多接单平台中,海外平台是个什么样的存在呢?怎么在海外…

c/c++--编译指令(预处理之后) #pragma

1. #pragma 作用 #pragma 用于指示编译器完成一些特定的动作#pragma 的功能或作用 随编译器不同而变化。 即 不同的编译器可能以不同的方式解释同一条 #pragma 指令 2. 用法 常见用法示例 2.1 #pragma message 参考链接 自定义编译信息输出到终端(一般和#if配合使用&#…