STM32F4_独立看门狗详解(IWDG)

news2024/10/6 0:39:06

目录

1. 独立看门狗是什么

2. 独立看门狗 IWDG简介

3. 独立看门狗的主要特性

4. 独立看门狗功能

4.1 独立看门狗功能框图

4.2  IWDG寄存器

4.2.1 关键字寄存器 IWDG_KR

4.2.2 预分频器寄存器 IWDG_PR

4.2.3 重载寄存器 IWDG_RLR

4.2.4 状态寄存器 IWDG_SR

5. 库函数配置独立看门狗

6. 相关实验程序

6.1 main.c

6.2 iwdg.c

6.3 iwdg.h


1. 独立看门狗是什么

        在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界的电磁波干扰,造成程序的跑飞,从而陷入到死循环,程序的正常运行被打断,由单片机控制的系统无法继续正常工作,会造成整个系统陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”。

        STM32板载了两种嵌入式看门狗外设,具有安全性高、定时精准及使用灵活的优点。看门狗分为独立看门狗窗户看门狗均可用于检测并解决由于软件错误导致的故障。本章我们着重讲解独立看门狗。

2. 独立看门狗 IWDG简介

        看门狗的作用就是在一定的时间内  (这段时间通过定时器去实现)  ,如果超过这段时间还没有被喂养信号(表MCU已经挂了),便启动处理器的自动复位重启(发送复位信号)。

        独立看门狗由其专用的低速内部时钟LSI驱动,通过对时钟的学习,我们知道LSI低速内部时钟是专门用来驱动看门狗的,独立看门狗由内部专门的32Khz低速时钟驱动,即使主时钟发生故障,它也仍然有效。独立看门狗的时钟是一个内部RC时钟,所以并不是准确的32Khz,而是一个在15~47Khz之间的可变化的时钟。

        独立看门狗最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。

        硬件看门狗:如果通过器件选项位使能 “硬件看门狗” 功能,上电时将自动使能看门狗;如果在计数器计数结束前,若软件没有向关键字寄存器写入相应的值,则系统会产生复位。

3. 独立看门狗的主要特性

1. 自由运行的递减计数器   用于给定一段确定的时间,如果程序运行超过这段时间,表明MCU已经挂了

2. 时钟由独立RC振荡器提供(可在待机和停止模式下运行)  低速内部时钟LSI,主时钟发生故障时,LSI 仍然保持工作状态

3. 当递减计数器达到0x000时产生复位(前提是看门狗已激活)    递减定时器递减到0时,复位为初始值,循环工作

4. 独立看门狗功能

4.1 独立看门狗功能框图

4.2  IWDG寄存器

4.2.1 关键字寄存器 IWDG_KR

关键字寄存器 IWDG_KR(Key register)32位寄存器

位31:16  保留,必须保持复位值

位15:0  KEY[15:0]:键值,只写位,读为0000h;

        必须每隔一段时间便通过软件对这些位写入键值AAAAh,否则当计数器计数到0时,看门狗会产生复位。

        写入键值5555h可使能对IWDG_PR和IWDG_RLR寄存器的访问。

        写入键值CCCCh可启动看门狗   该寄存器的15:0位再一次强调了上述框图中的情况

        在关键字寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值0xFFF递减计数。当计数器计数到末尾0x000时,会产生一个复位信号(IWDG_RESET)。 无论何时,只要关键字寄存器IWDG_KR中被写入0xAAAA, IWDG_RLR中的值就会被重新加载到计数器中从而避免产生看门狗复位 。 

4.2.2 预分频器寄存器 IWDG_PR

预分频器寄存器 IWDG_PR(Prescaler register) 32位寄存器

位31:3  保留,必须保持复位值

位2:0 PR[2:0]:预分频器

        这些值受写访问保护。通过软件设置这些位来选择计数器时钟的预分频因子。若要更改预分频的分频系数,IWDG_SR的PVU位必须为0

000:4分频   001:8分频   010:16分频   011:32分频   100:64分频   101:128分频   110:256分频   111:256分频

注意:读取该寄存器会返回VDD电压域的预分频值。如果正在对该寄存器执行写操作,则读取的值可能不是最新的/有效的。因此,只有在IWDG_SR寄存器中的PVU位为0时,从寄存器中读取的值才有效。

4.2.3 重载寄存器 IWDG_RLR

重载寄存器 IWDG_RLR(Reload register)32位寄存器

位32:12  保留,必须保持复位值

位11:0 RL[11:0]:看门狗计数器重载值

        这些值受写访问保护,每次对IWDG_KR寄存器写入值AAAAh时,这个值就会重装载到看门狗计数器中,之后便会从重装载以后的值开始递减计数若要更改重装载值,IWDG_SR中的RVU位必须为0;该寄存器用来保存重装载到计数器中的值。

4.2.4 状态寄存器 IWDG_SR

状态寄存器 IWDG_SR(Status register)32位寄存器

位31:2  保留,必须保持复位值

位1 RVU:看门狗计数器重装载更新

                可通过硬件将该位置1以指示重装载值正在更新。当在VDD电压域下完成重装载更新操作后,会通过硬件将该位复位。

                重载值只有在RVU位为0时才可更新。

位0 PVU:看门狗预分频器值更新

                可通过硬件将该位置1以指示预分频器值正在更新。当在VDD电压域下完成预分频器值更新操作后,会通过硬件将该位复位。

                重载值只有在PVU位为0时才可更新。        

5. 库函数配置独立看门狗

库函数配置独立看门狗的步骤:

1. 取消寄存器写保护(向IWDG_KR写入0x5555)

取消写保护的实质其实是取消IWDG_PR和IWDG_RLR的写保护;首先取消写保护的目的是为了后续可以设置IWDG_PR和IWDG_RLR寄存器的值。

        IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);

2. 设置独立看门狗的预分频系数和重装载值

void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);//设置IWDG的预分频值

void IWDG_SetReload(uint16_t Reload);  //设置IWDG重装载值

通过对以上两个寄存器设置可以计算出看门狗的喂狗时间(也就是看门狗溢出时间):

Tout=((4*2^prer)*rlr)/32 

Tout:看门狗溢出时间     prer:预分频值  0~7      rlr:重装载值

单位ms       4*2^prer=称为分频因子最大值256       分母=看门狗时钟(并不固定)

具体来说就是:比如通过计算得到看门狗的溢出时间是1000ms,也就是1s,只要你在1s之内,有一次写入0xAAAA到IWDG_KR,就不会导致看门狗复位。

3. 重载计数器喂狗(向IWDG_KR写入0xAAAA)

IWDG_ReloadCounter(); //重载计数器的值到IWDG计数器中,避免其复位  这一步骤就是看门狗喂狗

4. 启动看门狗(向IWDG_KR写入0xCCCC)

IWDG_Enable();   //使能IWDG

注意IWDG一旦启动,就不能再关闭,想要关闭,只能重启;一般不使用IWDG,就不要启动看门狗;启动看门狗以后必须间隔一段时间去喂狗,否则就会导致程序复位。

6. 相关实验程序

该程序将会实现:

        LED0常量,如果KEY_UP按下,就进行独立看门狗喂狗,只要看门狗不停的按,看门狗就不会产生复位,保持LED0常量,一旦超过了看门狗的溢出时间还没按,就会导致程序重启,LED熄灭一次。

6.1 main.c

#include "stm32f4xx.h"
#include "delay.h"
#include "LED.h"
#include "BEEP.h"
#include "Key.h"
#include "usart.h"
#include "exti.h"
#include "iwdg.h"

int main()
{
	LED_Init();//初始化LED
	delay_init(168);//初始化延迟函数
	Key_Init();//初始化按键
	delay_ms(500);//延迟500ms  保证肉眼可以看到灯的亮灭,因为LED初始化是置高电平的,默认不亮
	IWDG_Init(4,500);//初始化看门狗喂狗  (4*2^4)*500/32=1000ms=1s 设置看门狗的溢出时间为1秒
	LED0=0;//LED0点亮
	while(1)
	{
		if(KEY_UP==1)//如果KEY_UP按键按下
		{
			IWDG_FEED();//喂狗
		}
		delay_ms(10);//延迟10ms
	}
}

6.2 iwdg.c

#include "stm32f4xx.h"                  
#include "iwdg.h"

//prer:预分频值
//rlr:自动重装载值
void IWDG_Init(unsigned char prer,unsigned int rlr)//IWDG初始化
{
	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//取消写保护,方便后续调用寄存器
	IWDG_SetPrescaler(prer);//设置预分频值
	IWDG_SetReload(rlr);//设置重装载值
	IWDG_ReloadCounter();//把重装载寄存器rlr的值加载到KR寄存器中,进行看门狗喂狗
	IWDG_Enable();//看门狗使能
}

void IWDG_FEED(void)//看门狗喂狗
{
	IWDG_ReloadCounter();//往KR寄存器中写0xAAAA;
}

6.3 iwdg.h

#ifndef _IWDG__H_
#define _IWDG__H_
#include "sys.h"

void IWDG_Init(unsigned char prer,unsigned int rlr);

void IWDG_FEED(void);
#endif

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

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

相关文章

OpenCV实战之人脸美颜美型(六)——磨皮

1.需求分析 有个词叫做“肤若凝脂”,直译为皮肤像凝固的油脂,形容皮肤洁白且光润,这是对美女的一种通用评价。实际生活中我们的皮肤多少会有一些毛孔、斑点等表现,在观感上与上述的“光润感”相反,因此磨皮也成为美颜算法中的一项基础且重要的功能。让皮肤变得更加光润,就…

interface陷阱

A1 interface Duck Typing: 当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子 目的: 在 Go 中,Interface(接口)只是一组方法集合。描述事物的外部行为而非内部结构。 通过接口实现多态的概…

微服务架构——SpringCloud快速入门

认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢? 单体架构 将业务的所有功能集中在一个项目中开发,打成一个包部署。 优点&#…

如何保证缓存和数据库的数据一致性

文章目录1、错误的解决方案1.1、 先更新数据库,再删除缓存1.2、 先更新数据库,再更新缓存1.3、 先删除缓存,再更新数据库1.4、 先更新缓存,再更新数据库2、正确的解决方案2.1、使用 CAS2.2、使用分布式锁2.3、使用消息队列异步更新…

字符串匹配—KMP算法

字符串匹配的应用非常广泛,例如在搜索引擎中,我们通过键入一些关键字就可以得到相关的搜索结果,搜索引擎在这个过程中就使用字符串匹配算法,它通过在资源中匹配关键字,最后给出符合条件的搜索结果。并且我们在使用计算…

SpringBoot解决用户重复提交订单(方式三:通过Redis实现-升级版)

文章目录前言1、方案实践1.1、引入Redis依赖1.2、添加Redis环境配置1.3、编写服务验证逻辑,通过 aop 代理方式实现1.4、在相关的业务接口上,增加SubmitLimit注解即可2、小结前言 在上一篇文章中,我们详细的介绍了随着下单流量逐渐上升&#…

【PyTorch】第二节:梯度的求解

作者🕵️‍♂️:让机器理解语言か 专栏🎇:PyTorch 描述🎨:PyTorch 是一个基于 Torch 的 Python 开源机器学习库。 寄语💓:🐾没有白走的路,每一步都算数&#…

python提取多个pdf特定页,并合并为新pdf文件

文章目录1,代码结构2,代码详解2.1,将范围字符串转成list2.2,获取pdf文件特定页2.3,将pdf页list合并为pdf文件并保存2.4,遍历所有要合并的文件,进行合并2.5,给出要合并的pdf文件及范围…

大模型学习

大模型学习计算机视觉方向ViTImage Token EmbeddingMulti-head Self-attentionStable Diffusionstable diffusion支持功能stable diffusion整体结构ClipText如何训练图像信息创建器(Image information creator)自动编码解码器(降噪绘制图形&a…

One Note插件——gem for onenote的安装

文章目录一、前言二、报错原因三、解决方法一、前言 平时写笔记都是用的OneNote来记录,但是Onenote没有 Markdown编辑器 ,写起来很不方便,搜索了解后知道gem for OneNote这个插件,于是下载安装了,但是插件每次都要手动勾选&#…

什么是小程序SDK?安全吗?

前面分享了很多小程序相关的内容,常常提到小程序SDK的概念,但似乎有很多小伙伴不是很理解,今天就来跟大家聊聊小程序SDK。 什么是小程序SDK? 小程序SDK是一种开发工具包,用于开发和构建小程序应用程序。它提供了一系列…

【thingsboard+chirpstack 下行数据通信测试】

这里写目录标题 7. 节点未收到 tb 平台下发数据原因分析7.1 收到的size为07.2 节点收不到数据7.3 可以收到数据的一组例子7.4 节点没收到数据原因分析本文主要描述 tb 下发的数据,节点接收不到原因分析。 主要是数据格式以及解析脚本的对应关系 7. 节点未收到 tb 平台下发数据…

Golang数据类型比较

直接使用比较的情况 分类说明是否能比较说明基本类型整型( int/uint/int8/uint8/int16/uint16/int32/uint32/int64/uint64/byte/rune等)浮点数( float32/float64)复数类型( complex64/complex128)字符串&a…

《Vue3实战》 第一章 nods/npm安装、配置

1、nods.js安装(Windows) 1.1、下载并安装node https://nodejs.org/en/ , 安装到d盘nodejs目录 1.2、配置环境变量 path配置 1.3、配置全局包存放目录和缓存目录 在根目录下创建node_global(全局包存放目录)和node_cache&…

关于药物|新药|药品市场调研报告(实操资料分享)

药品市场调研报告是指对药品行业进行详细的市场情况研究和分析。往往伴随着药品市场调研目的地不同,如战略探索、新药开发、投资决策等,报告编辑的内容要点要求也不一样。但总的核心要点内容笔者已提炼,如下: 一、药品市场调研报告…

DeePMD-kit 配置环境备忘

版本 Conda Conda是一个开源的包管理系统和环境管理系统,用于安装多个版本的软件包及其依赖项,并在它们之间轻松切换。它可以在Linux、OS X和Windows上运行,是为Python程序创建的,但可以打包和分发任何软件。 conda enactivatec…

为何ChatGPT如此擅长编造故事?

“幻觉”——人工智能中的一个偏见性术语 AI聊天机器人(如OpenAI的ChatGPT)依赖于一种称为“大型语言模型”(LLM)的人工智能来生成它们的响应。LLM是一种计算机程序,经过数百万文本源的训练,可以阅读并生成“自然语言”文本语言,就像人类自然…

TCP报头结构和TCP协议特性

TCP报头结构 原端口号/目的端口号:表示数据是从哪个进程来,到哪个进程去; 32位序号/32位确认号:这个序号是取的发送方发送所用数据下一个字节的序号,发送方的序列号和接收方的确认号一样,才算接收成功&…

敏捷开发模式下如何用 PingCode 这类工具进行版本发布管理

在软件团队工作中,版本发布要达到好的发布效果,需要在版本发布前做好版本发布的规划,并对发布流程和进度进行管理 准备工作: 您已经创建了一个 PingCode 帐户【快速注册入口】 您创建了一个 PingCode Scrum或 Kanban 项目 您的…

【周末闲谈】文心一言,模仿还是超越?

个人主页:【😊个人主页】 系列专栏:【❤️周末闲谈】 周末闲谈 ✨第一周 二进制VS三进制 文章目录周末闲谈前言一、背景环境二、文心一言?(_)?三、文心一言的优势?😗😗😗四、文心一…