STM32:独立看门狗(IWDG)用法详解

一、独立看门狗(IWDG)基本知识

1. IWDG简介

  • 独立看门狗是由专门的低速总线进行驱动,即LSI总线(时钟频率40KHz),它可以在主时钟故障的情况下仍然可以工作。
  • 独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。

2. IWDG功能描述

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

3. IWDG寄存器

STM32中文参考手册中关于IWDG寄存器的介绍如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4. IWDG超时时间

STM32中文参考手册中关于IWDG超时时间的介绍如下:
在这里插入图片描述

  • 溢出时间计算: Tout=((4*2^prer)*rlr)/40 (ms)
    • prer:预分频系数:0~7(只有低3位有效),由预分频寄存器(IWDG_PR)设置。
    • rlr:重装载寄存器(IWDG_RLR)值(低11位有效)。

二、独立看门狗(IWDG)程序实现

1. 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);			//喂狗:写0xAAAA到KR
void IWDG_Enable(void);				//使能看门狗:写0xCCCC到KR

2. IWDG控制程序

iwdg.h

#ifndef __IWDG_H
#define __IWDG_H	
 
#include "stm32f10x.h"

void IWDG_Init(u8 prer,u16 rlr) ;
void IWDG_Feed(void);

#endif

iwdg.c

#include "iwdg.h"

/*******************************************************************************
* 函 数 名         : IWDG_Init
* 函数功能		   : IWDG初始化
* 输    入         : pre:预分频系数(0-6)
					 rlr:重装载值(12位范围0xfff)
					 独立看门狗复位时间计算公式:t=(4*2^pre*rlr)/40 (ms)
* 输    出         : 无
*******************************************************************************/
void IWDG_Init(u8 prer,u16 rlr) 
{
    
    	
 	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);  	//使能对寄存器IWDG_PR和IWDG_RLR的写操作,即取消写保护
	IWDG_SetPrescaler(prer);  					//设置IWDG预分频值
	IWDG_SetReload(rlr);  					//设置IWDG重装载值
	IWDG_ReloadCounter();  				//按照IWDG重装载寄存器的值重装载IWDG计数器
	IWDG_Enable();  				//使能IWDG
}

//喂独立看门狗
void IWDG_Feed(void)
{
    
       
 	IWDG_ReloadCounter();//重装载初值									   
}

main.c

#include "stm32f10x.h"

#include "iwdg.h"

int main()
{
    
    
	/**
	其它初始化省略
	**/
	IWDG_Init(IWDG_Prescaler_64,625);		//独立看门狗初始化,超时时间1s
	
	while(1)
	{
    
    
		/**
		其它程序省略
		如果其中程序的运行时间超过1s,需要在其中添加喂看门狗函数 IWDG_Feed();
		**/
		IWDG_Feed();	//喂看门狗
	}
}

猜你喜欢

转载自blog.csdn.net/MQ0522/article/details/111194940