stm32 WDG看门狗

目录

stm32 WDG看门狗

一、WDG基础知识

1)WDG(Watchdog)看门狗简介

  • 看门狗可以监控程序的运行状态,当程序因为设计漏洞、硬件故障、电磁干扰等原因,出现卡死或跑飞现象时,看门狗能及时复位程序,避免程序陷入长时间的罢工状态,保证系统的可靠性和安全性
  • 看门狗本质上是一个定时器,当指定时间范围内,程序没有执行喂狗(重置计数器)操作时,看门狗硬件电路就自动产生复位信号
  • STM32内置两个看门狗
    1. 独立看门狗(IWDG):独立工作,对时间精度要求较低
    2. 窗口看门狗(WWDG):要求看门狗在精确计时窗口起作用
  • 独立看门狗框图
  • 看门狗功能处于VDD供电区,即在停机和待机模式时仍能正常工作

二、IWDG独立看门狗

1)IWDG键寄存器

  • 键寄存器本质上是控制寄存器,用于控制硬件电路的工作
  • 在可能存在干扰的情况下,一般通过在整个键寄存器写入特定值来代替控制寄存器写入一位的功能,以降低硬件电路受到干扰的概率

2)IWDG超时时间

  • 超时时间:TIWDG = TLSI x PR预分频系数 x (RL + 1)
  • 其中:TLSI = 1 / FLSI

三、WWDG窗口看门狗

1)WWDG框图

2)WWDG工作特性

  • 递减计数器T[6:0]的值小于0x40时,WWDG产生复位
  • 递减计数器T[6:0]在窗口W[6:0]外被重新装载时,WWDG产生复位
  • 递减计数器T[6:0]等于0x40时可以产生早期唤醒中断(EWI)(死前中断),用于重装载计数器以避免WWDG复位
  • 定期写入WWDG_CR寄存器(喂狗)以避免WWDG复位

3)WWDG超时时间

  • 超时时间:TIWDG = TPCLK1 x 4096 x WDGTBB预分频系数 x (T[5:0] + 1)
  • 窗口时间:TWIN = TPCLK1 x 4096 x WDGTBB预分频系数 x (T[5:0] - W[5:0])
  • 其中:TPCLK1 = 1 / FPCLK1

4)IWDG和WWDG对比

  • 其他详细信息见STM32Fx手册

四、实验

1)独立看门狗

  • 关键代码:

    复制代码
    	int main(void){
    	
    	OLED_Init();
    	Key_Init();
    	
    	OLED_ShowString(1, 1, "IWDG Test");
    	
    	if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST) == SET)
    	{
    		OLED_ShowString(2, 1, "IWDGSET");
    		Delay_ms(500);
    		OLED_ShowString(2, 1, "       ");
    		Delay_ms(100);
    		
    		RCC_ClearFlag();
    	}
    	else
    	{
    		OLED_ShowString(3, 1, "RST");
    		Delay_ms(500);
    		OLED_ShowString(3, 1, "   ");
    		Delay_ms(100);
    	}
    	
    	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
    	IWDG_SetPrescaler(IWDG_Prescaler_16);
    	IWDG_SetReload(2499); //1000ms
    	IWDG_ReloadCounter();
    	IWDG_Enable();
    
    	while (1)
    	{
    		Key_GetNum();
    		
    		IWDG_ReloadCounter();
    		
    		OLED_ShowString(4, 1, "FEED");
    		Delay_ms(200);
    		OLED_ShowString(4, 1, "     ");
    		Delay_ms(600);
    	}
    }

2)窗口看门狗

  • 关键代码:

    复制代码
    	int main(void){
    	
    	OLED_Init();
    	Key_Init();
    	
    	OLED_ShowString(1, 1, "WWDG Test");
    	
    	if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST) == SET)
    	{
    		OLED_ShowString(2, 1, "WWDGSET");
    		Delay_ms(500);
    		OLED_ShowString(2, 1, "       ");
    		Delay_ms(100);
    		
    		RCC_ClearFlag();
    	}
    	else
    	{
    		OLED_ShowString(3, 1, "RST");
    		Delay_ms(500);
    		OLED_ShowString(3, 1, "   ");
    		Delay_ms(100);
    	}
    	
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
    	WWDG_SetPrescaler(WWDG_Prescaler_8);
    	WWDG_SetWindowValue(0x40 | 21);
    	WWDG_Enable(0x40 | 54);
    	
    
    	while (1)
    	{
    		Key_GetNum();
    		
    		OLED_ShowString(4, 1, "FEED");
    		Delay_ms(20);
    		OLED_ShowString(4, 1, "     ");
    		Delay_ms(20);
    		
    		WWDG_SetCounter(0x40 | 54);
    	}
    }

附学习参考网址

  1. STM32入门教程-2023版 细致讲解 中文字幕

欢迎大家有问题评论交流 (* ^ ω ^)

相关推荐
小叶子来了啊25 分钟前
1Arduino 简介
单片机·嵌入式硬件
渡我白衣1 小时前
计算机组成原理(7):定点数的编码表示
汇编·人工智能·嵌入式硬件·网络协议·机器学习·硬件工程
雾岛听风眠1 小时前
电路板维修
单片机·嵌入式硬件
少一倍的优雅1 小时前
hi3863(WS63) 智能小车 (一) 简单介绍
单片机·嵌入式硬件·harmonyos·hi3863
Dillon Dong2 小时前
从C到Simulink:用Counter模块玩转嵌入式定时器
c语言·stm32·simulink
Vizio<2 小时前
STM32HAL库开发笔记-串口通信(UART)
笔记·stm32·嵌入式硬件
小幽余生不加糖2 小时前
步进电机、有刷直流电机以及无刷直流电机对比
笔记·单片机·嵌入式硬件·学习·能源
加成BUFF2 小时前
树莓派5-TB6612电机驱动模块完整实战教程
嵌入式硬件·pwm·树莓派5·tb6612·pwm波控制电机
DuanPenghao2 小时前
RISCV实战:实现基于Verilator模拟蜂鸟E203的加法器和卷积神经网络仿真
人工智能·嵌入式硬件·神经网络·cnn·risc-v
x976662 小时前
使用 HMAC-SHA256算法对MCU UID进行加密
单片机·嵌入式硬件·算法