【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 = 2500IWDG_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 = 2500IWDG_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:指定的窗口值。该参数取值必须在 0x40 与 0x7F 之间。
返回值:无    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:指定看门狗计数器值。该参数取值必须在 0x40 与 0x7F 之间。
返回值:无      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:指定看门狗计数器值。该参数取值必须在 0x40 与 0x7F 之间。
返回值:无      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学习笔记汇总
相关文章:
 
【STM32】STM32学习笔记-独立看门狗和窗口看门狗(47)
00. 目录 文章目录 00. 目录01. WDG概述02. 独立看门狗相关API2.1 IWDG_WriteAccessCmd2.2 IWDG_SetPrescaler2.3 IWDG_SetReload2.4 IWDG_ReloadCounter2.5 IWDG_Enable2.6 IWDG_GetFlagStatus2.7 RCC_GetFlagStatus 03. 独立看门狗接线图04. 独立看门狗程序示例105. 独立看门…...
 
计算机网络——IPV4数字报
1. IPv4数据报的结构 本结构遵循的是RFC 791规范,介绍了一个IPv4数据包头部的不同字段。 1.1 IPv4头部 a. 版本(Version):指明了IP协议的版本,IPv4表示为4。 b. 头部长度(IHL, Internet Header Length&…...
java抽象方法和抽象类
1、抽象方法 如果父类的方法本身不需要实现任何功能,仅仅是为了定义方法签名,目的是让子类去覆盖它,那么,可以把父类的方法声明为抽象方法。 class Person { // 定义抽象方法public abstract void run(); } 把一个方法声明为a…...
 
echarts鼠标向右/向左绘制实现放大/还原
echarts toolbox 的datazoom提供了绘制放大的功能,但通过鼠标绘制只能进行放大 应需求放大与还原都通过鼠标行为实现,增加从右往左绘制时还原放大结果 demo 结果 重写datazoom的原型方法实现绘制事件的拦截 const comp myChart._model.getComponent(to…...
Go编译DLL与SO
1. 简介 将Go编译成DLL/SO供其他语言调用。 .DLL:文件是 Windows 操作系统的动态链接库文件。.SO 文件是 Unix、Linux 和其他类 Unix 系统的共享库文件。 2. Go编译DLL/SO 注意 export后面导出的方法名一定要大写。 package main/* #include <stdlib.h>…...
 
css浮动
标准流:也叫文档流,指的是标签在页面中默认的排布规则。 浮动:让块级元素水平排列(float:left/right;)。 特点:浮动后的盒子顶对齐; 浮动后的盒子具备行内块的特点; 浮动后的元素脱…...
小程序怎么开发?怎么开发自己的小程序
一、明确需求与定位 在开发小程序之前,需要明确需求. 首先,明确小程序的定位非常重要。我们需要确定小程序是为了提供便捷的购物体验还是特定领域的服务。明确定位可以帮助我们更好地设计和优化小程序的功能,以符合用户的期望和需求。 其次…...
 
Unity(第十八部)物理力学,碰撞,触发、关节和材质
1、重力 刚体组件 英文中文描述RigidBody刚体组件physics->rigidbody ,刚体组件使一个物体有了质量,重力等。,use gravity 勾选后,物体才会受到重力,会自动下落,取消勾选就不会。,…...
 
内网搭建mysql8.0并搭建主从复制详细教程!!!
一、安装mysql 1.1 mysql下载链接: https://downloads.mysql.com/archives/community/ 1.2 解压包并创建相应的数据目录 tar -xvf mysql-8.2.0-linux-glibc2.28-x86_64.tar.xz -C /usr/local cd /usr/local/ mv mysql-8.2.0-linux-glibc2.28-x86_64/ mysql mkdir…...
 
MYSQL 解释器小记
解释器的结果通常通过上述表格展示: 1. select_type 表示查询的类型 simple: 表示简单的选择查询,没有子查询或连接操作 primary:表示主查询,通常是最外层的查询 subquery :表示子查询,在主查询中嵌套的查询 derived: 表示派…...
 
具身智能计算系统,机器人时代的 Android | 新程序员
【导读】具身智能作为一种新兴的研究视角和方法论,正在刷新我们对智能本质及其发展的理解:传统的 AI 模型往往将智能视为一种独立于实体存在的抽象能力,而具身智能则主张智能是实体与其环境持续互动的结果。 本文深度剖析了具身智能计算系统…...
 
win11开启IPV6并手动设置地址
win11开启IPV6并手动设置地址 ipv6手动设置 假设你想要配置的IPv6地址是2001:0db8:85a3:0000:0000:8a2e:0370:7334,子网前缀长度为64位,并且默认网关是2001:0db8:85a3::1。 手动配置IPv6地址的示例步骤(Windows操作系统)&#x…...
 
WPF中如何设置自定义控件
1.圆角按钮的设置: 众所周知在WPF中自带有提示信息,当我问创建Button时,点击空格出现如下可选设置 带有小扳手🔧图标为相应的属性,如果Button有CornerRadius(角半径)属性就能够直接设置Button实…...
 
【Leetcode每日一题】二分查找 - 寻找旋转排序数组中的最小值(难度⭐⭐)(22)
1. 题目解析 Leetcode链接:153. 寻找旋转排序数组中的最小值 这个题目乍一看很长很复杂,又是旋转数组又是最小值的 但是仔细想想,结合题目给的示例,不难看出可以用二分的方法来解决 核心在于找到给定数组里面的最小值 2. 算法原…...
 
QT C++实战:实现用户登录页面及多个界面跳转
主要思路 一个登录界面,以管理员Or普通用户登录管理员:一个管理员的操作界面,可以把数据录入到数据库中。有返回登陆按钮,可以选择重新登陆(管理员Or普通用户普通用户:一个主界面,负责展示视频…...
 
我的世界游戏服务器平台推荐哪里找?
我的世界服务器可以在多个平台上租赁,以下是一些推荐的游戏服务器平台。 1.玩家可以通过互联网上的一些平台租用游戏服务器。其中,国内大厂平台有阿里云、腾讯云、华为云等。这些平台提供了丰富的服务器配置和带宽选择,玩家可以根据自己的需求…...
 
用于制作耳机壳的倒模专用UV树脂有什么特点?
制作耳机壳的UV树脂耳机壳UV胶具有以下特点: 快速固化:UV树脂可以在紫外线的照射下迅速固化,大大缩短了制作时间。高硬度与高耐磨性:UV树脂具有较高的硬度和耐磨性,能够提供良好的保护效果。透明度高:UV树…...
将c、c++变为python
1.编写cpp文件 #include "pycpp.h" #include <iostream>using namespace std;PyCpp::PyCpp(){}void PyCpp::sayHello(int a){cout << "Hello Python, I am C."<<a << endl; }2.编写头文件(声明变量) clas…...
 
golang学习7,glang的web的restful接口结构体传参
接口: //POST请求 返回json 接口传参json r.POST("/postJson", controller.PostUserInfo) 1.定义结构体 //定义结构体 type Search struct {Id intName string }2.结构体传参 //结构体传参 func PostUserInfo(c *gin.Context) {search : &Searc…...
 
python模型训练
目录 1、新建模型 train_model.py 2、运行模型 (1)首先会下载data文件库 (2)完成之后会开始训练模型(10次) 3、 训练好之后,进入命令集 4、输入命令:python -m tensorboard.ma…...
 
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
 
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
 
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
 
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
 
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
