首页 > 其他分享 >stm32 WDG看门狗(独立看门狗&窗口看门狗)

stm32 WDG看门狗(独立看门狗&窗口看门狗)

时间:2024-09-20 19:49:45浏览次数:3  
标签:Delay IWDG ShowString WDG 看门狗 stm32 OLED WWDG

理论

WDG

WDG(Watchdog)看门狗

看门狗可以监控程序的运行状态,当程序因为设计漏洞、硬件故障、电磁干扰等原因,出现卡死或跑飞现象时,看门狗能及时复位程序,避免程序陷入长时间的罢工状态,保证系统的可靠性和安全性

看门狗本质上是一个定时器,当指定时间范围内,程序没有执行喂狗(重置计数器)操作时,看门狗硬件电路就自动产生复位信号

STM32内置两个看门狗

    独立看门狗(IWDG):独立工作,对时间精度要求较低  

    窗口看门狗(WWDG):要求看门狗在精确计时窗口起作用

IWDG

IWDG框图

在每次进行写入操作时要进行写保护的解除,才可以进行写入操作

RLR写入的值是固定的

IWDG键寄存器

键寄存器本质上是控制寄存器,用于控制硬件电路的工作

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

 IWDG超时时间

超时时间:TIWDG = TLSI × PR预分频系数 × (RL + 1)

其中:TLSI = 1 / FLSI

 WWDG

WWDG框图

T6作用查看是否由1变为0,如果变为0则发生复位(图下T6)

WWDG工作特性

递减计数器T[6:0]的值小于0x40时,WWDG产生复位

递减计数器T[6:0]在窗口W[6:0]外被重新装载时,WWDG产生复位

递减计数器T[6:0]等于0x40时可以产生早期唤醒中断(EWI),用于重装载计数器以避免WWDG复位

定期写入WWDG_CR寄存器(喂狗)以避免WWDG复位

WWDG超时时间

超时时间:

    TWWDG = TPCLK1 × 4096 × WDGTB预分频系数 × (T[5:0] + 1)

窗口时间:

    TWIN = TPCLK1 × 4096 × WDGTB预分频系数 × (T[5:0] - W[5:0]) 其中:TPCLK1 = 1 / FPCLK1

IWDG和WWDG对比

API学习

WWDG

WWDG_SetPrescaler

void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);
/*
 *写入WWDG的预分频值
 */

WWDG_SetWindowValue

void WWDG_SetWindowValue(uint8_t WindowValue);
/*
 *写入WWDG窗口值
 */

WWDG_SetCounter

void WWDG_SetCounter(uint8_t Counter);
/*
 *喂狗
 */

WWDG_Enable

void WWDG_Enable(uint8_t Counter);
/*
 *使能WWDG
 */

IWDG

 IWDG_WriteAccessCmd

void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);
/*
 *解除写保护
 */

 IWDG_SetPrescaler

void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);
/*
 *写入IWDG预分频
 */

IWDG_SetReload

void IWDG_SetReload(uint16_t Reload);
/*
 *写入IWDG的重装值
 */

IWDG_ReloadCounter

void IWDG_ReloadCounter(void);
/*
 *喂狗
 */

 IWDG_Enable

void IWDG_Enable(void);
/*
 *IWDG使能
 */

代码

独立看门狗

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Key.h"

int main(void)
{
	/*模块初始化*/
	OLED_Init();						//OLED初始化
	Key_Init();							//按键初始化
	
	/*显示静态字符串*/
	OLED_ShowString(1, 1, "IWDG TEST");
	
	/*判断复位信号来源*/
	if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) == SET)	//如果是独立看门狗复位
	{
		OLED_ShowString(2, 1, "IWDGRST");			//OLED闪烁IWDGRST字符串
		Delay_ms(500);
		OLED_ShowString(2, 1, "       ");
		Delay_ms(100);
		
		RCC_ClearFlag();							//清除标志位
	}
	else											//否则,即为其他复位
	{
		OLED_ShowString(3, 1, "RST");				//OLED闪烁RST字符串
		Delay_ms(500);
		OLED_ShowString(3, 1, "   ");
		Delay_ms(100);
	}
	
	/*IWDG初始化*/
	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);	//独立看门狗写使能
	IWDG_SetPrescaler(IWDG_Prescaler_16);			//设置预分频为16
	IWDG_SetReload(2499);							//设置重装值为2499,独立看门狗的超时时间为1000ms
	IWDG_ReloadCounter();							//重装计数器,喂狗
	IWDG_Enable();									//独立看门狗使能
	
	while (1)
	{
		Key_GetNum();								//调用阻塞式的按键扫描函数,模拟主循环卡死
		
		IWDG_ReloadCounter();						//重装计数器,喂狗
		
		OLED_ShowString(4, 1, "FEED");				//OLED闪烁FEED字符串
		Delay_ms(200);								//喂狗间隔为200+600=800ms
		OLED_ShowString(4, 1, "    ");
		Delay_ms(600);
	}
}

窗口看门狗

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Key.h"

int main(void)
{
	/*模块初始化*/
	OLED_Init();						//OLED初始化
	Key_Init();							//按键初始化
	
	/*显示静态字符串*/
	OLED_ShowString(1, 1, "WWDG TEST");
	
	/*判断复位信号来源*/
	if (RCC_GetFlagStatus(RCC_FLAG_WWDGRST) == SET)	//如果是窗口看门狗复位
	{
		OLED_ShowString(2, 1, "WWDGRST");			//OLED闪烁WWDGRST字符串
		Delay_ms(500);
		OLED_ShowString(2, 1, "       ");
		Delay_ms(100);
		
		RCC_ClearFlag();							//清除标志位
	}
	else											//否则,即为其他复位
	{
		OLED_ShowString(3, 1, "RST");				//OLED闪烁RST字符串
		Delay_ms(500);
		OLED_ShowString(3, 1, "   ");
		Delay_ms(100);
	}
	
	/*开启时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);	//开启WWDG的时钟
	
	/*WWDG初始化*/
	WWDG_SetPrescaler(WWDG_Prescaler_8);			//设置预分频为8
	WWDG_SetWindowValue(0x40 | 21);					//设置窗口值,窗口时间为30ms
	WWDG_Enable(0x40 | 54);							//使能并第一次喂狗,超时时间为50ms
	
	while (1)
	{
		Key_GetNum();								//调用阻塞式的按键扫描函数,模拟主循环卡死
		
		OLED_ShowString(4, 1, "FEED");				//OLED闪烁FEED字符串
		Delay_ms(20);								//喂狗间隔为20+20=40ms
		OLED_ShowString(4, 1, "    ");
		Delay_ms(20);
		
		WWDG_SetCounter(0x40 | 54);					//重装计数器,喂狗
	}
}

接线图

独立看门狗

窗口看门狗

标签:Delay,IWDG,ShowString,WDG,看门狗,stm32,OLED,WWDG
From: https://blog.csdn.net/2302_79504723/article/details/142393147

相关文章

  • STM32F407单片机编程入门(九)低功耗模式实战含源码
    文章目录一.概要二.STM32单片机低功耗基本介绍三.STM32F407单片机待机模式介绍四.CubeMX配置一个待机低功耗例程五.CubeMX工程源代码下载六.小结一.概要在生活中通过关掉电器组件可以实现省电节能的目的,同样的道理单片机也可以通过这种方法实现降低功耗。单片机是由......
  • 米尔STM32MP2核心板首发新品上市!高性能+多接口+边缘算力
    米尔发布基于STM32MP257设计的嵌入式处理器模块MYC-LD25X核心板及开发板。核心板基于STM32MP2系列是意法半导体推出最新一代工业级64位微处理器,采用LGA252PIN设计,存储配置1GB/2GBLPDDR4、8GBeMMC,具有丰富的通讯接口,适用于高端工业HMI、边缘计算网关、新能源充电桩、储能EMS系......
  • STM32寄存器,标准库和HAL库编程(浅谈)
    寄存器编程、标准库编程和HAL库编程在嵌入式系统开发中是三种常见的编程方式,它们主要区别在于抽象层次、灵活性和开发效率。以下是对这三种编程方式的详细比较:1.寄存器编程(Register-LevelProgramming)寄存器编程是指直接操作微控制器或处理器的硬件寄存器,以控制外设和执行......
  • VSCode配置STM32HAL库开发环境
    1.开发工具下载下载STM32CubeMX:https://www.st.com.cn/zh/development-tools/stm32cubemx.html(可通过访客方式下载)安装时一直默认即可下载stm32固件库:在线下载方式(需要登陆):安装好STM32CubeMX后,在菜单栏【Help】->【ManageEmbeddedSoftwarePackages】里选择合适的固......
  • 基于STM32的四翼无人机设计
    前言:本博客主要记录了一次设计无人机的流程以及相关知识,由于成本以及本人知识储备,项目较为粗糙,旨在学习与记录,如有错误与建议欢迎指出!!!一,飞控理论知识1,飞控概述飞控(飞行控制系统,FlightControlSystem)是无人机中至关重要的组成部分,负责控制无人机的飞行姿态、航向、速度和......
  • 从0开始的stm32单片机学习之旅 第三章
    查看原理图(以最小系统原理图为例)1通过看引脚名称来判断电路是属于哪个功能的1.1电源管脚:引脚图中的VDD、VSS、VREF+、VREF-、VSSA、VDDA等都属于电源引脚。VDD:VDD是单片机的正电源引脚,用于提供单片机的工作电压。它通常连接到电源供应器的正极。VSS:VSS是单片机的地(GN......
  • STM32的IO口知识点
    一.STM32IO工作模式输出模式:四种推挽输出:p-mos和n-mos均有效、stm32对io口有绝对的控制权,引脚可以输出高低电平(1为高)开漏输出:必须外接上拉电阻才可以输出高电平         p-mos无效只有n-mos有效,只有低电平才有驱动能力,引脚只能输出低电平,可以作   ......
  • STM32F407单片机编程入门(七)USART串口485通讯实战含源码
    文章目录一.概要二.USART串口基本介绍三.STM32单片机USART内部结构图四.USART内部信号流向五.USART示波器信号解析六.485通讯基本概念七.CubeMX配置一个USART数据收发例程进行485通讯实验八.工程源代码下载九.小结一.概要USART(UniversalSynchronous/AsynchronousR......
  • STM32H7 DMA 使用配置 CUbeMX
    突发传输:突发传输在整个传输中过程中,节拍与节拍的传输是连续的 且不会被总线仲裁直到传输结束有利于优化总线的使用带宽。图中需要注意两点:(1)外设处:数据宽度*突发SIZE<=Threshold值(2)内存处:数据宽度*突发SIZE<=Threshold值理解:突发传输,8beat一次 Burst,翻译为8拍一次突发,理解为突......
  • 基于STM32的智能水质监测系统设计
    文章目录前言资料获取设计介绍功能介绍设计程序具体实现截图参考文献设计获取前言......