PY32F003F18之窗口看门狗
一、PY32F003F18窗口看门狗特点:
即使窗口看门狗被禁止,窗口看门狗的"递减计数器"也会继续递减计数。
二、窗口看门狗复位的条件:
1、将"控制寄存器WWDG_CR"中的WDGA=1,激活"窗口看门狗计数器等于0x3F"时,则产生复位
2、装载"窗口看门狗的计数器值"大于"窗口看门狗window寄存器的值",则产生复位。
3、窗口看门狗的"提前唤醒中断EWI=1",且"窗口看门狗递减计数器的值"达到0x40时,则产生EWI中断。
其中断处理程序处理完后,则产生复位。
4、装载"窗口看门狗计数器值"的条件:
递减计数器的值小于或等于窗口寄存器的数值,并且大于0x3F时,才可以向"窗口看门狗计数器值"写入新值,否则会引起复位。
三、窗口看门狗框图:

四、窗口看门狗装载计数器值的时间图:

五、测试程序:
#include "WWDG.h"
#include "stdio.h" //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()/*
即使窗口看门狗被禁止,窗口看门狗的"递减计数器"也会继续递减计数;
窗口看门狗复位的条件:
1、将"控制寄存器WWDG_CR"中的WDGA=1,激活"窗口看门狗计数器等于0x3F"时,则产生复位
2、装载"窗口看门狗的计数器值"大于"窗口看门狗window寄存器的值",则产生复位。
3、窗口看门狗的"提前唤醒中断EWI=1",且"窗口看门狗递减计数器的值"达到0x40时,则产生EWI中断。
其中断处理程序处理完后,则产生复位。
4、装载"窗口看门狗计数器值"的条件:
递减计数器的值小于或等于窗口寄存器的数值,并且大于0x3F时,才可以向"窗口看门狗计数器值"写入新值,
否则会引起复位。
*/uint32_t WWDG_Config(void);
void WWDG_Counter_Reload(void);
void SysRstSrcRecord(void);uint32_t WWDG_Config(void)
{WWDG_HandleTypeDef WwdgHandle;uint32_t timeoutvalue = 0;uint32_t pclk1 = 0;uint32_t wdgtb = 0;__HAL_RCC_WWDG_CLK_ENABLE(); //使能WWDG时钟WwdgHandle.Instance = WWDG; //选择WWDGWwdgHandle.Init.EWIMode = WWDG_EWI_DISABLE; //窗口看门狗计数器值到达0x40时不会产生中断WwdgHandle.Init.Prescaler = WWDG_PRESCALER_8; //窗口看门狗的预分频器值:选择8分频WwdgHandle.Init.Counter = 0x7F; //窗口看门狗计数器值(7位): 0x7FWwdgHandle.Init.Window = WWDG_Window_Value; //窗口看门狗窗口值(7位): 0x40~0x7fHAL_WWDG_Init(&WwdgHandle);//WWDG初始化
//hwwdg->Init.EWIMode=WWDG_EWI_ENABLE,使能窗口看门狗计数器值到达0x40时产生中断
//hwwdg->Init.EWIMode=WWDG_EWI_DISABLE,窗口看门狗计数器值到达0x40时不会产生中断
//hwwdg->Init.Prescaler表示窗口看门狗的预分频器值
//窗口看门狗产生复位的时间: (hwwdg->Init.Counter - hwwdg->Init.Window + 1 ) * tPCLK * 4096 * 窗口看门狗的预分频器值timeoutvalue=(WwdgHandle.Init.Counter - WwdgHandle.Init.Window) + 1;//计算"窗口看门狗计数器值"和"窗口看门狗窗口值"的差pclk1 = HAL_RCC_GetPCLK1Freq();//获取PCLK的值wdgtb = (1 << ((WwdgHandle.Init.Prescaler) >> 7)); //获取分频值,2^WDGTB[1:0]timeoutvalue = ((4096 * wdgtb * timeoutvalue) / (pclk1 / 1000));//计算超时时间return(timeoutvalue);//返回"窗口看门狗的复位时间",单位为毫秒
}//函数功能:喂狗
void WWDG_Counter_Reload(void)
{WRITE_REG(WWDG->CR,0x7F);//Write to WWDG CR the WWDG Counter value to refresh with 0x7F
}//函数功能:打印CPU复位原因
void SysRstSrcRecord(void)
{uint8_t i;uint8_t Reset_Buffer[11];for(i=0;i<11;i++) Reset_Buffer[i]=0;//清除Reset_Buffer[0] = __HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY);//读取"内部部24MHz时钟源稳定标志"Reset_Buffer[1] = __HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY);//读取"外部4~32MHz时钟源稳定标志"
// Reset_Buffer[2] = __HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY); //读取"PLL时钟稳定标志"
// Reset_Buffer[3] = __HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY);//读取"外部32.768KHz的时钟源稳定标志"Reset_Buffer[4] = __HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY);//读取"内部RC的32KHz时钟源稳定标志"Reset_Buffer[5] = __HAL_RCC_GET_FLAG(RCC_FLAG_PINRST); //读取"外部引脚复位标志"Reset_Buffer[6] = __HAL_RCC_GET_FLAG(RCC_FLAG_PWRRST); //读取"BOR/POR/PDR复位标志"Reset_Buffer[7] = __HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST); //读取"软件复位标志"Reset_Buffer[8] = __HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST); //读取"独立看门狗定时器复位标志"Reset_Buffer[9] = __HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST); //读取"窗口看门狗定时器复位标志"Reset_Buffer[10] = __HAL_RCC_GET_FLAG(RCC_FLAG_OBLRST); //读取"Option byte loader复位标志"if( Reset_Buffer[0] ) printf("\r\nHSI OK!");if( Reset_Buffer[1] ) printf("\r\nHSE OK!");
// if( Reset_Buffer[2] ) printf("\r\nPLL OK!");
// if( Reset_Buffer[3] ) printf("\r\nLXTAL OK!");if( Reset_Buffer[4] ) printf("\r\nLSI OK!");if( Reset_Buffer[5] ) printf("\r\nPIN reset!");if( Reset_Buffer[6] ) printf("\r\nPOR reset!");if( Reset_Buffer[7] ) printf("\r\nSWR reset!");if( Reset_Buffer[8] ) printf("\r\nIWDG reset!");if( Reset_Buffer[9] ) printf("\r\nWWDG reset!");if( Reset_Buffer[10] ) printf("\r\nOption byte loader reset!");
}
#ifndef __WWDG_H
#define __WWDG_H#include "py32f0xx_hal.h"#define WWDG_Window_Value 0x50#define _HAL_WWDG_ENABLE(__INSTANCE__) SET_BIT((__INSTANCE__)->CR, WWDG_CR_WDGA)
//将"控制寄存器WWDG_CR"中的WDGA=1,激活"窗口看门狗计数器等于0x3F"时产生复位#define Get_WWDG_Counter(__INSTANCE__) ( (__INSTANCE__)->CR & (~WWDG_CR_WDGA) )
//读窗口计数器的值extern uint32_t WWDG_Config(void);
extern void WWDG_Counter_Reload(void);
extern void SysRstSrcRecord(void);
#endif /* __WWDG_H */
#include "py32f0xx_hal.h"
#include "SystemClock.h"
#include "delay.h"
#include "LED.h"
#include "SystemClock.h"
#include "USART2.h"
#include "stdio.h" //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()
#include "string.h" //使能strcpy(),strlen(),memset()
#include "WWDG.h"const char CPU_Reset_REG[]="\r\nCPU reset!\r\n";int main(void)
{uint32_t delay;HSE_Config();
// HAL_Init();//systick初始化delay_init();
// HAL_Delay(1000);USART2_Init(115200);//PA0是为USART2_TX,PA1是USART2_RX//中断优先级为0x01//波特率为115200,数字为8位,停止位为1位,无奇偶校验,允许发送和接收数据,只允许接收中断,并使能串口printf("%s",CPU_Reset_REG);SysRstSrcRecord();MCU_LED_Init();TIM1_LED_Init();delay=WWDG_Config();while (1){MCU_LED_Toggle();
// HAL_Delay(delay+5);if( Get_WWDG_Counter(WWDG) <= WWDG_Window_Value)//喂狗时间到WWDG_Counter_Reload();//喂狗}
}
六、测试结果

相关文章:
PY32F003F18之窗口看门狗
一、PY32F003F18窗口看门狗特点: 即使窗口看门狗被禁止,窗口看门狗的"递减计数器"也会继续递减计数。 二、窗口看门狗复位的条件: 1、将"控制寄存器WWDG_CR"中的WDGA1,激活"窗口看门狗计数器等于0x3F"时,则产…...
SpingBoot:整合Mybatis-plus+Druid+mysql
SpingBoot:整合Mybatis-plusDruid 一、特别说明二、创建springboot新工程三、配置3.1 配置pom.xml文件3.2 配置数据源和durid连接池3.2.1 修改application.yml3.2.2 新增mybatis-config.xml 3.3 编写拦截器配置类 四、自动生成代码五、测试六、编写mapper.xml&#…...
计算机视觉与深度学习-经典网络解析-VGG-[北邮鲁鹏]
目录标题 VGG参考VGG网络贡献使用尺寸更小的$3 \times 3$卷积串联来获得更大的感受野放弃使用$11 \times 11$和$5 \times 5$这样的大尺寸卷积核深度更深、非线性更强,网络的参数也更少;去掉了AlexNet中的局部响应归一化层(LRN)层。 网络结构主要改进输入…...
入门级制作电子期刊的网站推荐
随着数字化时代的到来,越来越多的人开始尝试制作自己的电子期刊。如果你也是其中的一员,那么这篇文章可以帮助你制作电子期刊。无论是初学者还是有一定经验的制作者,都能快速完成高质量的电子期刊制作 小编经常使用的工具是-----FLBOOK在线制…...
软件测试内容整理
1. 软件测试 1.1. 定义 软件测试(英语:Software Testing),描述一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。换句话说,软件测试是一种实际输出与预期输出之间的审核或者比较过程。 软件测试的经典定…...
UniAccess Agent卸载
异常场景: UniAccess Agent导致系统中的好多设置打不开 例如:ipv4的协议,注册表,host等等 需要进行删除,亲测有效,及多家答案平凑的 借鉴了这位大神及他里面引用的大神的内容 https://blog.csdn.net/weixin_44476410/article/details/121605455 问题描述 这个进…...
【C++】C++11——构造、赋值使用条件和生成条件
移动构造和移动赋值生成条件移动构造和移动赋值调用逻辑强制生成默认函数的关键字default禁止生成默认函数的关键字delete 移动构造和移动赋值生成条件 C11中新增的移动构造函数和移动赋值函数的生成条件为: 移动构造函数的生成条件:没有自己实现的移动…...
【LeetCode热题100】--56.合并区间
56.合并区间 排序: 如果按照区间的左端点排序,那么在排完序的列表中,可以合并的区间一定是连续的,如下图所示,标记为蓝色、黄色和绿色的区间分别可以合并为一个大区间,它们在排完序的列表中是连续的 算法&a…...
opencv dnn模块 示例(17) 目标检测 object_detection 之 yolo v5
在前文【opencv dnn模块 示例(16) 目标检测 object_detection 之 yolov4】介绍的yolo v4后的2个月,Ultralytics发布了YOLOV5 的第一个正式版本,其性能与YOLO V4不相伯仲。 文章目录 1、Yolo v5 和 Yolo v4 的区别说明1.1、Data Augmentation - 数据增强1…...
关于安卓SVGA浅尝(一)svgaplayer库的使用
关于安卓SVGA浅尝(一)使用 相关链接 SVGA官网 SVGA-github说明文档 背景 项目开发,都会和动画打交道,动画的方案选取,就有很多选择。如Json动画,svga动画,gif等等。各有各的优势。目前项目中…...
【LFU】一文让你弄清 Redis LFU 页面置换算法
上一次,相信大家已经知道关于 LRU 页面置换算法的思想和实现了,这里可以一键直达: 【LRU】一文让你弄清 Redis LRU 页面置换算法 Redis 的淘汰策略中,关于 LFU 页面置换算法,今天咱们来捋一捋到底思想是啥࿰…...
Python爬虫实战:用简单四步爬取小红书图片
小红书是一个热门的社交分享平台,汇聚了大量精美的图片。如果您希望保存或使用这些图片,本文将为您详细介绍如何使用Python爬虫轻松爬取小红书图片。 一、安装必要的库 在开始之前,确保您已经安装了以下Python库: requests&#…...
行为型模式-解释器模式
提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。 意图:给定一个语言,定义它的文法表示,并定义一个解释…...
Linux系统编程(五):信号
参考引用 UNIX 环境高级编程 (第3版)黑马程序员-Linux 系统编程 1. 信号基础理论 1.1 概念和机制 概念 信号在生活中随处可见,如:古代战争中摔杯为号、现代战争中的信号弹、体育比赛中使用的信号枪他们都有共性:简单、不能携带大量信息、满足…...
学习路之工具--SecureCRT的下载、安装
百度盘: 链接: https://pan.baidu.com/s/1r3HjEj053cKys54DTqLM4A?pwdgcac 提取码: gcac 复制这段内容后打开百度网盘手机App,操作更方便哦 感谢大佬 简单介绍下SecureCRT SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序&a…...
软件定义网络-OpenvSwitch
软件定义网络(SDN)。它主要有以下三个特点: 控制与转发分离:转发平面就是一个个虚拟或者物理的网络设备,就像小区里面的一条条路。控制平面就是统一的控制中心,就像小区物业的监控室。它们原来是一起的&…...
Android Update Engine 分析(二十三)如何在升级后清除用户数据?
文章目录 0. 导读1. 擦除用户数据流程1.1 制作升级包阶段1. 制作升级包的 "--wipe-user-data" 选项2. 什么是 POWERWASH?1.2 OTA 升级阶段1. payload_properties.txt 文件中的 "POWERWASH=1"2. ApplyPayload 函数设置 InstallPlan3. PostinstallRunnerAct…...
分享从零开始学习网络设备配置--任务3.7 使用动态路由RIPv2实现网络连通
任务描述 某公司随着规模的不断扩大,路由器的数量开始有所增加。网络管理员发现原有的静态路由已经不适合现在的公司,实施动态路由RIPv2协议配置,实现网络中所有主机之间互相通信。 在路由器较多的网络环境中,手工配置静态路由…...
游戏录屏软件推荐,教你录制高清游戏视频
“有没有好用的游戏录屏软件推荐呀,最近当上了游戏主播,平台要求每天都要发一个游戏视频,可是我的游戏录屏软件太拉胯了,录制出来的视频非常糊,导致平台审核不通过,所以想问问大家有没有游戏录屏软件推荐一…...
四川眼科医院孙丰源教授团队为患者拔除1.4cm长“眼中钉”
在户外劳作进行一些危险性的操作时,如果不注意防护,就很容易造成一些意外事件发生。广元的张先生使用割草机除草时,被割草机断裂的锯片击伤了左眼,伤势严重,所幸在孙丰源教授团队的帮助下,及时获得了治疗&a…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
