【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…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...

9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...