独立看门狗

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

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

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

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

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

 

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

iwdg.c

#include "iwdg.h"


void Iwdg_Init(void)
{
	//1、 取消寄存器写保护:
	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
	//2、设置独立看门狗的预分频系数,确定时钟:32KHZ/128 = 250HZ
	IWDG_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~要求不高的小项目有没有它都不要紧吧?

 

  • 34
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值