【STM32】STM32学习笔记-独立看门狗和窗口看门狗(47)

00. 目录

文章目录

    • 00. 目录
    • 01. WDG概述
    • 02. 独立看门狗相关API
      • 2.1 IWDG_WriteAccessCmd
      • 2.2 IWDG_SetPrescaler
      • 2.3 IWDG_SetReload
      • 2.4 IWDG_ReloadCounter
      • 2.5 IWDG_Enable
      • 2.6 IWDG_GetFlagStatus
      • 2.7 RCC_GetFlagStatus
    • 03. 独立看门狗接线图
    • 04. 独立看门狗程序示例1
    • 05. 独立看门狗程序示例2
    • 06. 窗口看门狗相关API
      • 6.1 WWDG_DeInit
      • 6.2 WWDG_SetPrescaler
      • 6.3 WWDG_SetWindowValue
      • 6.4 WWDG_EnableIT
      • 6.5 WWDG_SetCounter
      • 6.6 WWDG_Enable
      • 6.7 WWDG_GetFlagStatus
      • 6.8 WWDG_ClearFlag
    • 07. 窗口看门狗接线图
    • 08. 窗口看门狗程序示例
    • 09. 程序示例代码下载
    • 10. 附录

01. WDG概述

  • WDG(Watchdog)看门狗

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

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

  • STM32内置两个看门狗

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

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

02. 独立看门狗相关API

2.1 IWDG_WriteAccessCmd

/**
  * @brief  Enables or disables write access to IWDG_PR and IWDG_RLR registers.
  * @param  IWDG_WriteAccess: new state of write access to IWDG_PR and IWDG_RLR registers.
  *   This parameter can be one of the following values:
  *     @arg IWDG_WriteAccess_Enable: Enable write access to IWDG_PR and IWDG_RLR registers
  *     @arg IWDG_WriteAccess_Disable: Disable write access to IWDG_PR and IWDG_RLR registers
  * @retval None
  */
void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess)
功能:
	使能或者失能对寄存器 IWDG_PR 和 IWDG_RLR 的写操作
参数:
	IWDG_WriteAccess:对寄存器 IWDG_PR 和 IWDG_RLR 的写操作的新状态
返回值:

2.2 IWDG_SetPrescaler

/**
  * @brief  Sets IWDG Prescaler value.
  * @param  IWDG_Prescaler: specifies the IWDG Prescaler value.
  *   This parameter can be one of the following values:
  *     @arg IWDG_Prescaler_4: IWDG prescaler set to 4
  *     @arg IWDG_Prescaler_8: IWDG prescaler set to 8
  *     @arg IWDG_Prescaler_16: IWDG prescaler set to 16
  *     @arg IWDG_Prescaler_32: IWDG prescaler set to 32
  *     @arg IWDG_Prescaler_64: IWDG prescaler set to 64
  *     @arg IWDG_Prescaler_128: IWDG prescaler set to 128
  *     @arg IWDG_Prescaler_256: IWDG prescaler set to 256
  * @retval None
  */
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler)
功能:
	设置 IWDG 预分频值
参数:
	IWDG_Prescaler:IWDG 预分频值
返回值:

2.3 IWDG_SetReload

/**
  * @brief  Sets IWDG Reload value.
  * @param  Reload: specifies the IWDG Reload value.
  *   This parameter must be a number between 0 and 0x0FFF.
  * @retval None
  */
void IWDG_SetReload(uint16_t Reload)
功能:
	设置 IWDG 重装载值
参数:
	IWDG_Reload:IWDG 重装载值
返回值:

2.4 IWDG_ReloadCounter

/**
  * @brief  Reloads IWDG counter with value defined in the reload register
  *   (write access to IWDG_PR and IWDG_RLR registers disabled).
  * @param  None
  * @retval None
  */
void IWDG_ReloadCounter(void)
功能:
	按照 IWDG 重装载寄存器的值重装载 IWDG 计数器
参数:
	无
返回值:

2.5 IWDG_Enable

/**
  * @brief  Enables IWDG (write access to IWDG_PR and IWDG_RLR registers disabled).
  * @param  None
  * @retval None
  */
void IWDG_Enable(void)
功能:
	使能 IWDG
参数:
	无
返回值:

2.6 IWDG_GetFlagStatus

/**
  * @brief  Checks whether the specified IWDG flag is set or not.
  * @param  IWDG_FLAG: specifies the flag to check.
  *   This parameter can be one of the following values:
  *     @arg IWDG_FLAG_PVU: Prescaler Value Update on going
  *     @arg IWDG_FLAG_RVU: Reload Value Update on going
  * @retval The new state of IWDG_FLAG (SET or RESET).
  */
FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG)
功能:
	检查指定的 IWDG 标志位被设置与否
参数:
	IWDG_FLAG:待检查的 I2C 标志位
返回值:
	IWDG_FLAG 的新状态(SET 或者 RESET)       
    

2.7 RCC_GetFlagStatus

/**
  * @brief  Checks whether the specified RCC flag is set or not.
  * @param  RCC_FLAG: specifies the flag to check.
  *   
  *   For @b STM32_Connectivity_line_devices, this parameter can be one of the
  *   following values:
  *     @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready
  *     @arg RCC_FLAG_HSERDY: HSE oscillator clock ready
  *     @arg RCC_FLAG_PLLRDY: PLL clock ready
  *     @arg RCC_FLAG_PLL2RDY: PLL2 clock ready      
  *     @arg RCC_FLAG_PLL3RDY: PLL3 clock ready                           
  *     @arg RCC_FLAG_LSERDY: LSE oscillator clock ready
  *     @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready
  *     @arg RCC_FLAG_PINRST: Pin reset
  *     @arg RCC_FLAG_PORRST: POR/PDR reset
  *     @arg RCC_FLAG_SFTRST: Software reset
  *     @arg RCC_FLAG_IWDGRST: Independent Watchdog reset
  *     @arg RCC_FLAG_WWDGRST: Window Watchdog reset
  *     @arg RCC_FLAG_LPWRRST: Low Power reset
  * 
  *   For @b other_STM32_devices, this parameter can be one of the following values:        
  *     @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready
  *     @arg RCC_FLAG_HSERDY: HSE oscillator clock ready
  *     @arg RCC_FLAG_PLLRDY: PLL clock ready
  *     @arg RCC_FLAG_LSERDY: LSE oscillator clock ready
  *     @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready
  *     @arg RCC_FLAG_PINRST: Pin reset
  *     @arg RCC_FLAG_PORRST: POR/PDR reset
  *     @arg RCC_FLAG_SFTRST: Software reset
  *     @arg RCC_FLAG_IWDGRST: Independent Watchdog reset
  *     @arg RCC_FLAG_WWDGRST: Window Watchdog reset
  *     @arg RCC_FLAG_LPWRRST: Low Power reset
  *   
  * @retval The new state of RCC_FLAG (SET or RESET).
  */
FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG)
功能:
	检查指定的 RCC 标志位设置与否
参数:
	RCC_FLAG:待检查的 RCC 标志位
返回值:
	RCC_FLAG 的新状态(SET 或者 RESET)   
    

03. 独立看门狗接线图

在这里插入图片描述

04. 独立看门狗程序示例1

main.c

#include "stm32f10x.h"

#include "delay.h"
#include "oled.h"


 int main(void)
 {	

	 
	 
	 //初始化
	 OLED_Init();

	 OLED_ShowString(1, 1, "IWDG TEST");
	 
	 if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) == SET)
	 {
		OLED_ShowString(2, 1, "IWDGRST");
		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);
	 
	 //设置重装载值  1000 = 1 / 40K * 16 * x   x = 2500
	 IWDG_SetReload(2499);
	 
	 
	 //喂狗
	 IWDG_ReloadCounter();
	 
	 //看门狗使能
	 IWDG_Enable();
	 
	 while(1)
	 {
		//喂狗
		IWDG_ReloadCounter();
		delay_ms(1800);
	 }
	 
	 return 0;
 }

05. 独立看门狗程序示例2

main.c

#include "stm32f10x.h"

#include "delay.h"
#include "oled.h"
#include "key.h"


 int main(void)
 {	
	 //初始化
	 OLED_Init();
	 
	 //按键初始化
	 key_init();

	 OLED_ShowString(1, 1, "IWDG TEST");
	 
	 if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) == SET)
	 {
		OLED_ShowString(2, 1, "IWDGRST");
		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);
	 
	 //设置重装载值  1000 = 1 / 40K * 16 * x   x = 2500
	 IWDG_SetReload(2499);
	 
	 //喂狗
	 IWDG_ReloadCounter();
	 
	 //看门狗使能
	 IWDG_Enable();
	 
	 while(1)
	 {
		key_scan();
		 
		//喂狗
		IWDG_ReloadCounter();
		 
	 	OLED_ShowString(4, 1, "FEED");
		delay_ms(200);
		OLED_ShowString(4, 1, "    ");
		delay_ms(600); 
	 }
	 
	 return 0;
 }

06. 窗口看门狗相关API

6.1 WWDG_DeInit

/**
  * @brief  Deinitializes the WWDG peripheral registers to their default reset values.
  * @param  None
  * @retval None
  */
void WWDG_DeInit(void)
功能:
	将外设 WWDG 寄存器重设为缺省值
参数:
	无
返回值:

6.2 WWDG_SetPrescaler

/**
  * @brief  Sets the WWDG Prescaler.
  * @param  WWDG_Prescaler: specifies the WWDG Prescaler.
  *   This parameter can be one of the following values:
  *     @arg WWDG_Prescaler_1: WWDG counter clock = (PCLK1/4096)/1
  *     @arg WWDG_Prescaler_2: WWDG counter clock = (PCLK1/4096)/2
  *     @arg WWDG_Prescaler_4: WWDG counter clock = (PCLK1/4096)/4
  *     @arg WWDG_Prescaler_8: WWDG counter clock = (PCLK1/4096)/8
  * @retval None
  */
void WWDG_SetPrescaler(uint32_t WWDG_Prescaler)
功能:
	设置 WWDG 预分频值值
参数:
	WWDG_Prescaler:指定 WWDG 预分频
返回值:

6.3 WWDG_SetWindowValue

/**
  * @brief  Sets the WWDG window value.
  * @param  WindowValue: specifies the window value to be compared to the downcounter.
  *   This parameter value must be lower than 0x80.
  * @retval None
  */
void WWDG_SetWindowValue(uint8_t WindowValue)
功能:
	设置 WWDG 窗口值
参数:
	WindowValue r:指定的窗口值。该参数取值必须在 0x400x7F 之间。
返回值:

6.4 WWDG_EnableIT

/**
  * @brief  Enables the WWDG Early Wakeup interrupt(EWI).
  * @param  None
  * @retval None
  */
void WWDG_EnableIT(void)
功能:
	使能 WWDG 早期唤醒中断(EWI)
参数:
	无
返回值:

6.5 WWDG_SetCounter

/**
  * @brief  Sets the WWDG counter value.
  * @param  Counter: specifies the watchdog counter value.
  *   This parameter must be a number between 0x40 and 0x7F.
  * @retval None
  */
void WWDG_SetCounter(uint8_t Counter)
功能:
	设置 WWDG 计数器值
参数:
	Counter:指定看门狗计数器值。该参数取值必须在 0x400x7F 之间。
返回值:

6.6 WWDG_Enable

/**
  * @brief  Enables WWDG and load the counter value.                  
  * @param  Counter: specifies the watchdog counter value.
  *   This parameter must be a number between 0x40 and 0x7F.
  * @retval None
  */
void WWDG_Enable(uint8_t Counter)
功能:
	使能 WWDG 并装入计数器值
参数:
	Counter:指定看门狗计数器值。该参数取值必须在 0x400x7F 之间。
返回值:

6.7 WWDG_GetFlagStatus

/**
  * @brief  Checks whether the Early Wakeup interrupt flag is set or not.
  * @param  None
  * @retval The new state of the Early Wakeup interrupt flag (SET or RESET)
  */
FlagStatus WWDG_GetFlagStatus(void)
功能:
	检查 WWDG 早期唤醒中断标志位被设置与否
参数:
	无
返回值:
	早期唤醒中断标志位的新状态(SET 或者 RESET)      
    

6.8 WWDG_ClearFlag

/**
  * @brief  Clears Early Wakeup interrupt flag.
  * @param  None
  * @retval None
  */
void WWDG_ClearFlag(void)
功能:
	清除早期唤醒中断标志位
参数:
	无
返回值:

07. 窗口看门狗接线图

在这里插入图片描述

08. 窗口看门狗程序示例

main.c

#include "stm32f10x.h"

#include "delay.h"
#include "oled.h"
#include "key.h"


 int main(void)
 {	
	 //初始化
	 OLED_Init();
	 
	 //按键初始化
	 key_init();
	 
	 //开启WWDG时钟
	 RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);

	 OLED_ShowString(1, 1, "WWDG TEST");
	 
	 if (RCC_GetFlagStatus(RCC_FLAG_WWDGRST) == SET)
	 {
		OLED_ShowString(2, 1, "WWDGRST");
		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); 
	 }
	 
	//设置预分频
	WWDG_SetPrescaler(WWDG_Prescaler_8);
	 
	 //设置窗口值
	 WWDG_SetWindowValue(21 | 0x40);
	 
	 //使能看门狗
	 WWDG_Enable(0x40 | 54);
	 
	 
	 while(1)
	 {
		key_scan();
		  
	 	OLED_ShowString(4, 1, "FEED");
		delay_ms(10);
		OLED_ShowString(4, 1, "    ");
		delay_ms(10); 
		 
		 //喂狗
		 WWDG_SetCounter(0x40 | 54);
	 }
	 
	 return 0;
 }

09. 程序示例代码下载

38-独立看门狗.rar

39-窗口看门狗.rar

10. 附录

参考: 【STM32】江科大STM32学习笔记汇总

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/418478.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

厚膜功率电阻器制造:优化性能

通过优化工业功率电阻器制造工艺,制造商可以提高电阻器的性能和可靠性、容差、额定电压、TCR、稳定性和额定功率。 在本文中,我们将介绍工业功率电阻器的制造过程。我们讨论了材料选择和生产技术及其对性能的潜在影响。 完美的电阻器 在其整个使用寿命…

NLP(一)——概述

参考书: 《speech and language processing》《统计自然语言处理》 宗成庆 语言是思维的载体,自然语言处理相比其他信号较为特别 word2vec用到c语言 Question 预训练语言模型和其他模型的区别? 预训练模型是指在大规模数据上进行预训练的模型,通常…

【Emgu CV教程】7.8、图像锐化(增强)之同态滤波

文章目录 一、同态滤波大体原理二、代码三、效果举例 一、同态滤波大体原理 之前介绍的几个锐化、增强方法,包括更早之前介绍的图像模糊方法,都是基于空间域进行处理,也就是直接对目标点周边像素值进行各种数学运算。而这篇文章提到的同态滤…

百度SEO工具,自动更新网站的工具

在网站SEO的过程中,不断更新网站内容是提升排名和吸引流量的关键之一。而对于大多数网站管理员来说,频繁手动更新文章并进行SEO优化可能会是一项繁琐且耗时的任务。针对这一问题,百度自动更新文章SEO工具应运而生,它能够帮助网站管…

[云原生] k8s中kubectl陈述式资源管理

一、管理k8s核心资源的两种基本方法 陈述式资源管理方法 --主要依赖命令行工具kubectl进行管理 优点 可以满足90%以上的使用场景 对资源的增、删、查操作比较容易 缺点 命令冗长,复杂,难以记忆 特定场景下,无法实现管理需求 对资源的修改…

2024年四川媒体新闻发布渠道,媒体邀约资源表

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 四川有哪些媒体新闻发布渠道,媒体邀约资源表? 2024年四川媒体新闻发布渠道,媒体邀约资源表 四川本地媒体:如四川日报、华西都市报、成都商…

仿真科普|CAE技术赋能无人机 低空经济蓄势起飞

喝一杯无人机送来的现磨热咖啡;在拥堵的早高峰打个“空中的士”上班;乘坐水陆两栖飞机来一场“陆海空”立体式观光……曾经只出现在科幻片里的5D城市魔幻场景,正逐渐走进现实。而推动上述场景实现的,就是近年来越来越热的“低空经…

docker mysql主从复制

新建主服务器容器实例3301 mysql 主 3301 docker run -p 3301:3306 --name mysql-master \ -v /mydata/mysql-master/log:/var/log/mysql \ -v /mydata/mysql-master/data:/var/lib/mysql \ -v /mydata/mysql-master/conf:/etc/mysql \ -v /home/mysql/mysql-files:/var/lib/…

基于Matlab/Simulink光伏储能交直流微电网中虚拟同步机控制仿真

很久没有更新虚拟同步机控制方向的内容了,因为这部分内容主要是我在硕士期间的研究内容,不过近期很多同学加我,和我讨论虚拟同步机相关的附加控制和应用场景,对于vsg主要研究方向,大家还是可以看我前面写的内容。 今天…

SpringBoot 手写 Starter

spring-boot-starter 模块 1.介绍 SpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配…

果园预售系统|基于Springboot的果园预售系统设计与实现(源码+数据库+文档)

果园预售系统目录 目录 基于Springboot的果园预售系统设计与实现 一、前言 二、系统功能设计 三、系统功能设计 1 、果园管理 2、水果管理 3、果树管理 4、公告管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获…

C++ 原子变量

概述 C中原子变量(atomic)是一种多线程编程同步机制,它能够确保对共享变量的操作在执行时不会被其他线程的操作干扰,atomic是提供一种生成原子操作数的一种机制,避免竞态条件(race condition)和死锁(deadlock)等问题。…

css5定位

css 一.定位1.概念(定位定位模式边位移)2.静态位移static(不常用)3.相对定位relative(不脱标)(占位置)4.绝对定位absolute(脱标)(不占位置&#x…

『Linux从入门到精通』第 ㉒ 期 - 动静态库

文章目录 💐专栏导读💐文章导读🐧什么是库?🐧为什么要有库?🐧写一个自己的库🐦方法一🐦方法二 静态库🐦标准化🐦方法三 动态库🐦配置动…

Python根据3个点确定两个向量之间的夹角-180度到180方向进行矫正

import cv2 import numpy as np # 读取图片 image cv2.imread(rD:\dmp\cat.jpg) height, width image.shape[:2] # 定义三个定位点(这里假设是图片上的坐标),分别表示原点,向量1终点,向量2终点,下…

动画原理:表面形变算法的思考与总结

前言: 之前我的文章 Mesh形变算法_mesh算法-CSDN博客就有大致的讨论过,介绍的也比较粗略!现在主要是想在Triangulated Surface Mesh Deformation方向上更深入的讨论一下!结合今年我对这一块的学习谈谈我的理解~ 下面要介绍大致几…

学校机房Dev c++解决中文乱码问题

工具->编译选项->勾选 编译时加入以下命令 -fexec-charsetGBK -finput-charsetUTF-8 显示中文:工具->编辑器选项->去掉第一个的勾勾。

WebFlux的探索与实战 - r2dbc的分页查询

自从上次立下这系列的FLAG之后就再也不想碰了。今天难得早起出门面试,回家之后突发奇想打算再写点儿什么敷衍一下,于是便有了这篇文章。 前言 虽然响应式API更加适合流式列表的查询,但是分页这东西可是很常见的。 也没什么前言可说&#xf…

opencv中的rgb转gray的计算方法

转换原理 在opencv中,可以使用cv2.cvtColor函数将rgb图像转换为gray图像。示例代码如下, import cv2img_path "image.jpg" image cv2.imread(img_path) gray_image cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) mean gray_image.mean() pri…

在实训云平台上配置云主机

文章目录 零、学习目标一、实训云升级二、实训云登录(一)登录实训云(二)切换界面语言(三)规划云主机实例 三、创建网络三、创建路由器2024-2-29更新到此四、添加接口五、创建端口六、添加安全组规则七、创建…