WDG_STM32

一、WDG简介

  • WDG(Watchdog)看门狗
  • 看门狗可以监控程序的运行状态,当程序因为设计漏洞、硬件故障、电磁干扰等原因,出现卡死或跑飞现象时,看门狗能及时复位程序,避免程序陷入长时间的罢工状态,保证系统的可靠性和安全性。
  • 看门狗本质上是一个定时器,当指定时间范围内,程序没有执行喂狗(重置计数器)操作时,看门狗硬件电路就自动产生复位信号。
  • STM32内置两个看门狗
    独立看门狗(IWDG):独立工作(时钟专用),对时间精度要求较低,只要求最晚不超过一定时间喂狗。
    窗口看门狗(WWDG):要求看门狗在精确计时窗口喂狗。

二、基本结构

2.1 IWDG

WDG_STM32_第1张图片

  • IWDG原理:自减定时器,键寄存器用于重装计数器(喂狗);当一直没有喂狗,计数器自减为0时,执行复位;
  • 键寄存器本质上是控制寄存器,用于控制硬件电路的工作。写入整个键寄存器而不是只用一位来控制,用于降低干扰影响。
    WDG_STM32_第2张图片

2.2 WWDG

WDG_STM32_第3张图片

  • 6位递减计数器,第七位为溢出标志位;T6为0,表示溢出,产生复位信号。
  • WDGA为使能位。
  • WWDG_CFR用于配置喂狗最早时间,若递减计数器在CFR之前被重装,产生复位信号。
  • T6为1,但CNT已经为0时(再减一就溢出),可以产生早期唤醒中断EWI,用于WWDG避免复位。
  • 需要在指定时间内写入WWDG_CR(喂狗),防止产生复位信号。

2.3 IWDG与WWDG对比

WDG_STM32_第4张图片


三、看门狗配置

IWDG

'开启IWDG后,其时钟LSI会自动开启'

'1. 配置预分频器、自动重装器'
IWDG_WriteAccessCmd(ENABLE);	// 配置之前需要先解除写保护
IWDG_SetPrescaler(16);			// 配置预分频器
IWDG_SetReload(2499);			// 配置自动重装值
// 超时时间=LSI时钟间隔 * 预分频器系数 * (自动重装值+1) = 1000ms
// LSI时钟间隔为0.025ms
IWDG_ReloadCounter();			// 配置完后先喂一次狗
'2. 启动IWDG'
IWDG_Enable();			// 启动看门狗
'3. 不断喂狗'
while(1)
{
	IWDG_ReloadCounter();
	Delay_us(800);
}

WWDG

'1. 开启RCC时钟'
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
'2. 配置预分频器、窗口值'
// WWDG没有写保护
WWDG_SetPrescaler(WWDG_Prescaler_8);// 写入预分频值
WWDG_SetWindowValue(0x40 | 21);// 写入窗口值,W6也需要置1
// 超时时间 = PCLK1时钟间隔 * 4096 * 预分频系数 * (喂狗值T[5:0]+1)
// 最早时间 = PCLK1时钟间隔 * 4096 * 预分频系数 * (喂狗值T[5:0] - 窗口值)
'3. 使能WWDG'
WWDG_Enable(0x40 | 54);// 使能,同时喂一下狗
// T6位溢出标志位需要是1,即0x40;54为喂狗值
// WDGA位不会被影响
'4. 不断喂狗'
while(1)
{
	Delay_ms(40);
	WWDG_SetCounter(0x40 | 54);
}

四、基本库函数

IWDG

void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);
		// 写使能,解除写保护
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);
		// 写预分频器
void IWDG_SetReload(uint16_t Reload);
		// 写自动重装值
void IWDG_ReloadCounter(void);
		// 重新装载,即喂狗
void IWDG_Enable(void);
		// 启动IWDG
FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG);
		// 获取标志位

WWDG

void WWDG_DeInit(void);
		// 复位函数
void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);
		// 写预分频器
void WWDG_SetWindowValue(uint8_t WindowValue);
		// 写窗口值
void WWDG_EnableIT(void);
		// 使能中断
void WWDG_SetCounter(uint8_t Counter);
		// 写入计数器,喂狗
void WWDG_Enable(uint8_t Counter);
		// 使能WWDG,并且使能同时喂一下狗
FlagStatus WWDG_GetFlagStatus(void);
		// 获取标志位
void WWDG_ClearFlag(void);
		// 清除标志位
'rcc.h中的函数'
FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);
		// 参数为RCC_IWDGRST时,可以获取IWDG复位信号的标志位
		// 参数为RCC_WWDGRST时,可以获取IWDG复位信号的标志位
void RCC_ClearFlag(void);

Reference
STM32入门教程-2023版(江科大)

你可能感兴趣的:(stm32,嵌入式硬件,单片机)