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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++初阶—CC++内存管理

第一章:C/C内存分布 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int* ptr1 (int*)malloc(si…

排序的本质、数据类型及算法选择

排序的本质、数据类型及算法选择 一、排序的本质二、排序的数据类型三、排序算法的选择依据 前两天老金写了篇 “十大排序简介”,有点意犹未尽,这一回老金想把排序连根拔起,从排序的本质说道说道。 一、排序的本质 从字面上理解&#xff0c…

arcgisPro加载天地图(CGCS2000)影像

1、注册天地图账号; 2、申请key; 3、添加WMTS服务器。 这里已经办好了前两步,下面详细介绍最后一步。 添加WMTS服务器。 在天地图网站,找到如下页面, 复制网址,如:http://t0.tianditu.gov.cn…

【测试】持续集成CI/CD

近期更新完毕,建议关注收藏点赞~ 目录 概括gitJenkinspostman集成jenkins代码集成jenkins 概括 CI/CD stands for Continuous Integration and Continuous Deployment 定义 团队成果持续集成到公共平台。一天可以集成1次or多次 本地代码管理 git 远程代…

python基础和redis

1. Map函数 2. filter函数 numbers generate_numbers() filtered_numbers filter(lambda x: x % 2 0, numbers) for _ in range(5):print(next(filtered_numbers)) # 输出: 0 2 4 6 83. filter map 和 reduce 4. picking and unpicking 5. python 没有函数的重载&#xff0…

【再谈设计模式】模板方法模式 - 算法骨架的构建者

一、引言 在软件工程、软件开发过程中,我们经常会遇到一些算法或者业务逻辑具有固定的流程步骤,但其中个别步骤的实现可能会因具体情况而有所不同的情况。模板方法设计模式(Template Method Design Pattern)就为解决这类问题提供了…

安卓app抓包总结(精)

前言 这里简单记录一下相关抓包工具证书的安装 burp证书安装 安装证书到移动设备(安卓7以后必须上传到设备系统根证书上) 导出证书 openssl x509 -inform DER -in cacert.der -out cacert.pem 转换格式 openssl x509 -inform PEM -subject_hash_old -in cacert.pem …

【pycharm发现找不到python打包工具,且无法下载】

发现找不到python打包工具,且无法下载 解决方法: 第一步:安装distutils,在CMD命令行输入: python -m ensurepip --default-pip第二步:检查和安装setuptools和wheel: python -m pip install --upgrade …

2025年VGC大众汽车科技社招入职测评综合能力英语口语SHL历年真题汇总、考情分析

早在1978年,大众汽车集团就开始了与中国的联系。1984年,集团在华的第一家合资企业—上汽大众汽车有限公司奠基成立;1991年,一汽-大众汽车有限公司成立;2017年,大众汽车(安徽)有限公司…

【NLP 18、新词发现和TF·IDF】

目录 一、新词发现 1.新词发现的衡量标准 ① 内部稳固 ② 外部多变 2.示例 ① 初始化类 NewWordDetect ② 加载语料信息,并进行统计 ③ 统计指定长度的词频及其左右邻居字符词频 ④ 计算熵 ⑤ 计算左右熵 ​编辑 ⑥ 统计词长总数 ⑦ 计算互信息 ⑧ 计算每个词…

30天开发操作系统 第 12 天 -- 定时器 v1.0

前言 定时器(Timer)对于操作系统非常重要。它在原理上却很简单,只是每隔一段时间(比如0.01秒)就发送一个中断信号给CPU。幸亏有了定时器,CPU才不用辛苦地去计量时间。……如果没有定时器会怎么样呢?让我们想象一下吧。 假如CPU看不到定时器而仍想计量时…

图漾相机基础操作

1.客户端概述 1.1 简介 PercipioViewer是图漾基于Percipio Camport SDK开发的一款看图软件,可实时预览相机输出的深度图、彩色图、IR红外图和点云图,并保存对应数据,还支持查看设备基础信息,在线修改gain、曝光等各种调节相机成像的参数功能…

【好书推荐】数字化转型参考书籍Rewired

Rewired 封面 图片来源:https://e.dangdang.com/products/1901358558.html 如果做企业数字化转型工作,只能推荐一本书,我会推荐2024年6月中信出版社出版的Rewired 《麦肯锡讲全球企业数字化》。 果总为这本书写了一篇推荐,供大…

WPF控件Grid的布局和C1FlexGrid的多选应用

使用 Grid.Column和Grid.Row布局,将多个C1FlexGrid布局其中,使用各种事件来达到所需效果,点击复选框可以加载数据到列表,移除列表的数据,自动取消复选框等 移除复选框的要注意!!!&am…

ffmpeg7.0 合并2个 aac 文件

ffmpeg7.0 将2个aac文件合并。 #include <stdio.h>// 之所以增加__cplusplus的宏定义&#xff0c;是为了同时兼容gcc编译器和g编译器 #ifdef __cplusplus extern "C" { #endif #include <libavformat/avformat.h> #include <libavcodec/avcodec.h>…

FreePBX 17 on ubuntu24 with Asterisk 20

版本配置&#xff1a; FreePBX 17&#xff08;最新&#xff09; Asterisk 20&#xff08;最新Asterisk 22&#xff0c;但是FreePBX 17最新只支持Asterisk 21&#xff0c;但是21非LTS版本&#xff0c;所以选择Asterisk 20&#xff09; PHP 8.2 Maria DB (v10.11) Node J…

2025-微服务—SpringCloud-1~3

2025-微服务—SpringCloud 第一章、从Boot和Cloud版本选型开始说起1、Springboot版本2、Springcloud版本3、Springcloud Alibaba4、本次讲解定稿版 第二章 关于Cloud各种组件的停更/升级/替换1、微服务介绍2、SpringCloud是什么&#xff1f;能干吗&#xff1f;产生背景&#xf…

php常用开发框架性能对比

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、框架简介&#xff1f;1.1 webman1.2 CodeIgniter(CI框架)1.3 ThinkPHP1.4 Laravel1.5 EasySwoole 二、压测对比1.机器配置2.webman压测2. ThinkPHP压测3. L…

新闻发布及管理系统

文末附有完整项目代码 在信息飞速传播的时代&#xff0c;新闻发布及管理系统变得愈发重要。本文将详细介绍如何设计并实现这样一个系统。 一、项目背景 随着电脑、智能手机等设备的普及&#xff0c;各种网站应运而生。而信息发布是网络的一大特点&#xff0c;人们上网主要是为…

sklearn-逻辑回归-制作评分卡

目录 数据集处理 分箱 分多少个箱子合适 分箱要达成什么样的效果 对一个特征进行分箱的步骤 分箱的实现 封装计算 WOE 值和 IV值函数 画IV曲线&#xff0c;判断最佳分箱数量 结论 pd.qcut 执行报错 功能函数封装 判断分箱个数 在银行借贷场景中&#xff0c;评分卡是…