当前位置: 首页 > news >正文

学习笔记——stm32看门狗

目录

一、WDG简介

二、IWDG框图

2.1独立看门狗结构

2.2键寄存器

 2.3超时时间

三、WWDG框图

3.1窗口看门狗结构

3.2WWDG时序图

3.3最早、最晚时间

四、IWDG和WWDG对比

五、IWDG相关库函数和应用

5.1相关库函数

5.2应用

六、WWDG相关库函数和应用

6.1相关库函数

6.2应用 


一、WDG简介

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

  • 看门狗本质上是一个定时器指定时间范围内,程序没有执行“喂狗”(重置计数器)操作时,看门狗硬件电路就自动产生复位信号
  • STM32内置两个看门狗:
    • 独立看门狗(IWDG,独立工作对时间精度要求较低,使用LSI内部低速时钟),即独立看门狗只有一个最晚时间界限,一旦超过这个时间喂狗,IWDG就会及时复位
    • 窗口看门狗(WWDG,要求看门狗在精确计时窗口起作用,使用APB1时钟),即不能过早喂狗,也不能过晚喂狗

二、IWDG框图

2.1独立看门狗结构

  • 输入时钟:LSI,内部低速时钟,40KHz (该时钟将随着IWDG的启动自动开启和提供!参考手册6.2.9)
  • 8位预分频器,最大256分频
  • 12位递减计数器,最大4096-1,自减到0,产生IWDG复位(这种情况是需要避免的,说明程序死机)
  • 正常情况,我们需要提前手动重装,即配置好重装载寄存器(重装值),然后在键寄存器写入数据,重装值就会复制到当前计数器中,计数器重新开始自减

2.2键寄存器

  • 本质上就是控制寄存器,用来控制硬件电路的工作
  • 因为看门狗是用来避免程序死机然后进行复位操作,在程序跑飞或者死机过程中,任何寄存器的某一位都有可能因干扰写入了错误的1/0,所以直接定义了几个特定的数据,然后识别进行相应操作(相当于往键寄存器需要输入对应的密码才能执行对应的操作)

注意:并没有对应的键寄存器值用来关闭独立看门狗,事实上,IWDG和WWDG启用后,都是无法关闭的,也是为了防止误操作将看门狗误关

与定时器中断结构进行对比:

区别:

  • 定时器的重装载值是更新事件产生后自动重装
  • 看门狗的重装载值是计数器自减到零后,手动重装——喂狗

 2.3超时时间

超时时间:T=LSI时钟周期x预分频系数x重装值+1 (LSI时钟周期为时钟频率的倒数)

以该图为例,40KHz对应的时钟周期就是0.025ms(每0.025ms来一个脉冲),4分频(相当于需要数4个脉冲计数值才+1),最短超时时间也就是0.025x4x1=0.1ms(重装值取0),最长超时时间也就是0.025x4x(4095+1)=409.6ms

三、WWDG框图

3.1窗口看门狗结构

注意:窗口看门狗多了最早喂狗时间的限制(不能过早喂狗)

WWDG没有重装寄存器,对于计数器值的修改,直接修改控制寄存器的值——“喂狗”

  • 时钟源PCLK1,也就是APB1的时钟,默认36MHz
  • T[6:0],T6作为溢出标志位(当1 000000时,再自减,0 111111,会通过左边的逻辑门控制,产生复位信号),其实只用记住,T[6:0]变为0x40时说明自减溢出了,需要重新写入计数器值
  • WDGA使能窗口看门狗,置1启用,置0禁用
  • 窗口原理:
    • 最早时间:重新写入计数器值时,会对比当前计数器的值T[6:0]和W[6:0],如果比它大,说明喂狗过早,将产生复位
    • 最晚时间:当T[6:0]变为0x40,说明自减溢出,将产生复位 

WWDG还有个特点:“死前中断”EWI

简单来说就是,T[6:0]变为0x40时可以产生EWI早期唤醒中断,在这个中断中,可以执行用户想做的操作,比如保存重要数据、关闭危险设备,又或者接下来不执行复位(执行喂狗操作),然后打印提示信息

3.2WWDG时序图

3.3最早、最晚时间

  1. 最晚时间/ms:Twwdg = Tpclk1 x 4096(事先分频) x 预分频 x( T[5:0] + 1 )
  2. 最早时间/ms:Twin     = Tpclk1 x 4096(事先分频) x 预分频 x( T[5:0] - W[5:0] )

其中Tpclk1为APB1时钟频率的倒数(ms为单位)

四、IWDG和WWDG对比

 

五、IWDG相关库函数和应用

5.1相关库函数

//iwdg.h
void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);//寄存器写保护解除、启用
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);		//设置预分频
void IWDG_SetReload(uint16_t Reload);				//设置重装值
void IWDG_ReloadCounter(void);						//"喂狗"
void IWDG_Enable(void);								//启用IWDG
FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG);	//获取标志位状态//rcc.h 查看复位标志是由什么引起的
//RCC_FLAG_IWDGRST: Independent Watchdog reset
//RCC_FLAG_WWDGRST: Window Watchdog resetFlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);
void RCC_ClearFlag(void);

5.2应用

#include "stm32f10x.h"                  // Device header
#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);IWDG_SetReload(2499);					//1000msIWDG_ReloadCounter();					//喂狗IWDG_Enable();							//写入键寄存器0x5555之外的值,启用看门狗的同时也写保护预分频寄存器和重装寄存器while (1){Key_GetNum();//如果一直按下按键导致程序阻塞,不能及时执行下面的喂狗,就会导致看门狗复位IWDG_ReloadCounter();//下面闪烁显示 表示喂狗操作执行成功 延时时间不能超过上面设置的最晚时间——1000msOLED_ShowString(4, 1, "FEED");Delay_ms(200);OLED_ShowString(4, 1, "    ");Delay_ms(600);}
}

六、WWDG相关库函数和应用

6.1相关库函数

void WWDG_DeInit(void);//恢复缺省配置 一般不用
void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);//设置预分频
void WWDG_SetWindowValue(uint8_t WindowValue);//设置窗口时间
void WWDG_EnableIT(void);//使能EWI中断——死前中断
void WWDG_SetCounter(uint8_t Counter);//设置计数器值,也是喂狗操作
void WWDG_Enable(uint8_t Counter);//使能窗口看门狗 启用时就喂一次狗 防止立刻复位
FlagStatus WWDG_GetFlagStatus(void);
void WWDG_ClearFlag(void);

6.2应用 

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Key.h"int main(void)
{OLED_Init();Key_Init();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);}RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);//开启APB1时钟//计算时间后 设置预分频、窗口值(最早时间)、计数器值(最晚时间)WWDG_SetPrescaler(WWDG_Prescaler_8);WWDG_SetWindowValue(0x40 | 21);		//30ms WWDG_Enable(0x40 | 54);				//50ms while (1){Key_GetNum();OLED_ShowString(4, 1, "FEED");Delay_ms(20);OLED_ShowString(4, 1, "    ");Delay_ms(20);WWDG_SetCounter(0x40 | 54);}
}

相关文章:

学习笔记——stm32看门狗

目录 一、WDG简介 二、IWDG框图 2.1独立看门狗结构 2.2键寄存器 2.3超时时间 三、WWDG框图 3.1窗口看门狗结构 3.2WWDG时序图 3.3最早、最晚时间 四、IWDG和WWDG对比 五、IWDG相关库函数和应用 5.1相关库函数 5.2应用 六、WWDG相关库函数和应用 6.1相关库函数 6…...

2411rust,cargo清理缓存

原文 Cargo最近在晚间通道上取得了一个不稳定的功能(从nightly-2023-11-17开始),它可自动清理Cargo主目录中的缓存内容. 总之,请求使用晚间通道的人启用此功能,并在Cargo问题跟踪器上报告问题.要启用它,请在你的一般在~/.cargo/config.toml或%USERPROFILE%\.cargo\config.tom…...

高级java每日一道面试题-2024年11月19日-基本篇-获取一个类Class对象的方式有哪些?

如果有遗漏,评论区告诉我进行补充 面试官: 获取一个类Class对象的方式有哪些? 我回答: 在 Java 中,获取一个类的 Class 对象有多种方式。这些方式各有优缺点,适用于不同的场景。以下是常见的几种方法及其详细解释: 1. 使用 new 关键字实…...

Vue 3与TypeScript集成指南:构建类型安全的前端应用

在Vue 3中使用TypeScript,可以让你的组件更加健壮和易于维护。以下是使用TypeScript与Vue 3结合的详细步骤和知识点: 1. 环境搭建 首先,确保你安装了Node.js(推荐使用最新的LTS版本)和npm或Yarn。然后,安…...

可视化建模与UML《活动图实验报告》

你当像鸟飞往你的山。 一、实验目的&#xff1a; 1、熟悉活动图的基本功能和使用方法。 2、掌握使用建模工具软件绘制协作图的方法 二、实验环境&#xff1a; window7 | 10 | 11 EA15 三、实验内容&#xff1a; <1>绘制学生选课系统中添加课程(Add Course)用例的活动图…...

接雨水

接雨水 1、 题目描述2、解题思路 1、 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 2、解题思路 本题使用了双指针&#xff0c;根据下图可以得出&#xff0c;下标 i 处能接的雨水量由左边…...

i春秋-签到题

练习平台地址 竞赛中心 题目描述 题目内容 点击GUESS后会有辨识细菌的选择题 全部完成后会有弹窗提示 输入nickname后提示获得flag F12检查 元素中没有发现信息 检查后发现flag在控制台中 flag flag{663a5c95-3050-4c3a-bb6e-bc4f2fb6c32e} 注意事项 flag不一定要在元素中找&a…...

Selenium + 数据驱动测试:从入门到实战!

引言 在软件测试中&#xff0c;测试数据的多样性和灵活性对测试覆盖率至关重要。而数据驱动测试&#xff08;Data-Driven Testing&#xff09;通过将测试逻辑与数据分离&#xff0c;极大地提高了测试用例的可维护性和可扩展性。本文将结合Selenium这一流行的测试工具&#xff0…...

考研倒计时30天丨和西电一起向前!再向前!

上岸后 就能来 西安电子科技大学 和学长学姐一起吃饭&#xff0c;XDU食堂都有你想要的一切 ①、海棠篇&#xff1a;海棠新生初入校园&#xff0c;还在犹豫吃什么&#xff1f;宿舍楼边的海棠餐厅物美价廉&#xff0c;满足你一日三餐的需求与期盼&#xff01; 俗话说&#xff1a…...

json数组写入文件每行一条数据

我们知道将json或json数组写入文件&#xff0c;一般是用JSON.stringify先将json或json数组转成字符串&#xff0c;再写入文件。JSON.stringify()的语法是这样的&#xff1a;JSON.stringify(value[, replacer[, space]]) JSON.stringify(value)调用则不带空格tab换行等分隔符&am…...

EasyExcel并行导出多个excel文件并压缩下载

EasyExcel并行导出多个excel文件并压缩下载 在SpringBoot应用中,采用同步方式导出Excel文件会导致服务器在生成文件期间阻塞,特别是在处理大量数据时,这种效率较低的方法会严重影响性能。为了解决这个问题,可以采用以下改进措施:首先将导出的数据进行拆分,然后利用Compl…...

hadoop3.x 新特性

hadoop3.x 新特性 FeaturesHadoop 2.xHadoop 3.xMinimum Required Java VersionJDK 6 and above.JDK 8 is the minimum runtime version of JAVA required to run Hadoop 3.x as many dependency library files have been used from JDK 8.Fault ToleranceFault Tolerance is …...

单片机智能家居火灾环境安全检测-分享

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 传统的火灾报警系统大多依赖于简单的烟雾探测器或温度传感器&#xff0c;…...

241117学习日志——[CSDIY] [ByteDance] 后端训练营 [05]

CSDIY&#xff1a;这是一个非科班学生的努力之路&#xff0c;从今天开始这个系列会长期更新&#xff0c;&#xff08;最好做到日更&#xff09;&#xff0c;我会慢慢把自己目前对CS的努力逐一上传&#xff0c;帮助那些和我一样有着梦想的玩家取得胜利&#xff01;&#xff01;&…...

Oracle 19C 安装RAC磁盘投票失败

ORACLE 19C 安装RAC第二个节点报错&#xff0c;没有找到足够的 voting 文件&#xff08;投票磁盘&#xff09; 1、磁盘投票失败分析 1.1、02节点报错日志 CRS-4123: Starting Oracle High Availability Services-managed resources CRS-2672: Attempting to start ora.mdnsd…...

vulfocus在线靶场:骑士cms_cve_2020_35339:latest 速通手册

目录 一、启动环境&#xff0c;访问页面&#xff0c;ip:端口号/index.php?madmin,进入后台管理页面&#xff0c;账号密码都是adminadmin 二、进入之后&#xff0c;根据图片所示&#xff0c;地址后追加一下代码&#xff0c;保存修改 ​三、新开标签页访问&#xff1a;①ip:端…...

【Linux内核深度解析】TCP协议栈之tcp_recvmsg

tcp_recvmsg 是 Linux 内核中用于处理 TCP 套接字接收数据的核心函数。它的主要任务是从接收队列中读取数据并将其复制到用户空间。 函数原型 int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, size_t len, int nonblock, int flags, int *addr_le…...

android-studio-4.2下载 、启动

下载 分享一个国内的android studio网站&#xff0c;可以下载SDK和一些Android studio开发工具 https://www.androiddevtools.cn/ 启动 JAVA_HOME/app/zulu17.48.15-ca-jdk17.0.10-linux_x64/ /app5/android-studio-home/android-studio-ide-201.6568795-linux-4.2C1/bin/s…...

Excel——宏教程(2)

Excel——宏教程(2) 一)、处理单元格 1、直接赋值与引用 将变量、常量值直接赋给单元格、或将单元格的值直接赋给变量、常量&#xff0c;这是在excel中最简单的单元格赋值及引用方法。 如下例将工作表"Sheet1"A1单元格的值赋给Integer变量I&#xff0c;并将I1的值…...

React Native 全栈开发实战班 - 性能与调试之打包与发布

在完成 React Native 应用的开发与性能优化后&#xff0c;下一步就是将应用打包并发布到各大应用市场&#xff0c;如 Apple App Store 和 Google Play Store。本章节将详细介绍 React Native 应用的打包与发布流程&#xff0c;包括 Android 和 iOS 平台的打包步骤、签名配置、发…...

C# 5000 转16进制 字节(激光器串口通讯生成指定格式命令)

最近在做一个与激光器用串口进行通讯的程序文档中要求将频率参数以3个字节的方式进行发送。这里记录一下过程。以便以后再有类似问题时可以快速解决。 /// <summary>/// 设置频率/// </summary>/// <param name"sender"></param>/// <par…...

Win11下载和配置VSCode(详细讲解)

配置VSCode需要的工具&#xff1a; 一、MinGW-w64 二、Visual Studio Code 一、MinGW-w64下载 1、下载 MinGW官网地址&#xff1a; Downloads - MinGW-w64 直链下载&#xff1a; 下载 mingw-w64-install.exe &#xff08;MinGW-w64 - 适用于 32 位和 64 位 Windows&#…...

基于Multisim的多路智力竞赛抢答器设计与仿真

(1)设计一个8路智力竞赛抢答器,主持人可控制系统的清零和抢答的开始,控制电路可实现最快抢答选手按键抢答的判别和锁定功能&#xff0c;并禁止后续其他选手抢答。 (2)抢答选手确定后给出一声音响的提示和选手编号的显示&#xff0c;抢答选手的编号显示保持到系统被清零为止。 …...

Three.js 闪电效果

闪电shader const shader new THREE.ShaderMaterial({uniforms: {iTime: this.iTime,color: { value: new THREE.Color("#D2F8FE") },},vertexShader: /* glsl */ varying vec2 vUv;varying float normalizeY;void main() {// vUv (uv * 2. - 2.) * vec2(0.3,2.);…...

高效序列化工具(1)-----Protobuf

目录 1.Protobuf Protobuf 的特点 工作原理 Protobuf 与 JSON、XML 的对比 2.protobuf语法 1.数据类型 2.消息 3.枚举 4.嵌套消息 5.重复字段 6.默认值 7.其他类型 1.oneof类型 2.any类型 8.文件组织 3.protobuf命令 1.常见命令 选项&#xff1a; 1. --proto_…...

湛江市社保卡申领指南:手机获取电子照片回执单号

在湛江市&#xff0c;社保卡的申领流程已经实现了数字化&#xff0c;为市民带来了极大的便利。特别是通过手机获取数码照片回执单号&#xff0c;这一环节更是简化了申领过程。今天&#xff0c;我们将详细介绍如何不去照相馆&#xff0c;利用手机来获取数码照片回执单号&#xf…...

HTML5实现剪刀石头布小游戏(附源码)

文章目录 1.设计来源1.1 主界面1.2 皮肤风格1.2 游戏中界面 2.效果和源码源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/143798520 HTM…...

TypeScript之常见类型

常见类型(Everyday Types) 本章我们会讲解 JavaScript 中最常见的一些类型,以及对应的描述方式。注意本章内容并不详尽,后续的章节会讲解更多命名和使用类型的方式。 类型可以出现在很多地方,不仅仅是在类型注解 (type annotations)中。我们不仅要学习类型本身,也要学习…...

MacOS java多版本安装与管理-sdkman

安装sdkman curl -s "https://get.sdkman.io" | bashsource "$HOME/.sdkman/bin/sdkman-init.sh"sdk version正常出现sdkman版本号就安装成功了 # 安装java # 安装java8 sdk install java 8.0.412.fx-zulu建议和上述一样安装 fx-zulu 的jdk&#xff0c…...

NLP论文速读(多伦多大学)|利用人类偏好校准来调整机器翻译的元指标

论文速读|MetaMetrics-MT: Tuning Meta-Metrics for Machine Translation via Human Preference Calibration 论文信息&#xff1a; 简介&#xff1a; 本文的背景是机器翻译&#xff08;MT&#xff09;任务的评估。在机器翻译领域&#xff0c;由于不同场景和语言对的需求差异&a…...

20241121 android中树结构列表(使用recyclerView实现)

1、adapter-item的布局 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"wrap_content&…...

达索系统亮相第三十一届中国汽车工程学会年会暨展览会

伴随着改革开放以及中国入世WTO&#xff0c;三十多年来&#xff0c;中国汽车产销已经成为世界最大的单一市场而独占鳌头。近十年来&#xff0c;另辟蹊径的中国汽车产业人在新能源汽车赛道上引领了一波又一波令全球惊艳的创新成就&#xff0c;成为最为靓丽的新出口三大件的头牌。…...

Python网络爬虫实践案例:爬取猫眼电影Top100

以下是一个Python网络爬虫的实践案例&#xff0c;该案例将演示如何使用Python爬取猫眼电影Top100的电影名称、主演和上映时间等信息&#xff0c;并将这些信息保存到TXT文件中。此案例使用了requests库来发送HTTP请求&#xff0c;使用re库进行正则表达式匹配&#xff0c;并包含详…...

ROSSERIAL与Arduino IDE交叉开发(UBUNTU环境,包含ESP32、arduino nano)

ROSSERIAL与Arduino IDE交叉开发 一、简介二、安装1、Ubuntu下的Arduino IDE安装 **针对ESP32报错问题原因溯源和修改**三、运行结点 一、简介 这个教程展示在ubuntu环境下如何利用Arduino IDE配合rosserial开发机器人部件。通过Arduino IDErosserial实现arduino/esp32开发板通…...

爬虫开发工具与环境搭建——使用Postman和浏览器开发者工具

第三节&#xff1a;使用Postman和浏览器开发者工具 在网络爬虫开发过程中&#xff0c;我们经常需要对HTTP请求进行测试、分析和调试。Postman和浏览器开发者工具&#xff08;特别是Network面板和Console面板&#xff09;是两种最常用的工具&#xff0c;能够帮助开发者有效地捕…...

ceph 18.2.4二次开发,docker镜像制作

编译环境要求 #需要ubuntu 22.04版本 参考https://docs.ceph.com/en/reef/start/os-recommendations/ #磁盘空间最好大于200GB #内存如果小于100GB 会有OOM的情况发生,需要重跑 目前遇到内存占用最高为92GB替换阿里云ubuntu 22.04源 将下面内容写入/etc/apt/sources.list 文件…...

游戏引擎学习第19天

介绍 这段内容描述了开发者在进行游戏开发时&#xff0c;对于音频同步和平台层的理解和调整的过程。以下是更详细的复述&#xff1a; 开发者表达了他希望今天继续进行的工作内容。他提到&#xff0c;昨天他讲解了一些关于音频的内容&#xff0c;今天他想稍微深入讲解一下他正…...

简单实现vue2响应式原理

vue2 在实现响应式时&#xff0c;是根据 object.defineProperty() 这个实现的&#xff0c;vue3 是通过 Proxy 对象实现&#xff0c;但是实现思路是差不多的&#xff0c;响应式其实就是让 函数和数据产生关联&#xff0c;在我们对数据进行修改的时候&#xff0c;可以执行相关的副…...

TypeScript 中扩展现有模块的用法

declare module 是 TypeScript 中用于扩展现有模块的特性。它允许开发者在已有模块的基础上&#xff0c;添加新的功能&#xff08;比如扩展接口、添加类型声明等&#xff09;。通过 declare module&#xff0c;可以将额外的声明合并到原模块中。以下是用法详解&#xff1a; 用…...