GD32F103VE独立看门狗

news2024/10/7 18:21:16

GD32F103VE独立看门狗

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

独立看门狗定时器(FWDGT)有一个独立的时钟源(IRC40K).
独立看门狗定时器有一个向下计数器,当计数器到达0,会让CPU复位。
为了不让独立看门狗产生复位信号,必须向控制寄存器(FWDGT_CTL)中写0xAAAA,命令重装"计数器初始值";

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

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

独立看门狗定时器(FWDGT)有一个独立的时钟源(IRC40K).
独立看门狗定时器有一个向下计数器,当计数器到达0,会让CPU复位。
为了不让独立看门狗产生复位信号,必须向控制寄存器(FWDGT_CTL)中写0xAAAA,命令重装"计数器初始值";
*/

void IWDG_Config(void);
void SoftReset(void);
void SysRstSrcRecord(void);

//函数功能:设置看门狗复位周期为3.2秒
void IWDG_Config(void)
{
	rcu_osci_on(RCU_IRC40K);//启动"内部40KHz振荡器"
	while(SUCCESS != rcu_osci_stab_wait(RCU_IRC40K))
	{//等待"内部40KHz振荡器稳定"
	}

	//fwdgt_write_enable();//允许访问FWDGT_RLD(看门狗重装载寄存器)和FWDGT_PSC(看门狗预分频器寄存器)
	fwdgt_config((4000-1), FWDGT_PSC_DIV32);
//1,允许访问看门狗重装载寄存器和预分频器寄存器,
//2,设置IWDG重装载值为3999,重装载寄存器IWDG_RLR有12位值,设置IWDG预分频值为32,复位周期:4000*32/40KHz=3200ms
//3,喂狗
	//fwdgt_counter_reload();  //喂狗,按照IWDG重装载寄存器FWDGT_RLR的值重装载IWDG计数器
	fwdgt_enable();  //使能IWDG
}

//函数功能:使用软件复位CPU
void SoftReset(void)
{
	__set_FAULTMASK(1);//关闭所有中端

	//fwdgt_write_enable();//允许访问FWDGT_RLD(看门狗重装载寄存器)和FWDGT_PSC(看门狗预分频器寄存器)
	fwdgt_config((2-1), FWDGT_PSC_DIV64);
//1,允许访问看门狗重装载寄存器和预分频器寄存器,
//2,设置IWDG重装载值为1,重装载寄存器IWDG_RLR有12位值,设置IWDG预分频值为64,复位周期:1*64/40KHz=1.6ms
//3,喂狗
	//fwdgt_counter_reload();  //喂狗,按照IWDG重装载寄存器FWDGT_RLR的值重装载IWDG计数器
	fwdgt_enable();  //使能IWDG

	NVIC_SystemReset();//等待CPU复位
	//rcu_flag_get(RCU_FLAG_SWRST);
}

/*
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 Reset_Buffer[11];
//函数功能:打印CPU复位原因
void SysRstSrcRecord(void)
{
	u8 i;

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

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

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

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 "IWDG.h"
#include "stdio.h"  //使能printf(),sprintf()

#include "UART3.h"

uint8_t Main_Count;

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"
	SysRstSrcRecord();//系统复位记录

	IWDG_Config();//设置看门狗复位周期为3.2秒
	delay_init();
	Main_Count=0;
	while(1)
	{
		Main_Count++;
		delay_ms(500);
		printf("%s",CPU_Is_Running_REG);//调试串口输出"\r\nCPU is running!\r\n"

		if(Main_Count<10)//前10次"喂狗",10次后3.2秒,CPU复位
			fwdgt_counter_reload();  //喂狗,按照IWDG重装载寄存器FWDGT_RLR的值重装载IWDG计数器
	}
}

 

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

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

相关文章

二叉树的前序遍历、中序遍历、后序遍历、层次遍历的实现

DLR–前序遍历&#xff08;根在前&#xff0c;从左往右&#xff0c;一棵树的根永远在左子树前面&#xff0c;左子树又永远在右子树前面 &#xff09; LDR–中序遍历&#xff08;根在中&#xff0c;从左往右&#xff0c;一棵树的左子树永远在根前面&#xff0c;根永远在右子树前…

从0到1开发go-tcp框架【4实战片— — 开发MMO之玩家聊天篇】

从0到1开发go-tcp框架【实战片— — 开发MMO】 MMO&#xff08;MassiveMultiplayerOnlineGame&#xff09;&#xff1a;大型多人在线游戏&#xff08;多人在线网游&#xff09; 1 AOI兴趣点的算法 游戏中的坐标模型&#xff1a; 场景相关数值计算 ● 场景大小&#xff1a; 250…

Vue2:组件基础(下)

Vue2&#xff1a;组件基础&#xff08;下&#xff09; Date: April 12, 2023 Sum: props验证、计算属性、自定义时间、组件上的v-model、任务列表案例 Tags: * 目标&#xff1a; 能够知道如何对 props 进行验证 能够知道如何使用计算属性 令能够知道如何为组件自定义事件 …

K8S系列文章 之 容器网络基础 Docker0

什么是Docker0 使用ip addr命令看一下网卡&#xff1a; rootKitDevVps:~# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host…

火车头标题伪原创【php源码】

大家好&#xff0c;给大家分享一下python怎么读取文件中的数据&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 火车头采集ai伪原创插件截图&#xff1a; python是一门非常火爆且相对易学的编程语言&#xff0c;应用在各种场景。许多人想学…

VS code:Task

Task 微软官方连接&#xff1a; https://code.visualstudio.com/docs/editor/tasks what is Task 我们知道&#xff0c;vscode可以支持许多编程语言&#xff0c;很多语言是需要进行编译的&#xff0c;打包&#xff0c;测试… 有许多已有的工具支持这些流程&#xff0c;例如A…

Nginx(1)

目录 1.Nginx概述2.Nginx的特点3.Nginx主要功能1.反向代理2.负载均衡 1.Nginx概述 Nginx (engine x) 是一个自由的、开源的、高性能的HTTP服务器和反向代理服务器&#xff0c;也是一个IMAP、POP3、SMTP代理服务器。 Nginx是一个强大的web服务器软件&#xff0c;用于处理高并发…

【windows】windows上如何使用linux命令?

前言 windows上的bat命令感觉不方便&#xff0c;想在windows上使用linux命令。 有人提供了轮子&#xff0c;本文简单介绍一些该轮子的安装与使用&#xff0c;希望能够帮助到和我有一起需求的网友。 我的答案是busybox。 1.安装busybox.exe 在这个网站上安装busybox busyb…

---------------- 部署 Zookeeper 集群 ----------------

部署 Zookeeper 集群 1.安装前准备2.安装 Zookeeper修改配置文件在每个节点上创建数据目录和日志目录在每个节点的dataDir指定的目录下创建一个 myid 的文件配置 Zookeeper 启动脚本 //准备 3 台服务器做 Zookeeper 集群 192.168.109.1 192.168.109.2 192.168.109.3 1.安装前准…

前端学习---vue2--选项/数据--data-computed-watch-methods-props

写在前面&#xff1a; vue提供了很多数据相关的。 文章目录 data 动态绑定介绍使用使用数据 computed 计算属性介绍基础使用计算属性缓存 vs 方法完整使用 watch 监听属性介绍使用 methodspropspropsData data 动态绑定 介绍 简单的说就是进行双向绑定的区域。 vue实例的数…

Abaqus 中最常用的子程序有哪些 硕迪科技

在ABAQUS中&#xff0c;用户定义的子程序是一种重要的构件&#xff0c;可以将其插入到Abaqus分析中以增强该软件的功能和灵活性。这些子程序允许用户在分析过程中添加自定义材料模型、边界条件、初始化、加载等特定操作&#xff0c;以便更精准地模拟分析中的现象和现象。ABAQUS…

AirPods 充电接触不良问题修复

AirPods 充电接触不良问题修复 问题现象 从充电盒拿出耳机&#xff0c;一只耳机电量不满甚至完全没有电放入充电盒不充电&#xff0c;指示灯是绿色而非橙色多次尝试耳机能充电&#xff0c;但是合上盖子就无法充电 如果你的耳机出现上述症状&#xff0c;基本就是耳机充电接触…

一篇万能英语作文范文怎么写?聪明灵犀英语作文写作工具分享

一篇万能英语作文范文怎么写&#xff1f;英语作文是英语学习中不可或缺的一环&#xff0c;但是对于很多人来说&#xff0c;写作并不是一件容易的事情。本文将分享一些实用的英语作文写作工具&#xff0c;帮助你更好地写作。 1. 明确主题 写作之前&#xff0c;首先需要明确主题…

恒运资本:另类投资业务火热 券商“投行+”模式盛行

自科创板实行保荐组织跟投准则以来&#xff0c;各家券商纷繁开端树立特殊出资子公司以参加科创板项目的跟投&#xff0c;近期星展证券也取得经过树立子公司从事特殊出资事务的资历。到现在&#xff0c;至少有82家券商获批树立特殊出资子公司。 多位券商负责人表明&#xff0c;新…

python编程人工智能小例子,《人工智能python课程》

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python编程人工智能小例子&#xff0c;《人工智能python课程》&#xff0c;现在让我们一起来看看吧&#xff01; python 怎么实现人工智能 一、Python是解释语言&#xff0c;程序写起来非常方便写程序方便对做机器学习的…

极客教程 scrapy和selenium

selenium 极客教程 使用python 调用scrapy的 爬虫Spider并且相互之间可以正常传参实现全局 常规情况创建&#xff0c;使用命令 scrapy genspider baidu "baidu.com"Python中Scrapy框架详解 浏览器调试模式下&#xff08;F12 或 右键检查&#xff09;Command sh…

ospf 案例

OSPF 基础案例 配置 S1 交换机 [S1]int LoopBack 0 [S1-LoopBack0]ip addr 1.1.1.1 32[S1]vlan batch 20 30 Info: This operation may take a few seconds. Please wait for a moment...done.[S1]int vlanif 20 [S1-Vlanif20]ip addr 192.168.20.1 24 [S1-Vlanif20]int vlani…

新版Android Studio模拟器浮动

&#xff08;水一篇&#xff0c;但其实很多入门同学不知道&#xff09; 安装新版Andorid Studio后会发现模拟器是内嵌在AS中的&#xff0c;如何让她浮动

创建型模式-单例模式

文章目录 一、创建型模式1. 单例设计模式1.1 单例模式的结构1.2 单例模式的实现&#xff08;1&#xff09;饿汉式-方式1&#xff08;静态变量方式&#xff09;&#xff08;2&#xff09;饿汉式-方式2&#xff08;静态代码块方式&#xff09;&#xff08;3&#xff09;懒汉式-方…

lammps拉伸初始应力不为零原因及解决办法

拉伸模拟是研究材料拉伸性能的常用方法。通常情况下&#xff0c;初始应力为零&#xff0c;以获得准确的应力-应变曲线。 然而&#xff0c;在某些情况下&#xff0c;模拟得到的初始应力大于零或者小于零。 &#xff08;1&#xff09;初始应力不为零的原因 根本原因是在拉伸前…