STM32中的独立看门狗和窗口看门狗

news2024/11/16 9:21:30

独立看门狗和窗口看门狗有什么区别?

    • 一、前言
    • 二、独立看门狗
    • 三、窗口看门狗
    • 四、结语

一、前言

在早期的MCU中是没有看门狗这种东西的,所以产品就很容易出现死机,跑飞的情况。为了避免这种情况的出现,后期的MCU都集成了看门狗的功能。但是目前看门狗发展到今天基本上分为两大类:独立看门狗和窗口看门狗。

独立看门狗:使用的是外部时钟,即使主频不工作了,看门狗也能正常工作。只要在到达喂狗时间的上限前喂狗即表示程序是正常的,这点和窗口看门狗是有区别的。另外独立看门狗是独立于整个系统之外的,这也是独立看门狗名字的由来,他有自己独立的时钟,不受整个系统的影响,所以独立看门狗主要用来监控硬件上的错误。

窗口看门狗:使用芯片内部时钟。喂狗的时间既有上限又有下限,即喂狗太早或者太晚都不行,比如我要求你在0.8s到0.9s内完成喂狗动作,如果你在0.8s之前或者在0.9s之后喂狗都是不可以的,都会认为MCU出现了异常,从而复位MCU。窗口看门狗是系统内部故障探测器,如果系统时钟出现了错误,那么窗口看门狗也就失去了作用,主要用于监视软件的错误。

二、独立看门狗

从上面的简单对于相信大家对于独立看门狗已经有些了解了,这部分就详细的给大家讲解一下独立看门狗,以及独立看门狗的实现原理。

在了解独立看门狗之前我想大家还是需要先了解一下看门狗到底是来干什么的,在由单片机构成的微机系统中,由于单片机工作常常会受到来自外界电磁场干扰导致程序跑飞,陷入死循环——即程序正常运行被打断,系统无法继续工作。

这种情况下会造成系统陷入停滞状态,发生不可预料的后果。因此出于对单片机运行状态进行实时监测的考虑,产生了一种专门用于监测单片机程序运行状态的模块或芯片,称为看门狗。

这里以大家熟悉的STM32为例给大家讲解一下独立看门狗的配置以及工作过程。STM32F10xxx内置两个看门狗:独立看门狗和窗口看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。
在这里插入图片描述

在这里插入图片描述

STM32中的独立看门狗时通过向键值寄存器(IWDG_KR)写入0xCCCC来进行配置的,当开启了独立看门狗之后其计数器就开始从0xFFF递减计数。当计数器计数到末尾0x000时,会产生一个复位信号(IWDG_RESET)。无论何时,只要键寄存器IWDG_KR中被写入0xAAAAIWDG_RLR中的值就会被重新加载到计数器中从而避免产生看门狗复位。

IWDG_PRIWDG_RLR寄存器具有写保护功能。要修改这两个寄存器的值,必须先向IWDG_KR寄存器中写入0x5555。将其他值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。重装载操作(即写入0xAAAA)也会启动写保护功能。

知道了上面配置的基本原则之后我们就可以开始配置我们的看门狗了,具体配置过程及配置代码如下所示:

  1. 取消寄存器写保护;
  2. 设置独立看门狗的与分频系数,确定时钟;
  3. 设置看门狗重装载值;
  4. 使能看门狗;
  5. 应用程序喂狗;

配置代码如下所示:

/**
 * 初始化独立看门狗
 * prer:分频数:0~7(只有低 3 位有效!)
 * 分频因子=4*2^prer.但最大值只能是 256!
 * rlr:重装载寄存器值:低 11 位有效.
 * 时间计算(大概):Tout=((4*2^prer)*rlr)/40 (ms).
 */
void IWDG_Init(u8 prer,u16 rlr)
{
    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); /* 使能对寄存器IWDG_PR和IWDG_RLR的写操作*/
    IWDG_SetPrescaler(prer);    /*设置IWDG预分频值:设置IWDG预分频值*/
    IWDG_SetReload(rlr);     /*设置IWDG重装载值*/
    IWDG_ReloadCounter();    /*按照IWDG重装载寄存器的值重装载IWDG计数器*/
    IWDG_Enable();        /*使能IWDG*/
}

/**
 * 喂独立看门狗
 */
void IWDG_Feed(void)
{
    IWDG_ReloadCounter();    /*reload*/
}

/**
 *main函数
 */
void main(void)
{
  NVIC_Configuration();//优先级配置
  IWDG_Init(4,625);//初始化独立看门狗,分频数为64,重装载值为625,溢出时间计算为:64*625/40=1000ms=1s
 while(1)
  {
    delay_ms(500);//0.5秒喂一次狗
      IWDG_Feed();//喂狗
  }        
}

对于溢出时间的计算大家可以按照下面的公式计算:Tout=((4×2^prer) ×rlr) /40 (M3)

独立看门狗所用到的库函数:

void WWDG_DeInit(void);
void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);
void WWDG_SetWindowValue(uint8_t WindowValue);
void WWDG_EnableIT(void);
void WWDG_SetCounter(uint8_t Counter);
void WWDG_Enable(uint8_t Counter);
FlagStatus WWDG_GetFlagStatus(void);
void WWDG_ClearFlag(void);

三、窗口看门狗

窗口看门狗(WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在 T6 位 (WWDG->CR 的第六位)变成 0 前被刷新,看门狗电路在达到预置的时间周期时,会产生一个 MCU 复位。

在递减计数器达到窗口配置寄存器(WWDG->CFR)数值之前,如果 7 位的递减计数器数值(在控制寄存器中)被刷新,那么也将产生一个 MCU 复位。这表明递减计数器需要在一个有限的时间窗口中被刷新。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
但是在使用窗口看门狗的时候需要注意写入WWDG_CR 寄存器时,始终将 1 写入 T6 位,以避免生成立即复位。

下面来看一下窗口看门狗的配置步骤以及配置代码;

  1. 使能 WWDG 时钟
  2. 设置窗口值和分频数
  3. 开启 WWDG 中断并分组
  4. 设置计数器初始值并使能看门狗

窗体看门狗需要用到的库函数;

void RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG 时钟使能
void WWDG_SetWindowValue(uint8_t WindowValue);//设置窗口值的函数
void WWDG_SetPrescaler(uint32_t WWDG_Prescaler)//设置分频数的函数
void WWDG_EnableIT(); //开启窗口看门狗中断
void WWDG_Enable(uint8_t Counter)//设置计数器初始值并使能看门狗

注意:在编写中断服务函数时喂狗一定要快,因为窗口看门狗的时效性比较强

窗口看门狗的代码如下:

.c

#ifndef __WDG_H
#define __WDG_H
#include "sys.h"
//独立看门狗
void IWDG_Init(u8 prer,u16 rlr);
void IWDG_Feed(void);
//窗口看门狗
void WWDG_Init(u8 tr,u8 wr,u32 fprer);//初始化WWDG
void WWDG_Set_Counter(u8 cnt);       //设置WWDG的计数器
void WWDG_NVIC_Init(void);
#endif

.h

#include "wdg.h"
#include "led.h"

//窗口看门狗
//保存WWDG计数器的设置值,默认为最大. 
u8 WWDG_CNT=0x7f; 
//初始化窗口看门狗 	
//tr   :T[6:0],计数器值 
//wr   :W[6:0],窗口值 
//fprer:分频系数(WDGTB),仅最低2位有效 
//Fwwdg=PCLK1/(4096*2^fprer). 
void WWDG_Init(u8 tr,u8 wr,u32 fprer)
{ 
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);  //   WWDG时钟使能

	WWDG_CNT=tr&WWDG_CNT;   //初始化WWDG_CNT.   
	WWDG_SetPrescaler(fprer);设置IWDG预分频值

	WWDG_SetWindowValue(wr);//设置窗口值

	WWDG_Enable(WWDG_CNT);	 //使能看门狗 ,	设置 counter .                  

	WWDG_ClearFlag();//清除提前唤醒中断标志位 

	WWDG_NVIC_Init();//初始化窗口看门狗 NVIC

	WWDG_EnableIT(); //开启窗口看门狗中断
} 
//重设置WWDG计数器的值
void WWDG_Set_Counter(u8 cnt)
{
    WWDG_Enable(cnt);//使能看门狗 ,	设置 counter .	 
}
//窗口看门狗中断服务程序
void WWDG_NVIC_Init()
{
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;    //WWDG中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;   //抢占2,子优先级3,组2	
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;	 //抢占2,子优先级3,组2	
  NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; 
	NVIC_Init(&NVIC_InitStructure);//NVIC初始化
}

void WWDG_IRQHandler(void)
{

	WWDG_SetCounter(WWDG_CNT);	  //当禁掉此句后,窗口看门狗将产生复位

	WWDG_ClearFlag();	  //清除提前唤醒中断标志位

	LED1=!LED1;		 //LED状态翻转
}

main.c

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "wdg.h"
 
int main(void)
{		
	delay_init();	    	 //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	 //串口初始化为115200
 	LED_Init();
	KEY_Init();          //按键初始化	 
	LED0=0;
	delay_ms(500);	  
	WWDG_Init(0X7F,0X5F,WWDG_Prescaler_8);//计数器值为7f,窗口寄存器为5f,分频数为8	   
 	while(1)
	{
		LED0=1;			  	   
	}   
}

在main函数里通过 LED0 来指示 STM32 是否被复位了,如果被复位了就会点亮 500ms。LED0 用来指示中断喂狗,每次中断喂狗翻转一次。

四、结语

到这里今天的讲解内容就结束了,不知道你对于看门狗以及看门狗的使用有没有理解,如果觉得有不理解的地方欢迎大家在下方评论区留言一起讨论!

👇点击下方公众号卡片获取资料👇

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

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

相关文章

CI/CD Jenkins容器化安装部署

环境准备 docker安装 jenkins镜像安装 CI/CD CI:持续集成 CD:连续交付 环境准备 下载前推荐先看下Jenkins硬件和软件要求部分 Jenkins官方文档 Jenkins下载 虚拟机 docker 对配置的要求 CentOS安装可跳转 VMware安装CentOS CentOS 7.8 // 查看CentOS版本命令 cat /etc…

牛客网语法篇练习循环控制(一)

1.2023年就要来到了,KiKi要对他的n位好朋友说n遍”Happy new year!Good luck!”的祝福语。 n int(input()) for i in range(n):print(Happy new year!Good luck!) 2.任意输入一个正整数N,统计1~N之间奇数的个数和偶数的个数,并输出。 num …

【网页设计】基于HTML在线商城购物项目设计与实现-----电脑商城6页带视频 带报告3000字

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 在线商城购物 | 水果商城 | 商城系统建设 | 多平台移动商城 | H5微商城购物商城项目 | HTML期末大学生网页设计作业 HTML:结构 CSS&#…

java开发者工具IDEA自定义设置主题/字体/字号大小

IDEA自定义设置主题 第一步:点击工具栏上的“File”选项。 第二步:选择“Settings…”选项。 第三步:点击“Appearance & Behavior > Appearance”选项。 第四步:点击右侧"Theme"下拉框,选择自己喜…

动态爬虫管理平台构建与实现_kaic

目 录 第1章 绪论 1.1背景与意义 1.2主题网络爬虫的国内外研究现状 1.2.1主题辨别算法及平台构建 1.2.2主题爬虫系统 1.3本文的研究内容 第二章 主题网络爬虫的体系结构 2.1组成模块 2.1.1基本组成 2.1.2基本流程 2.2主题页面的分布特性 2.2.1 Hub/Authority特性 2.2.2 Linkag…

一篇文章带你搞懂前端Cookie

文章目录一. 前言(一些废话)二. Cookie1. 为什么会有Cookie2. Cookie的特性3. 浏览器Cookie4. 跨站和跨域三. Cookie操作1. 获取Cookie2. 设置Cookie3. 修改Cookie4. 删除Cookie四. Cookie属性1. Cookie属性Domain2. Cookie属性path3. Cookie属性expires4. Cookie属性max-age5.…

大数据_数据中台_数据分层

目录 分层总览 ODS:操作数据层 DIM:维度数据层 DWD:明细数据层 DWS:汇总数据层 ADS:数据应用层 CDM:公共数据层 数据层级调用原则 分层总览 ODS:操作数据层 ODS(Operate Data Store),ODS层数据是数据仓库的第一层数据,是业务数据库的原始数据的复…

Oracle Primavera Unifier uDesigner 资产管理器(Asset Manager )

目录 前言 特点 优势 维护管理 独立或集成 事务管理 资产组合管理 投资组合管理能力 可持续性和能源管理 单一集成设施和资产生命周期管理 移动应用 前言 Oracle Primavera Unifier 为组织提供设施管理的行业最佳实践解决方案。从设计、构建、运行和维护&#xff0…

【深入理解Kotlin协程】Google的工程师们是这样理解Flow的?

Question:why there is a Flow in kotlin? 问这个问题就好比在问为什么那里会有一座山存在,嗯,这貌似是一个哲学问题。当然,对于kotlin中的Flow的理解可能不会上升到这么高的哲学层次,对于Flow相关的Api掌握并使用它…

JavaSE笔记——多态

文章目录前言一、向上转型回顾1.忘掉对象类型二、转机1.方法调用绑定2.产生正确的行为3.可扩展性三、构造器和多态1.构造器调用顺序2.构造器内部多态方法的行为四、协变返回类型总结前言 本文是学习Java编程思想记录的笔记,主要内容介绍在 Java 中多态的概念。 多…

Servlet API(HttpSerrvlet+HttpServletRequest+HttpServletResponse)

目录 🐲 1. HttpServlet 🐲 2. HttpServletRequest HTTP请求 🦄 2.1 打印请求信息(创建 ShowRequest 类) 🦄 2.2 获取 GET 请求中的参数(创建 GetParameter 类) 🦄 2.3 获取 POST 请求中的参数(创建 PostParame…

java学习day57(Spring Cloud)Spring Cloud 微服务

主要课程内容 第⼀部分:微服务架构 互联网应用架构演进 微服务架构的体现思想及优缺点 微服务架构的核心概念 第⼆部分:SpringCloud概述 Sping Cloud 是什么 Sping Cloud 解决什么问题 Sping Cloud 架构 第三部分:案例准备 第四部分&#xff…

2022华为杯研究生数学建模竞赛DS数模选题建议

2022华为杯研究生数学建模竞赛DS数模选题建议 开放性:F>E>AD>BC. 难度:AD>BC>EF (仅C君个人看法) A题 移动场景超分辨定位问题 此题是物理cv类题目,属于比较新颖的超分辨率图像检测类任务&#xff0c…

1、Java的json得到我们想要的数据结构

Java的json得到我们想要的数据结构 第一步:首先我们要知道json就两种数据结构。 !!!第一种数据结构:对象用{ }表示 !!!第二种数据结构:数组用[ ]表示 我们用这个案例来…

在智能家居领域产品中常用芯片

芯片是当前“电子科技设备的灵魂”所在,几乎决定了所有电子设备的综合性能,现如今智能家居带来了全新的使用场景与交互方式,从扫地机器人、智能洗碗机、智能冰箱等智能机器,到智能照明、智能感知、网络通讯、家庭影音等智能系统&a…

H264基础知识入门

之前视频基础,有讲到视频的原始数据YUV,相比RBG,数据确实减少了,但还是一个非常大数据量,会占用很大空间以及在给网络传输带来很大压力。所以必须要对视频进行压缩,减少占用空间。这里主要分享H264编码技术…

数字IC设计之——低功耗设计

目录 概述 背景 为什么需要低功耗设计 CMOS IC功耗分析 基本概念 功耗的分类 功耗相关构成 不同层次低功耗设计方法 芯片中的功耗分布以及对应的低功耗方案 低功耗方案 系统算法级的低功耗技术 编码阶段的低功耗技术 门控时钟 Clock Gating 物理实施的低功耗技术 操作数分离&am…

【第六部分 | JavaScript高级】1:面向对象

目录 【第一章】面向对象 | Class创建、构造函数、方法 | Class继承 | 三个注意点 | 静态成员 | 原型对象 __ _proto___ | 类的本质 【第一章】面向对象 | Class创建、构造函数、方法 创建类 class name {// class body }var xx new name() 构造函数 class Person {co…

【Godot】数据响应的方式执行功能

Godot Engine 版本:4.0 beta 6 下载地址:Index of /godotengine/4.0/beta6/ (downloads.tuxfamily.org) 在这个教程中,学会理解以数据为主的进行处理执行逻辑的代码编写方式,虽然看似简单,但是确是方便又好用。 以及下…

Git使用教程

Git项目的三个工作区域的概念: 1、Git仓库Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。 2、工作目录工作目录是对项目的某个版本独立提取出来的内容…