GD32F103VE窗口看门狗定时器

news2024/12/23 5:23:44

GD32F103VE窗口看门狗定时器

看门狗定时器(WDGT)有两个:
1,独立看门狗定时器(FWDGT)
2,窗口看门狗定时器(WWDGT)

窗口看门狗定时器开启后,其7位向下递减计数器工作。
当"向下递减计数器"的计数值达到"预设的窗口值"时,会命令CPU复位;
为了不让窗口看门狗定时器产生复位CPU信号,必须按时设置"窗口看门狗定时器"计数器初始值,避免其引起CPU复位。

#include "WWDGT.h"
#include "stdio.h" //使能sprintf(),printf()

/*
看门狗定时器(WDGT)有两个:
1,独立看门狗定时器(FWDGT)
2,窗口看门狗定时器(WWDGT)

窗口看门狗定时器开启后,其7位向下递减计数器工作。
当"向下递减计数器"的计数值达到"预设的窗口值"时,会命令CPU复位;
为了不让窗口看门狗定时器产生复位CPU信号,必须按时设置"窗口看门狗定时器"计数器初始值,避免其引起CPU复位。
*/

void WWDGT_Init(void);
void Check_WWDGT_Reset(void);
void MySysRstSrcRecord(void);

//函数功能:配置"窗口看门狗定时器",更新"计数器初始值"的时间t满足,28.5ms<t<38.8ms
void WWDGT_Init(void)
{
	rcu_periph_clock_enable(RCU_WWDGT);//使能RCU_WWDGT外设时钟,enable WWDGT clock

	wwdgt_config(127, 80, WWDGT_CFG_PSC_DIV8);
	//设置"窗口看门狗定时器"计数器初始值为127,预设的窗口值为80,预分频器值为8
	//因为:CK_SYS经过AHB和APB1预分频器得到PCLK1,PCLK1最大为54MHz,PCLK1/4096为"窗口看门狗定时器"的预分频器输入时钟
	//所以"窗口看门狗定时器"时钟 = (PCLK1/4096)/8
	//假定PCLK1=54MHz,则"窗口看门狗定时器"时钟 = (54/4096)/8= 1648MHz,即单一脉冲时间为606.8us
	//refresh window is: ~606.8 * (127-80)= 28.5ms < refresh window < ~606.8 * (127-63) =38.8ms.
	//如果想再次设置"窗口看门狗定时器"的计数器初始值,则时间t满足,28.5ms<t<38.8ms

	wwdgt_enable();
	//wwdgt_counter_update(127);//喂狗,update WWDGT counte
}

//函数功能:检查"窗口看门狗定时器"是否复位
void Check_WWDGT_Reset(void)
{
	if(RESET != rcu_flag_get(RCU_FLAG_WWDGTRST))
	{//读取"窗口看门狗定时器复位标志"
		rcu_all_reset_flag_clear();//清除CPU的"所有复位标志位"
		printf("\r\nWWDG reset!");
	}
}

/*
RCU_FLAG_IRC8MSTB:内部部8MHz时钟源稳定标志,IRC8M stabilization flag
RCU_FLAG_HXTALSTB:外部4~16MHz时钟源稳定标志,HXTAL stabilization flag
RCU_FLAG_PLLSTB:PLL时钟稳定标志,PLL stabilization flag
//RCU_FLAG_PLL1STB:PLL1时钟稳定标志,PLL1 stabilization flag(CL series only)
//RCU_FLAG_PLL2STB:PLL2时钟稳定标志,PLL2 stabilization flag(CL series only)
RCU_FLAG_LXTALSTB:外部32.768KHz的时钟源稳定标志,LXTAL stabilization flag
RCU_FLAG_IRC40KSTB:内部RC的40KHz时钟源稳定标志,IRC40K stabilization flag
RCU_FLAG_EPRST:外部引脚复位标志,external PIN reset flag
RCU_FLAG_PORRST:电源复位标志,power reset flag
RCU_FLAG_SWRST:软件复位标志,software reset flag
RCU_FLAG_FWDGTRST:独立看门狗定时器复位标志,free watchdog timer reset flag
RCU_FLAG_WWDGTRST:窗口看门狗定时器复位标志,window watchdog timer reset flag
RCU_FLAG_LPRST:低功耗复位标志,深度睡眠/待机复位发生时由硬件置位,low-power reset flag
*/
u8 MyReset_Buffer[11];
//函数功能:打印CPU复位原因
void MySysRstSrcRecord(void)
{
	u8 i;

	for(i=0;i<11;i++) MyReset_Buffer[i]=0;//清除

	MyReset_Buffer[0] = rcu_flag_get(RCU_FLAG_IRC8MSTB);//读取"内部部8MHz时钟源稳定标志"
  MyReset_Buffer[1] = rcu_flag_get(RCU_FLAG_HXTALSTB);//读取"外部4~16MHz时钟源稳定标志"
  MyReset_Buffer[2] = rcu_flag_get(RCU_FLAG_PLLSTB);  //读取"PLL时钟稳定标志"
  MyReset_Buffer[3] = rcu_flag_get(RCU_FLAG_LXTALSTB);//读取"外部32.768KHz的时钟源稳定标志"
	MyReset_Buffer[4] = rcu_flag_get(RCU_FLAG_IRC40KSTB);//读取"内部RC的40KHz时钟源稳定标志"

  MyReset_Buffer[5] = rcu_flag_get(RCU_FLAG_EPRST);    //读取"外部引脚复位标志"
	MyReset_Buffer[6] = rcu_flag_get(RCU_FLAG_PORRST);   //读取"电源复位标志"
  MyReset_Buffer[7] = rcu_flag_get(RCU_FLAG_SWRST);    //读取"软件复位标志"
  MyReset_Buffer[8] = rcu_flag_get(RCU_FLAG_FWDGTRST); //读取"独立看门狗定时器复位标志"
	MyReset_Buffer[9] = rcu_flag_get(RCU_FLAG_WWDGTRST); //读取"窗口看门狗定时器复位标志"
	MyReset_Buffer[10] = rcu_flag_get(RCU_FLAG_LPRST);   //读取"低功耗复位标志"
	if( MyReset_Buffer[0] ) printf("\r\nIRC8M OK!");
	if( MyReset_Buffer[1] ) printf("\r\nHXTAL OK!");
	if( MyReset_Buffer[2] ) printf("\r\nPLL OK!");
	if( MyReset_Buffer[3] ) printf("\r\nLXTAL OK!");
	if( MyReset_Buffer[4] ) printf("\r\nIRC40K OK!");

	if( MyReset_Buffer[5] ) printf("\r\nPIN reset!");
	if( MyReset_Buffer[6] ) printf("\r\nPOR reset!");
	if( MyReset_Buffer[7] ) printf("\r\nSWR reset!");
	if( MyReset_Buffer[8] ) printf("\r\nIWDG reset!");
	if( MyReset_Buffer[9] ) printf("\r\nWWDG reset!");
	if( MyReset_Buffer[10] ) printf("\r\nLPWR reset!");

  rcu_all_reset_flag_clear();//清除CPU的"所有复位标志位"
}

main.c程序如下:

#include "gd32f10x.h" //使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t,bool
#include "delay.h"
#include "WWDGT.h"
#include "stdio.h"  //使能printf(),sprintf()

#include "UART3.h"

uint8_t Main_Count;
uint8_t Main_Cnt;

const char CPU_Reset_REG[]="\r\nCPU reset!\r\n";
const char CPU_Is_Running_REG[]="\r\nCPU is running!\r\n";
int main(void)
{

	//NVIC_PRIGROUP_PRE4_SUB0:抢占优先级为4bit(取值为0~15),子优先级为0bit(没有响应优先级)
	//NVIC_PRIGROUP_PRE3_SUB1:抢占优先级为3bit(取值为0~7),子优先级为1bit(取值为0~1)
	//NVIC_PRIGROUP_PRE2_SUB2:抢占优先级为2bit(取值为0~3),子优先级为2bit(取值为0~3)
	//NVIC_PRIGROUP_PRE1_SUB3:抢占优先级为1bit(取值为0~1),子优先级为3bit(取值为0~7)
	//NVIC_PRIGROUP_PRE0_SUB4:抢占优先级为0bit(没有抢占优先级),子优先级为3bit(取值为0~15)
	nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);//设置系统中断优先级"抢占优先级为4bit,子优先级为0bit"
  INTX_ENABLE();//开启所有中断
	GD32F103_UART3_Init(115200);

	printf("%s",CPU_Reset_REG);//调试串口输出"\r\nCPU reset!\r\n"
	MySysRstSrcRecord();

	delay_init();

//	Check_WWDGT_Reset();//检查"窗口看门狗定时器"是否复位
	WWDGT_Init();//配置"窗口看门狗定时器",更新"计数器初始值"的时间t满足,28.5ms<t<38.8ms
	Main_Count=0;
	Main_Cnt=0;
	while(1)
	{
		delay_ms(30);//配置"窗口看门狗定时器",更新"计数器初始值"的时间t满足,28.5ms<t<38.8ms,所以这里需要延时30ms

		if(Main_Count<10)//30*30*10=9000毫秒后,不再喂狗
			wwdgt_counter_update(127);//喂狗,update WWDGT counte

		Main_Cnt++;
		if(Main_Cnt>=30)//每隔30*30=900毫秒,串口输出一次数据
		{
			Main_Count++;
			printf("%s",CPU_Is_Running_REG);//调试串口输出"\r\nCPU is running!\r\n"
			Main_Cnt=0;
		}
	}
}

 

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

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

相关文章

【Unity3D】消融特效

1 前言 选中物体消融特效中基于 Shader 实现了消融特效&#xff0c;本文将基于 Shader Graph 实现消融特效&#xff0c;两者原理一样&#xff0c;只是表达方式不同&#xff0c;另外&#xff0c;选中物体消融特效中通过 discard 丢弃片元&#xff0c;本文通过 alpha 测试丢弃片元…

Linux中su/su -/sudo的区别

参考Linux中su/su -/sudo的区别 - 知乎 Linux中su/su -/sudo的区别 程序员张同学 ​ 深圳市悦照琉璃科技有限公司 全栈工程师 6 人赞同了该文章 在linux中会经常使用到su/su -/sudo这三个命令&#xff0c;总结一下这三个命令的区别。 su 使用root密码&#xff0c;切换到…

动力节点|Java零基础教程,老杜带你一套通关Java基础

对于零基础自学Java来说&#xff0c;Java的学习过程可能会有一些困难&#xff0c;但只要掌握了相关的基础知识和技能&#xff0c;就可以很快地上手。 Java需要循序渐进而且系统的学习&#xff0c;基础不牢地动山摇&#xff0c;一套全面且适合零基础自学的入门教程&#xff0c;尤…

类的定义

一、定义类 类&#xff08;class&#xff09;是用户自定义数据类型。如果程序中要使用类类型&#xff0c;必须根据实际需要定义&#xff0c;或者使用已设计好的类。 class 类名 {成员列表 }; 类可以没有成员&#xff0c;也可以有多个成员。类成员可以是数据或者函数。所有成…

Java项目作业~ 创建基于Maven的Java项目,连接数据库,实现对站点信息的管理,即实现对站点的新增,修改,删除,查询操作

需求&#xff1a; 创建基于Maven的Java项目&#xff0c;连接数据库&#xff0c;实现对站点信息的管理&#xff0c;即实现对站点的新增&#xff0c;修改&#xff0c;删除&#xff0c;查询操作。 以下是站点表的建表语句&#xff1a; CREATE TABLE websites (id int(11) NOT N…

动态路由协议 ospf

动态路由协议的分类 rip : 距离矢量路由协议&#xff08;容易产生环路&#xff09;ospf&#xff1a; 链路状态路由协议&#xff08;比较耗费资源&#xff0c;但是链路准确性好&#xff09;bgp&#xff1a; 外部网关协议 RIP OSPF LSA泛洪 LSDB维护 SPF计算&#xff08;最短路…

指令重排相关

指令流水线所带来的一些问题 结构冒险 流水线中出现硬件资源竞争 数据冒险 流水线中后面的指令需要等待前面指令完成数据的读写 控制冒险 流水线需要个怒前面指令的执行结果来决定下一步去哪儿之行 为了解决指令流水线的数据冒险所带来的停顿、CPU 搞了个乱序执行。 在遇到数…

关于Godot游戏引擎制作流水灯

先上核心代码 游戏节点 流水灯的通途可以是 1. 装饰 2. 音乐类多媒体程序&#xff08;如FL中TB-303的步进灯&#xff09; FL Studio Transistor Bass

TypeScript 中【class类】与 【 接口 Interfaces】的联合搭配使用解读

导读&#xff1a; 前面章节&#xff0c;我们讲到过 接口&#xff08;Interface&#xff09;可以用于对「对象的形状&#xff08;Shape&#xff09;」进行描述。 本章节主要介绍接口的另一个用途&#xff0c;对类的一部分行为进行抽象。 类配合实现接口 实现&#xff08;impleme…

8.7工作总结

一、我们想自定义一个titileBar出现如下这种情况&#xff0c;发现他原来的titileBar还未隐藏。 后来我尝试修改主题使得他没有主题noActionBar发现也不行&#xff0c;后来我参考原先我看过的项目使用了如下代码 this.getActionBar().hide();发现会报这个错误java.lang.NullPoi…

30.基于XML的声明式事务

基于XML的声明式事务 主要是使用XML去代替注解&#xff0c;来实现起到代替注解的作用&#xff0c;实际使用频率很低 将BookServiceImpl.java中的Transactional注解删除&#xff0c;确保用户余额充足 spring-tx-xml.xml <?xml version"1.0" encoding"UTF-8…

Android AccessibilityService研究

AccessibilityService流程分析 AccessibilityService开启方式AccessibilityService 开启原理 AccessibilityService开启方式 . 在Framework里直接添加对应用app 服务component。 loadSetting(stmt, Settings.Secure.ACCESSIBILITY_ENABLED,1); loadSetting(stmt, Settings.Se…

mybatis-plus的update方法,到底会不会更新null值?看这一篇就够了

普通的设置值。需要传入一个Wrapper对象 默认情况下是不会更新null值的&#xff0c;也就是只更新设置值的字段 LambdaUpdateWrapper<OrderChildRoom> orderChildRoomUpdateWrapper new LambdaUpdateWrapper<>();orderChildRoomUpdateWrapper.set(OrderChildRoo…

【PDF密码】PDF文件不能打印,为什么?

正常的PDF文件是可以打印的&#xff0c;如果PDF文件打开之后发现文件不能打印&#xff0c;我们需要先查看一下自己的打印机是否能够正常运行&#xff0c;如果打印机是正常的&#xff0c;我们再查看一下&#xff0c;文件中的打印功能按钮是否是灰色的状态。 如果PDF中的大多数功…

面试热题(滑动窗口最大值)

给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7], k 3 输出&#xff1a;[3,3,5,…

SpringCloud实用篇1——eureka注册中心 Ribbon负载均衡原理 nacos注册中心

目录 1 微服务1.1 微服务的演变1.2 微服务1.3 SpringCloud1.4 小结 2 服务拆分及远程调用2.1 服务拆分2.2 服务拆分案例2.3 实现远程调用2.4 提供者与消费者 3 Eureka注册中心3.1 Eureka的结构和作用3.2 搭建eureka-server3.3 服务注册3.4 服务发现 4 Ribbon负载均衡4.1 负载均…

ubuntu18.04安装docker及docker基本命令的使用

官网安装步骤&#xff1a;https://docs.docker.com/desktop/install/ubuntu/ docker快速入门教程 Ubuntu-Docker安装和使用 docker官网 docker-hub仓库 1、常用指令 &#xff08;1&#xff09;镜像操作 # ############################# 以nginx为例 docker images docker p…

爬虫010_列表高级_添加_append_extend_修改_查询_in_not int_删除_del_pop_remove---python工作笔记029

然后再来看列表操作 首先添加append方法 然后插入,坐标是要插入的下标,右边是插入的内容 看结果 1,2,3,4,5,6 然后这个extend,是逐个插入,放到后边 然后是修改,直接对下标赋值 看结果</

宝塔面板点击SSL闪退打不开怎么解决?

宝塔Linux面板点击SSL证书闪退如何解决&#xff1f;旧版本的宝塔Linux面板确实存在这种情况&#xff0c;如何解决&#xff1f;升级你的宝塔Linux面板即可。新手站长分享宝塔面板SSL闪退的解决方法&#xff1a; 宝塔面板点击SSL证书闪退解决方法 问题&#xff1a;宝塔Linux面板…