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

STM32-WWDG/IWDG看门狗

 WWDG/IWDG一旦开启不能关闭,可通过选项字节在上电时启动硬件看门狗,看门狗计数只能写入不能读取。看门狗启用时,T6bit必须置1,防止立即重置。

一、原理

独立看门狗-超时复位

窗口看门狗-喂狗(重置计数器,计数器最大12Bit,2^{12}-1 = 4095)早了或者晚了都复位

1、IWDG结构

 键寄存器负责键入重装载值,这个值是之前配置好的,每次喂狗会自动通过键寄存器使重装载寄存器的数值键入递减计数器。看门狗位于VDD供电区,所以在停机和待机模式时可以正常使用。

 2、IWDG超时时间计算公式

超时频率 = Fiwdg = Flsi(LSI频率)/PR预分频系数/(RL+1)。

默认Tlsi=40khz,频率=1/40000=0.025ms。分频后时间增加。只有固定的分频系数,若为2(分频16)。若RL=99,则为0.025ms*16 = 0.4ms*100 = 40ms。

表格内说明:例如第一行4分频,

Tiwdg = 0.025ms*4*(RL=0x000,最短时间)1 = 0.1ms

Tiwdg = 0.025ms*4*(RL=0xFFF,最长时间)4096= 409.6ms

3、WWDG结构

WDGTB同独立看门狗的PR和定时器的PSC都是预分频器。

WWDG_CR相当于把独立看门狗的计数器、KR(控制寄存器)合二为一了。没有重装寄存器,在直接在CNT写入数据即可(6bit递减计数器,T5-T0,T6为溢出标志位(为1表示没有溢出,为0时表示计数器溢出,例如从111 1111->100 0000 -0x40时在减一 -> 011 1111表示溢出),若将T6位当作计数器的一部分,那么减到0x40开始溢出。若把第六位当作计数器,那么位第六位减到0溢出)。

CFR为喂狗的最早时间界限。WDGA窗口看门狗使能。

工作流程:PCLK1提供时钟APB1(36MHz),通过WDGA使能窗口看门狗,当WWDG_CR减到0时溢出,提供复位信号。或者当写入WWDG_CR时,WWDG_CR喂狗时的剩余的计数值>WWDG_CFR配置寄存器,提供复位信号。即限制了最早喂狗时间值。

4、WWDG工作特征

 早期唤醒中断(EWI即死前复位),通过该中断提醒用户看门狗即将复位。可以做一些操作。

看门狗时序图显示了可刷新重装载看门狗时间的时间范围(W[6,0]>T[6,0]>0x3F)。

 5、WWDG时间计算公式

Tpclk1 = 0.028us。Tpclk1提供的时钟先进性了4096分频,所以要×4096=114.688us。114.688us×2^WDGTB×(T[5:0]+1)为超时时间根据表格可以查看最大超时时间和最小超时时间。

超时时间计算直接通过T[5,0],当T[5,0]递减到0溢出。窗口超时时间是指,窗口CFR寄存器所表示的最低喂狗时间,当T[5,0]>W[5,0]喂狗时的复位时间。即复位时间 :超时时间>正常喂狗时间>窗口时间。2^6bit最大为63。

6、WWDG/IWDG的差别

 窗口看门狗的递减计数器未使能也会一直递减。所以需要使能时进行喂狗。

二、实际程序

1、独立看门狗,超时复位

程序烧写入可以看到,程序正常执行,OLED不断显示喂狗操作,按下复位按键可以看到显示RET复位。

通过按住PB11按键(图中按钮接在PB11和地,和图上不一样)按住不停,使软件停在检测按键内。看门狗超时后OLED显示WWDGRET表示独立看门狗超时。

 

无需手动打开LSI 

测试方式:

1、不进行按键按下操作,此时应该能正常喂狗,OLED显示 IWDG_Reload。

2、持续按下PB11按键,此时应该不能正常喂狗,OLED显示 IWDG RST,表示看门狗复位。

3、STM32按键复位,可以看到OTHER RST,说明复位显示正常。

 main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "MyIWDG.h"
#include "Button.h"
int main(void){OLED_Init();ButtonPB11_Init();OLED_ShowString(1,1,"IWDG TEST:");//if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST) == SET){//判断是否是独立看门狗复位,该寄存器每次不会被清除OLED_ShowString(2,1,"IWDG RST");//显示看门狗复位Delay_ms(500);OLED_ShowString(2,1,"        ");RCC_ClearFlag();}else{//其他复位OLED_ShowString(2,1,"OTHER RST");//显示其他复位Delay_ms(500);OLED_ShowString(2,1,"         ");}MyIWDG_Init();//看门狗初始化 1000mswhile(1){GetButtonPB11();//使用按钮延时来模拟程序异常IWDG_ReloadCounter();//喂狗OLED_ShowString(3,1,"IWDG_Reload");//显示喂狗操作Delay_ms(600);OLED_ShowString(3,1,"           ");Delay_ms(200);}return 0;
}

 MyWWDG.c

#include "stm32f10x.h"                  // Device headervoid MyIWDG_Init(void){IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//我们需要超时1s复位,根据手册选择最小16分频,充分利用寄存器防止除数有误差IWDG_SetPrescaler(IWDG_Prescaler_16);//根据公式:重装值 = ( 1000ms / Tlsi(4KHz = 0.025ms) / PR预分频数(16) )-1IWDG_SetReload(2499);IWDG_ReloadCounter();//重装值装载IWDG_Enable();//独立看门狗启动}

 MyWWDG.h

#ifndef __MYIWDG_H
#define __MYIWDG_H
#include "stm32f10x.h"                  // Device headervoid MyIWDG_Init(void);#endif

 Button.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"/*** @brief 初始化引脚PB11地开信号接收Button,用于辅助测试看门狗* @param  *     @arg * @param  *     @arg * @retval None*/
void ButtonPB11_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef  GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);
}/*** @brief 获取PB11的Button是否按下* @param  *     @arg * @param  *     @arg * @retval None*/
uint8_t GetButtonPB11(void){if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == RESET){Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == RESET);Delay_ms(20);return 1;}return 0;
}

Button.h

#ifndef __BUTTON_H
#define __BUTTON_H
#include "stm32f10x.h"                  // Device headeruint8_t GetButtonPB11(void);
void ButtonPB11_Init(void);#endif

 

2、窗口看门狗,超时或提前都会复位。

读改写操作的优点:

1、可以单独改变寄存器的某几位,而不影响其他寄存器的值。

2、如果连续修改多次不同/相同的位,操作效率比较高。

3、所有更改的位,最终写回到寄存器时同时生效

程序测试方式:

1、将while内延时程序时间改成小于17ms,可以看到有窗口时间复位。

2、将while内延时程序时间改成大于35ms,可以看到有超时时间复位。

3、将while内延时程序时间改成(17,35),可以看到持续喂狗,没有复位产生。

4、通过STM32复位按键可以看到复位正常。通过按键持续按住PB11按键可以看到,持续产生窗口看门狗复位。

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "MyWWDG.h"
#include "Button.h"
int main(void){OLED_Init();ButtonPB11_Init();OLED_ShowString(1,1,"WWDG TEST:");//if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST) == SET){//判断是否是独立看门狗复位,该寄存器每次不会被清除OLED_ShowString(2,1,"WWDG RST");//显示看门狗复位Delay_ms(500);OLED_ShowString(2,1,"        ");RCC_ClearFlag();}else{//其他复位OLED_ShowString(2,1,"OTHER RST");//显示其他复位Delay_ms(500);OLED_ShowString(2,1,"         ");}MyWWDG_Init();//窗口看门狗初始化 超时时间50ms,窗口时间30mswhile(1){GetButtonPB11();//使用按钮延时来模拟程序异常OLED_ShowString(3,1,"WWDG_Reload");//显示喂狗操作Delay_ms(20);OLED_ShowString(3,1,"           ");Delay_ms(15);WWDG_SetCounter(0x40 | 54);//喂狗/*经测试本程序和个人的硬件,窗口时间30ms,但是使用延时小于17ms就会触发窗口时间复位。超时时间50ms,但是使用延时大于35ms就会触发超时时间复位。说明其他程序延时可以达到13ms-15ms。也可注释所有程序,使用延时测试,经测试窗口时间30ms,超时时间50ms无异常。*/}return 0;
}

 MyWWDG.c

#include "stm32f10x.h"                  // Device headervoid MyIWDG_Init(void){RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);//开启窗口看门狗时钟WWDG_SetPrescaler(WWDG_Prescaler_8);//设置预分频/*设置窗口时间30ms计算公式为:Twin = Tpclk1*4096*WWDGpcs*(T[5:0]-W[5:0])。带入T[5:0] = 55 , Tpclk1 = 36MHz = 0.028us , WWDGpcs = 8 得到30ms = 917.504us*(55-W[5:0]) ; 54-W[5:0]=32.7 ;W[5:0]= 21.3。*/WWDG_SetWindowValue(0x40 | 21);//设置窗口时间,也需要|0x40,因为电路中对比超时时间和窗口时间使用的T[6:0]>W[6:0]/*超时时间是50ms计算公式为:Twwdg = Tpclk1(36MHz = 0.028us)*4096*WWDGpcs(8)*(T[5:0]-1)。50ms = 917.504us*(T[5:0]-1),T[5:0]=53.5=54。T6溢出位位2^7=64 = 0x40。T7使能位函数自动置位。所以需要输入64+54=0x76=0x40 | 54*/WWDG_Enable(0x40 | 54);//设置超时时间,在使能时需要同时设置(溢出位也要置1  0x40),因为窗口看门狗递减计数器为自由递减,不使能也会递减}

MyIWDG.h

#ifndef __MyIWDG_H
#define __MyIWDG_H
#include "stm32f10x.h"                  // Device headervoid MyIWDG_Init(void);#endif

 Button.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"/*** @brief 初始化引脚PB11地开信号接收Button,用于辅助测试看门狗* @param  *     @arg * @param  *     @arg * @retval None*/
void ButtonPB11_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef  GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);
}/*** @brief 获取PB11的Button是否按下* @param  *     @arg * @param  *     @arg * @retval None*/
uint8_t GetButtonPB11(void){if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == RESET){Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == RESET);Delay_ms(20);return 1;}return 0;
}

Button.h

#ifndef __BUTTON_H
#define __BUTTON_H
#include "stm32f10x.h"                  // Device headeruint8_t GetButtonPB11(void);
void ButtonPB11_Init(void);#endif

相关文章:

STM32-WWDG/IWDG看门狗

WWDG/IWDG一旦开启不能关闭,可通过选项字节在上电时启动硬件看门狗,看门狗计数只能写入不能读取。看门狗启用时,T6bit必须置1,防止立即重置。 一、原理 独立看门狗-超时复位 窗口看门狗-喂狗(重置计数器,…...

基于视觉惯性 SLAM(VSLAM)、相机和 IMU 数据的融合执行 6 自由度位姿跟踪

案例来源:https://spectacularai.github.io/docs/sdk/wrappers/oak.html 适配相机:带IMU的 OAK-D 系列相机 基于视觉惯性 SLAM(VSLAM)、相机和 IMU 数据的融合执行 6 自由度位姿跟踪 ~~~~~~~(分界线)~~~~~…...

Matlab仿真径向受压圆盘光弹图像

Matlab仿真径向受压圆盘光弹图像-十步相移法 主要参数 % 定义圆盘参数 R 15; % 圆盘半径,单位:mm h 5; % 圆盘厚度,单位:mm P 300; % 径向受压载荷大小,单位&#xff…...

网络安全抓包

#知识点: 1、抓包技术应用意义 //有些应用或者目标是看不到的,这时候就要进行抓包 2、抓包技术应用对象 //app,小程序 3、抓包技术应用协议 //http,socket 4、抓包技术应用支持 5、封包技术应用意义 总结点:学会不同对象采用…...

WebSocket 测试调试:工具与实践

在前五篇文章中,我们深入探讨了 WebSocket 的基础原理、服务端开发、客户端实现、安全实践和性能优化。今天,让我们把重点放在测试和调试上,看看如何确保 WebSocket 应用的质量和可靠性。我曾在一个实时通讯项目中,通过完善的测试和调试策略,将线上问题的发现时间从小时级缩短到…...

ArmSoM RK3588/RK3576核心板,开发板网络设置

ArmSoM系列产品都搭配了以太网口或WIFI模块,PCIE转以太网模块、 USB转以太网模块等,这样我们的网络需求就不止是上网这么简单了,可以衍生出多种不同的玩法。 1. 网络连接​ 连接互联网或者组成局域网都需要满足一个前提–设备需要获取到ip&a…...

【学Rust开发CAD】1 环境搭建

文章目录 一、搭建C/C编译环境二、安装Rust三、配置 PATH 环境变量四、验证安装结果五、安装编辑工具 一、搭建C/C编译环境 Rust 的编译工具依赖 C 语言的编译工具,这意味着你的电脑上至少已经存在一个 C 语言的编译环境。如果你使用的是 Linux 系统,往…...

数据结构与算法之二叉树: LeetCode 108. 将有序数组转换为二叉搜索树 (Ts版)

将有序数组转换为二叉搜索树 https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/ 描述 给你一个整数数组 nums ,其中元素已经按 升序 排列请你将其转换为一棵 平衡 二叉搜索树 示例 1 输入:nums [-10,-3,0,5,9…...

Java 多线程之@Async

SpringBoot 中使用 Async 使用 Async 注解步骤: 添加 EnableAsync 注解。在主类上或者 某个类上,否则,异步方法不会生效 添加 Async注解。在异步方法上添加此注解。异步方法不能被 static 修饰需要自定义线程池,则可以配置线程池…...

代码随想录day38 动态规划6

题目:322.零钱兑换 279.完全平方数 139.单词拆分 多重背包 背包总结 需要重做:322,139 322. 零钱兑换 思路:零钱,可取多次-》完全背包。 注意: 五部: 1.dp[j]:价值为j的时候,最…...

LabVIEW无标题的模态VI窗口的白框怎么去除?

在LabVIEW中,如果你遇到无标题的模态(modal)VI窗口显示有一个白框,通常是由于VI界面的一些属性或者控件设置问题导致的。为了去除这个白框,可以尝试以下几种方法: 1. 检查VI窗口属性设置 确保你的VI窗口属…...

iOS - 原子操作

在 Objective-C 运行时中,原子操作主要通过以下几种方式实现: 1. 基本原子操作 // 原子操作的基本实现 #if __has_feature(c_atomic)#define OSAtomicIncrement32(p) __c11_atomic_add((_Atomic(int32_t) *)(p), 1, __ATOMIC_RELAXED) #define …...

Go语言的语法

Go语言入门与实战 引言 在当今的开发环境中,随着互联网的快速发展,程序员们面临着越来越复杂的系统需求。针对这些需求,Go语言(又称Golang)作为一种新的编程语言应运而生。Go语言由Google开发,它具有简单…...

【MySQL 保姆级教学】用户管理和数据库权限(16)

数据库账户管理是指对数据库用户进行创建、修改和删除等操作,以控制用户对数据库的访问权限。通过账户管理,可以设置用户名、密码、主机地址等信息,确保数据库的安全性和可控性。例如,使用 CREATE USER 创建用户,ALTER…...

什么是 ES6 “模板语法” ?

ES6 提出了“模板语法”的概念。在 ES6 以前,拼接字符串是很麻烦的事情 var name css var career coder! var hobby [coding ,"writing] var finalString my name is name ,I work as a career I love hobby[0] and hobby[1]仅仅几…...

[项目实战2]贪吃蛇游戏

目录 贪吃蛇游戏:: 一、游戏效果及功能实现: 1.规则 ​​​​​​​ ​​​​​​​ ​​​​​​​ 2.基本功能实现 ​​​​​​​ ​​​​​​​ ​​​​​​​ 3.技术要点 ​​​​​​​…...

关于FPGA中添加FIR IP核(采用了GOWIN EDA)

文章目录 前言一、IP核二、MATLAB文件三、导出系数COE文件1.设计滤波器2.用官方的matlab代码或者直接用文本文件 四、进行模块化设计源文件 前言 FIR滤波器的特点是其输出信号是输入信号的加权和,权值由滤波器的系数决定。每个系数代表了滤波器在特定延迟位置上的“…...

1. 使用springboot做一个音乐播放器软件项目【前期规划】

背景: 现在大部分音乐软件都是要冲会员才可以无限常听的。对于喜欢听音乐的小伙伴,资金又比较紧张,是那么的不友好。作为程序员的我,也是喜欢听着歌,敲着代码。 最近就想做一个音乐播放器的软件,在内网中使…...

【Dify】Dify自定义模型设置 | 对接DMXAPI使用打折 Openai GPT 或 Claude3.5系列模型方法详解

一、Dify & DMXAPI 1、Dify DIFY(Do It For You)是一种自动化工具或服务,旨在帮助用户简化操作,减少繁琐的手动操作,提升工作效率。通过DIFY,用户能够快速完成任务、获取所需数据,并且可以…...

【Rust自学】10.8. 生命周期 Pt.4:方法定义中的生命周期标注与静态生命周期

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 10.8.1. 方法定义中的生命周期标注 还记得在上一篇文章 10.7. 生命周期 Pt.3 中所提到的省略生命周期的三条规则吗: 规则1&…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如&#xff1a…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...