独立看门狗

什么是独立看门狗?它有什么用?什么时候用?不用行不行?

独立看门狗(Independent Watchdog,简称IWDG)是一种微控制器中常见的硬件保护机制。它的主要作用是监视系统的运行状态,当系统出现异常或者死锁时,可以自动重置系统,确保系统的稳定性和可靠性。

使用独立看门狗的目的是为了防止程序运行过程中出现死循环、死锁或者其他异常情况导致系统无法正常工作的情况。当系统正常运行时,程序会周期性地喂狗,即重新加载独立看门狗的计数器,以防止计时器溢出。如果系统出现异常,程序无法喂狗,导致独立看门狗的计数器溢出,系统就会认为出现了故障,并执行相应的操作,例如重置系统。

通常情况下,独立看门狗适用于那些对系统稳定性和可靠性要求比较高的场景,比如嵌入式系统、工业控制系统、汽车电子系统等。在这些场景下,即使程序出现异常,也需要保证系统能够自动恢复到正常工作状态,以避免因为故障导致系统长时间无法运行,带来不可预测的后果。

不使用独立看门狗可能会导致系统出现故障后无法及时恢复,长时间无响应,甚至造成数据丢失或者其他不可预测的后果。因此,对于一些对系统稳定性要求较高的应用,使用独立看门狗是很有必要的。然而,在一些对实时性要求不高、对系统稳定性要求较低的应用中,可以不使用独立看门狗,以减少系统的复杂性和成本

 

所以,它重要,但不是必需。 

iwdg.c

#include "iwdg.h"void Iwdg_Init(void)
{//1、 取消寄存器写保护:IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//2、设置独立看门狗的预分频系数,确定时钟:32KHZ/128 = 250HZIWDG_SetPrescaler(IWDG_Prescaler_128);//3、设置看门狗重装载值,确定溢出时间:IWDG_SetReload(500);  //必须在两秒内喂狗//4、使能看门狗 ,从0xFFF开始计数IWDG_Enable();//5、应用程序喂狗:IWDG_ReloadCounter();}

iwdg.h 

#ifndef __IWDG_H
#define __IWDG_H
#include "stm32f4xx.h"void Iwdg_Init(void);#endif

main.c 

#include "stm32f4xx.h"
#include "led.h"
#include "key.h"
#include "exti.h"
#include "delay.h"
#include "pwm.h"
#include "usart.h"
#include "string.h"
//#include "hcsr04.h"
//#include "infrared.h"
#include "iwdg.h"#define LED0_ON 	GPIO_ResetBits(GPIOF,GPIO_Pin_9)      	//开灯
#define LED0_OFF 	GPIO_SetBits(GPIOF,GPIO_Pin_9)      	//关灯u8 Usart_Data;
u8 rx_flag = 0;  		//表示串口接收标志 rx_flag = 1表示接收完成 rx_flag = 0未完成
u8 buffer[64] = {0};	//接收存储数据数组
u8 rx_buffer[64] = {0};	//接收存储数据数组
u8 rx_i,rx_count=0;void USART1_IRQHandler(void)
{//若是非空,则返回值为1,与RESET(0)判断,不相等则判断为真if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){	/* DR读取接受到的数据*/buffer[rx_count++] = USART_ReceiveData(USART1);	 //先赋值再加if(buffer[rx_count-1] == ':')  //判断是否接收到结束标志{for(rx_i=0; rx_i<rx_count-1; rx_i++){rx_buffer[rx_i] = buffer[rx_i]; //将数据存储在rx_buffer数组中}rx_flag 	= 1; 	//rx_flag = 1表示接收字符串完成rx_count = 0;memset(buffer, 0, sizeof(buffer));}//判断为真后,为下次中断做准备,则需要对中断的标志清零USART_ClearITPendingBit(USART1,USART_IT_RXNE);	   }	}//这是一个主函数
int main(void)
{u16 value = 0;//NVIC分组 抢占优先级两位:0~3  响应优先级两位:0~3 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);Delay_Init();Led_Init();Usart1_Init();Iwdg_Init();printf("This is iwdg test\n");while(1){GPIO_ToggleBits(GPIOA, GPIO_Pin_6);delay_s(1);delay_ms(500);  //延时是用时应该程序程序
//	delay_ms(200);//往非法地址写值//*(volatile unsigned int *)(0xC0000000) = 0x20;printf("program ok??\n");IWDG_ReloadCounter();}return 0;
}

烧录结果:

 

问题

为什么这里实验效果是串口打印了program ok??\n,而没有了printf("This is iwdg test\n"?

在给定的代码中,首先进行了一系列的初始化操作,包括延时初始化、LED初始化、USART1初始化以及IWDG初始化。在主循环中,首先对GPIOA的引脚6进行了翻转,然后延时了1秒,接着延时了500毫秒。在延时之后,执行了一条printf语句输出"program ok??",然后重新加载了独立看门狗(IWDG)的计数器。

在这段代码中,虽然初始化了USART1,但在主循环中并没有进行串口的读写操作。因此,程序的执行并没有从串口接收到数据,也没有通过串口发送数据。由于没有通过串口发送数据,因此printf语句"printf("This is iwdg test\n");"并没有导致任何数据被发送到串口,所以在终端上看不到相关输出。

而"printf("program ok??\n");"语句是在每次循环中执行的,因此每次循环都会将"program ok??"发送到串口,所以在终端上看到了这个输出。

 但是把'''*(volatile unsigned int *)(0xC0000000) = 0x20;'''取消注释后,又有打印printf("This is iwdg test\n")

在取消注释 `*(volatile unsigned int *)(0xC0000000) = 0x20;` 之后,会导致对一个非法地址写入数据,这通常会引发硬件异常,例如存储器访问错误或者总线错误。在某些微控制器中,当发生硬件异常时,可能会触发中断或者重置系统。在这种情况下,可能会重新执行初始化代码,包括对串口的初始化,因此你会看到 "This is iwdg test\n" 这条 printf 语句的输出。 

但需要注意的是,这种行为是不可预测的,因为它取决于微控制器的硬件和系统的工作方式,不同的硬件平台和编译器可能会有不同的行为。同时,对非法地址的访问可能会导致系统异常或者数据损坏,应当尽量避免这种操作。

 特殊定时器

独立看门狗(IWDG)通常可以被看作是一种特殊的计时器。它在硬件层面上实现了一个简单的计时器功能,用于监视系统的运行状态。

独立看门狗会在初始化时设定一个计数器的初始值,并开始倒计时。当程序在规定的时间内喂狗(重新加载计数器),计时器会重置并继续倒计时。如果在一段时间内未喂狗,计时器会溢出,系统会被认为处于异常状态,触发相应的操作,例如重置系统。

尽管独立看门狗可以被视为一种计时器,但它与通用定时器(比如STM32中的TIM定时器)有所不同。独立看门狗的设计目的主要是用于系统的监控和保护,而不是用于实现复杂的定时功能。它通常具有固定的计时周期,且不具备定时器常见的各种工作模式和功能。

README

这个实验用到了串口的代码(见上几篇)。一个芯片的独立看门狗的代码写好了之后,基本不用怎么修改,做项目时就添加一下,防止程序跑飞,就ok~要求不高的小项目有没有它都不要紧吧?

 

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

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

相关文章

2024 年 15 个最佳自动化 UI 测试工具【建议收藏】

Web 开发行业正在不断发展&#xff0c;许多最佳自动化 UI 测试工具可用于测试基于 Web 的项目&#xff0c;以确保它没有错误并且每个用户都可以轻松访问。这些工具可帮助您测试您的 Web 项目并使其完全兼容用户端的要求和需求。 UI 自动化测试工具可测试基于 Web 的应用程序或软…

JRT菜单

上一章搭建了登录界面的雏形和抽取了登录接口。给多组使用登录和菜单功能提供预留&#xff0c;做到不强行入侵别人业务。任何产品只需要按自己表实现登录接口后配置到容器即可共用登录界面和菜单部分。最后自己的用户关联到JRT角色表即可。 登录效果 这次构建菜单体系 首先用…

Transformer的前世今生 day09(Transformer的框架概述)

前情提要 编码器-解码器结构 如果将一个模型分为两块&#xff1a;编码器和解码器那么编码器-解码器结构为&#xff1a;编码器负责处理输入&#xff0c;解码器负责生成输出流程&#xff1a;我们先将输入送入编码器层&#xff0c;得到一个中间状态state&#xff0c;并送入解码器…

号码采集协议讲解

仅供学习研究交流使用 需要的进去拿源码或者成品

上位机图像处理和嵌入式模块部署(qmacvisual图像拼接)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 qmacvisual本身提供了图像拼接的功能。功能本身比较有意思的。大家如果拍过毕业照&#xff0c;特别是那种几百人、上千人的合照&#xff0c;应该就…

Rust编程(二)语法和数据类型

编程规范 类C语法&#xff0c;函数需要定义&#xff0c;指令需要以&#xff1b;结尾。需要大括号{} 文件名&#xff0c;变量&#xff0c;函数命名使用snake case&#xff0c;eg&#xff1a;new_function() 结构体&#xff0c;特征命名&#xff0c;使用大驼峰命名&#xff0c;e…

微信小程序商城构建全栈应用

今天&#xff0c;将之前大学朋友分享给我的好几个小程序内容&#xff0c;简单的从百度网盘下载了一下&#xff0c;重新回顾小程序内容&#xff0c;重新构建融合一些不同语言的元素。下面是网盘的简单截图。 我先挑选了一个微信小程序商城项目&#xff0c;简单看了看&#xff0…

中霖教育:不是会计专业能参加24年的中级会计师考试吗?

经常有很多同学问&#xff1a;我不是会计专业的能报中级会计师考试吗? 先来看报名需要满足的必要条件&#xff1a; 1、大学专科学历&#xff0c;从事会计工作满5年。 2、大学本科学历或学士学位&#xff0c;从事会计工作满4年。 3、第二学士学位或研究生班毕业&#xff0c…

Rust编程(三)生命周期与异常处理

生命周期 生命周期&#xff0c;简而言之就是引用的有效作用域。在大多数时候&#xff0c;我们无需手动的声明生命周期&#xff0c;因为编译器可以自动进行推导。生命周期的主要作用是避免悬垂引用&#xff0c;它会导致程序引用了本不该引用的数据&#xff1a; {let r;{let x …

Partisia Blockchain:真正做到兼顾隐私、高性能和可拓展的公链

目前&#xff0c;包括 Secret Network、Oasis Protocol 等在内的绝大多数以隐私为特性的可编程公链&#xff0c;在兼顾隐私的同时&#xff0c;在可拓展以及性能上或多或少的有所牺牲&#xff0c;即难以对诸多实际应用场景进行支撑。这归咎于链的设计以及共识机制的不合理&#…

袁志佳:前端全栈工程师精英班

教程介绍 本套课程涵盖大前端的全部领域&#xff0c;并对传统的Web前端全栈深入教学。如利用前端知识开发 AI、VR、AR、iOS、Android、PC、Server、智能硬件。 同时我们将核心打造 JavaScript语言新发展、Vue源码分析、前端持续集成方案汇总、MV*框架深度分析 、前端图形学、N…

Python爬虫如何快速入门

写了几篇网络爬虫的博文后&#xff0c;有网友留言问Python爬虫如何入门&#xff1f;今天就来了解一下什么是爬虫&#xff0c;如何快速的上手Python爬虫。 一、什么是网络爬虫 网络爬虫&#xff0c;英文名称为Web Crawler或Spider&#xff0c;是一种通过程序在互联网上自动获取…

目前2024年腾讯云4核8G服务器租用优惠价格表

2024年腾讯云4核8G服务器租用优惠价格&#xff1a;轻量应用服务器4核8G12M带宽646元15个月&#xff0c;CVM云服务器S5实例优惠价格1437.24元买一年送3个月&#xff0c;腾讯云4核8G服务器活动页面 txybk.com/go/txy 活动链接打开如下图&#xff1a; 腾讯云4核8G服务器优惠价格 轻…

虚拟机如何在原有磁盘上扩容

虚拟机未开启状态–菜单栏–虚拟机–快照–拍摄快照–拍摄快照– 菜单栏–虚拟机–快照–快照管理器–点击刚刚的快照1–删除–是– 文件–新建或者打开–硬盘&#xff08;以本人Win 10.64.3GL为例&#xff09;–虚拟机设置–硬件– 硬盘&#xff08;SATA&#xff09;–磁盘实…

Git基础(24):分支回退

文章目录 前言放弃已修改的内容分支回退到指定commit 前言 将分支回退到之前的某个版本 开发中&#xff0c;可能开发某个功能不需要了&#xff0c;或者想要回退到之前历史的某个commit&#xff0c; 放弃后来修改的内容。 放弃已修改的内容 如果未提交&#xff0c;直接使用 …

二分算法的变种----查找递增可重复数组边界

public class test {//数组长度a,b,c为8,d为7&#xff1b;static int[] a {3,5,8,8,8,9,9,10};static int[] b {8,8,8,8,8,8,8,8};static int[] c {0,0,0,0,0,0,0,0};static int[] d {0,0,0,0,0,0,0};public static void main(String[] args) {int target 0;System.out.pr…

Windows下pycharm配置QtDesigner、PyUic、PyRcc

前言&#xff1a; 在配置QtDesigner、PyUic、PyRcc之前&#xff0c;咱们先了解一下这三个工具在PyQt5里面的作用 Qt Designer、PyUIC、PyRCC 在 PyQt5 开发中扮演着重要的角色&#xff0c;它们分别用于设计界面、将设计的界面转换为 Python 代码以及管理资源文件。下面将详细解…

Python性能测试框架Locust实战教程

01、认识Locust Locust是一个比较容易上手的分布式用户负载测试工具。它旨在对网站&#xff08;或其他系统&#xff09;进行负载测试&#xff0c;并确定系统可以处理多少个并发用户&#xff0c;Locust 在英文中是 蝗虫 的意思&#xff1a;作者的想法是在测试期间&#xff0c;放…

使用IDEA的反编译插件 反编译jar包

反编译插件介绍 安装IDEA后, 一般自带反编译插件, Java Bytecode Decompiler 如果没有可以自己安装下 1.首先找到插件的jar包, 在IDEA安装目录的plugins文件夹下 D:\IntelliJ IDEA 2021.2.2\plugins\java-decompiler\lib 2.运行java命令, 指定插件的jar包目录和你要反编译的ja…

C语言从入门到实战----数据在内存中的存储

1. 整数在内存中的存储 在讲解操作符的时候&#xff0c;我们就讲过了下⾯的内容&#xff1a; 整数的2进制表⽰⽅法有三种&#xff0c;即 原码、反码和补码 有符号的整数&#xff0c;三种表⽰⽅法均有符号位和数值位两部分&#xff0c;符号位都是⽤0表⽰“正”&#xff0c;⽤…