stm32独立看门狗

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44951165/article/details/102642410

什么是看门狗:

         是一种专门用于监测单片机程序运行状态的模块或芯片,俗称“看门狗”。

为什么需要看门狗:

         在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到外界电磁场的干扰,造成程序的跑飞,陷入死循环,程序不正常运行,导致由单片机控制的系统无法继续工作,所以为了对单片机运行状态的实时监测,产生了“看门狗“。

什么叫做跑飞

         程序跑飞是指系统受到某种干扰后,程序计数器PC的值偏离了给定的唯一变化历程,导致程序运行偏离正常的运行路径.程序跑飞因素及后果往往是不可预计的.在很多情况下,程序跑飞后系统会进入死循环而导致死机 。
         这种情况称为程序跑飞.程序跑飞后的去向有两种可能.一种可能是转入某种无意义的循环中而出不来.另一种可能是PC值不断增大当PC值增大到0xFFFFH值之后转为执行地址从0x0000H开始的程序相当于重新启动控制程序。

                                                                        ——来源搜狗百科

看门狗要解决什么问题:

1.在程序启动正常运行的时候,系统不能复位。
2.在系统跑飞时,系统复位,程序重新执行。

独立看门狗

独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。
IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。

功能描述:

在这里插入图片描述
         在键寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值0xFFF递减计数。当计数器计数到末尾0x000时,会产生一个复位信号(IWDG_RESET)。无论何时,只要在键寄存器IWDG_KR中写入0xAAAA, IWDG_RLR中的值就会被重新加载到计数器,从而避免产生看门狗复位 。在stm32不完全手册第更加详细的介绍会在第十章实验讲到。

应该如何应用:

         单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环, 看门狗电路就是为了避免这种情况的发生。 看门狗的作用就是在一定时间内(通过定时计数器实现) 没有接收喂狗信号(表示 MCU 已经挂了),便实现处理器的自动复位重启(发送复位信号)。
         比如一个程序正常运行的时间是100ms,在运行完这个段程序之后紧接着进行喂狗,我们设置独立看门狗的定时溢出时间为120ms,比我们需要监控的程序 100ms 多一点,如果超过 120ms 还没有喂狗,那就说明我们监控的程序出故障了,跑飞了,那么就会产生系统复位,让程序重新运行。

int main()
{
		看门狗初始化;//调用初始化函数
		while(1)
		{
			被监测的代码段;
			喂狗;//调用喂狗函数
		}
}

以下代码具体介绍其如何配置:

void IWDG_Init(u8 prer,u16 rlr) 
{
	IWDG->KR=0X5555;//使能对IWDG->PR和IWDG->RLR的写		 										  
  	IWDG->PR=prer;  //设置分频系数   
  	IWDG->RLR=rlr;  //重加载寄存器 IWDG->RLR  Tout=((4×2^prer) ×rlr) /40
  	//Tout即喂狗溢出时间,若超出时间,则表示异常										   
  	IWDG->KR=0XCCCC;//使能看门狗	
}
//喂独立看门狗
void IWDG_Feed(void)
{
	IWDG->KR=0XAAAA;//reload,将IWDG->RLR 的值给递减计数器											   
}

具体详情可查阅stm32不完全手册。

以上就是本人对独立看门狗的理解,如有不当之处,还请之处。

猜你喜欢

转载自blog.csdn.net/weixin_44951165/article/details/102642410