你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

正点原子STM32F103(精英版)------独立看门狗

2021/12/1 21:15:42

一、独立看门狗概述

为什么要看门狗?

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

看门狗解决什么问题?

在启动正常运行的时候,系统不能复位。

在系统跑飞(程序异常执行)的情况,系统复位,程序重新执行。

两个看门狗设备(独立看门狗/窗口看门狗)

可以用来检测和解决由软件错误引起的故障。当计数器达到给定的超时值时,触发一个中断(仅适用窗口看门狗)或者产生系统复位。

独立看门狗( IWDG) 由专用的低速时钟( LSI) 驱动,即使主时钟发生故障它仍有效。

  独立看门狗

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

   窗口看门狗

由从 APB1 时钟分频后得到时钟驱动。通过可配置的时间窗口来检测应用程序非正常的过迟或过早操作。 

   窗口看门狗最适合那些要求看门狗在精确计时窗口起作用的程序。

独立看门狗功能描述

在键值寄存器( IWDG_KR) 中写入 0xCCCC ,开始启用独立看门狗。此时计数器开始从其复位值 0xFFF 递减,当计数器值计数到尾值 0x000 时会产生一个复位信号( IWDG_RESET)
无论何时,只要在键值寄存器 IWDG_KR 中写入 0xAAAA (通常说的喂狗) , 自动重装载寄存器 IWDG_RLR 的值就会重新加载到计数器,从而避免看门狗复位。
如果程序异常,就无法正常喂狗,从而系统复位。

键值寄存器 IWDG_KR: 0~15 位有效

预分频寄存器 IWDG_PR 0~2 位有效。 具有写保护功能,要操作先取消写保护

重装载寄存器 IWDG_RLR 0~11 位有效。 具有写保护功能,要操作先取消写保护。

状态寄存器 IWDG_SR 0~1 位有效

独立看门狗超时时间

溢出时间计算:

   Tout=((4×2^prer) ×rlr) /40 M3)

时钟频率LSI=40K, 一个看门狗时钟周期就是最短超时时间。

最长超时时间= (IWDG_RLR寄存器最大值)X看门狗时钟周期

IWDG独立看门狗操作库函数

void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);//取消写保护:0x5555使能

void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);//设置预分频系数:写PR

void IWDG_SetReload(uint16_t Reload);//设置重装载值:写RLR

void IWDG_ReloadCounter(void);//喂狗:0xAAAAKR

void IWDG_Enable(void);//使能看门狗:写0xCCCCKR

FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG);//状态:重装载/预分频 更新

独立看门狗操作步骤

取消寄存器写保护:

      IWDG_WriteAccessCmd();

②  设置独立看门狗的预分频系数,确定时钟:

     IWDG_SetPrescaler();

③  设置看门狗重装载值,确定溢出时间:

    IWDG_SetReload();

④  使能看门狗

    IWDG_Enable();

⑤  应用程序喂狗:

   IWDG_ReloadCounter();

溢出时间计算:

   Tout=((4×2^prer) ×rlr) /40 M3)

独立看门狗一般用来检测和解决由程序引起的故障,比如一个程序正常运行的时间是50ms,在运行完这个段程序之后紧接着进行喂狗,我们设置独立看门狗的定时溢出时间为60ms,比我们需要监控的程序 50ms 多一点,如果超过 60ms 还没有喂狗,那就说明我们监控的程序出故障了,跑飞了,那么就会产生系统复位,让程序重新运行。

独立看门狗实验

设置时间1s,  若按下按键WK_UP,就进入循环,一直喂狗,LED0一直亮,否则退出循环,延时函数200ms,LED0闪烁。

iwdg.c
#include "iwdg.h"


void IWDG_Init(u8 prer,u16 rlr)
{
	//取消寄存器写保护:
	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
	//设置独立看门狗的预分频系数,确定时钟:
	IWDG_SetPrescaler(prer);
	//设置看门狗重装载值,确定溢出时间:
	IWDG_SetReload(rlr);
		//应用程序喂狗:
	IWDG_ReloadCounter();
	//使能看门狗
	IWDG_Enable();

}


main.c

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
//#include "beep.h"
#include "iwdg.h"
 
 
/************************************************
 ALIENTEK精英STM32开发板实验3
 按键输入实验     
 技术支持:www.openedv.com
 淘宝店铺:http://eboard.taobao.com 
 关注微信公众平台微信号:"正点原子",免费获取STM32资料。
 广州市星翼电子科技有限公司  
 作者:正点原子 @ALIENTEK
************************************************/

 int main(void)
 {
 	vu8 key=0;	
	delay_init();	    	 //延时函数初始化	  
	LED_Init();		  		//初始化与LED连接的硬件接口
//	BEEP_Init();         	//初始化蜂鸣器端口
	KEY_Init();         	//初始化与按键连接的硬件接口
	
	 
	 delay_ms(200);
	 LED0=0;					//先点亮红灯
	 IWDG_Init(4,625);
//1s     公式   Tout=((4×2^prer) ×rlr) /40   Tout以ms为单位,prer=4,  rlr=625
	 
	 while(1)
	 {
		 if(KEY_Scan(0)==WKUP_PRES)
		 {
			 IWDG_ReloadCounter();
		 }
	 }
		 
	
}