STM32: uso detallado del perro guardián independiente (IWDG)

1. Conocimientos básicos de perro guardián independiente (IWDG)

1. Introducción a IWDG

  • El perro guardián independiente es impulsado por un bus de baja velocidad dedicado, es decir, el bus LSI (frecuencia de reloj de 40 KHz ), que aún puede funcionar en el caso de una falla del reloj principal.
  • El perro guardián independiente es adecuado para aplicaciones que requieren que el perro guardián trabaje de forma completamente independiente fuera del programa principal y requieren poca precisión de tiempo.

2. Descripción de la función IWDG

Escriba 0xCCCC en el registro de valor clave ( IWDG_KR ) para iniciar el perro guardián independiente. En este momento, el contador comienza a disminuir desde su valor de reinicio 0xFFF, y se genera una señal de reinicio ( IWDG_RESET ) cuando el valor del contador cuenta hasta el valor final 0x000 .
Siempre que escriba 0xAAAA en el registro de valor clave IWDG_KR (generalmente denominado alimentar al perro), el valor en el registro de recarga automática IWDG_RLR se volverá a cargar en el contador para evitar un reinicio del perro guardián.
Si el programa es anormal, el perro no puede alimentarse normalmente y el sistema se reinicia.

3. Registro IWDG

La introducción del registro IWDG en el Manual de referencia chino STM32 es la siguiente:
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

4. Tiempo de espera de IWDG

La introducción del tiempo de espera de IWDG en el Manual de referencia chino STM32 es la siguiente:
Inserte la descripción de la imagen aquí

  • Cálculo del tiempo de desbordamiento: Tout = ((4 * 2 ^ prer ) * rlr ) / 40 (ms)
    • prer : Coeficiente de preescalador: 0 ~ 7 (solo los 3 bits inferiores son válidos), establecido por el registro de preescalador (IWDG_PR).
    • rlr : valor del registro de recarga (IWDG_RLR) (los 11 bits inferiores son válidos).

En segundo lugar, la implementación del programa de vigilancia independiente (IWDG)

1. Funciones de biblioteca relacionadas con 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. Programa de control de 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();//重装载初值									   
}

C Principal

#include "stm32f10x.h"

#include "iwdg.h"

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

Supongo que te gusta

Origin blog.csdn.net/MQ0522/article/details/111194940
Recomendado
Clasificación