GD32F103RCT6/GD32F303RCT6(10)独立看门狗/窗口看门狗实验

 本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发

       后续项目主要在下面该专栏中发布:

手把手教你嵌入式国产化_不及你的温柔的博客-CSDN博客

       感兴趣的点个关注收藏一下吧!

       电机驱动开发可以跳转:

手把手教你嵌入式国产化-实战项目-无刷电机驱动(1)-CSDN博客

       BMS电源系统开发可以跳转:暂未放链接

 向上代码兼容GD32F303RCT6中使用

本项目配套开发板:

基于GD32F103RCT6国产GD32平台,以下教程编写基于该开发板

图片:

a83f44e3ba7542238ec2f3c3d9002bbe.jpeg

原理图以及例程请联系客服获取!

介绍:

GD32系列微控制器集成了独立看门狗(FWDGT)和窗口看门狗(WWDGT)功能,看门狗定时器(WDGT)是一个硬件计时电路,用以提高系统的稳定性和可靠性;他们是提升系统鲁棒性和可靠性的重要组件。

独立看门狗(FWDGT)

工作原理:

 时钟源

GD32F103RCT6的FWDGT使用的是独立的时钟源IRC40K,频率大约为40kHz。不受系统时钟的影响,确保了其独立性和可靠性。当内部向下计数器的计数值达到0的时候,就会发生一个系统复位。

 功能

FWDGT的主要职责是在设定的时间周期内,如果软件没有通过写入喂狗寄存器来重置看门狗计数器,它将自动触发一个系统复位,一般用来避免由于软件问题导致的系统冻结、停止。

 配置与使用

用户需要在初始化阶段设置好预分频系数,决定看门狗的超时时间。一旦配置完成,必须在每个超时周期结束前向FWDGT的喂狗寄存器写入一个特定值来重置计数器,否则就会触发复位。

 特点

1.FWDGT不支持中断机制,其复位动作是不可屏蔽的,适用于需要高度可靠性的系统保护场景。

2.自由运行的12位向下计数器

3.独立时钟源,在主时钟故障时依旧可以工作,包括待机和深度睡眠模式

4.独立看门狗定时器硬件控制位,用来控制是否在上电时自动启动

独立看门狗定时器带有一个8级预分频器和一个12位的向下递减计数器。

窗口看门狗(WWDGT)

工作原理:

 时钟源
窗口看门狗定时器时钟是由APB1时钟预分频而来。窗口看门狗定时器适用于需要精确计时的 场合。
 功能

与FWDGT不同,WWDGT要求在预定义的一个时间窗口内完成喂狗操作。如果喂狗太早(窗口开启前)或太晚(错过窗口),都会触发系统复位。

 配置与使用

用户需根据应用需求设置窗口的上下限,以确定合适的喂狗时间范围。在使用过程中,软件需在窗口打开期间喂狗以避免复位。

 特点

1.WWDG可以配置中断,但中断主要用于提示喂狗时间即将到来,而不能阻止复位的发生。它更适合于对程序执行时间有严格限制和监控需求的应用。

2.可编程的7位自由运行向下递减计数器

3.当窗口看门狗使能后,有两种情况会产生复位:

   一:当计数值达到0x3F时复位CNT[6]位被清0

   二:当计数器的值大于窗口寄存器的值时,更新计数器会产生复位

代码演示:

在写一段代码前,我们可以先参考官方提供的例程:

int main(void)
{/* configure systick */systick_config();/* configure LED */gd_eval_led_init(LED2);gd_eval_led_init(LED3);/* configure the Tamper key which is used to reload FWDGT  */gd_eval_key_init(KEY_TAMPER, KEY_MODE_EXTI);delay_1ms(500);/* configure FWDGT counter clock: 40KHz(IRC40K) / 64 = 0.625 KHz */fwdgt_config(2 * 500, FWDGT_PSC_DIV64);/* after 1.6 seconds to generate a reset */fwdgt_enable();/* check if the system has resumed from FWDGT reset */if(RESET != rcu_flag_get(RCU_FLAG_FWDGTRST)) {/* turn on LED3 */gd_eval_led_on(LED3);/* clear the FWDGT reset flag */rcu_all_reset_flag_clear();while(1) {}} else {/* turn on LED2 */gd_eval_led_on(LED2);}while(1) {}
}

在这里,官方是直接调用看门狗对应的库函数,然后在主函数中完成初始化和喂狗操作,我们在前面几期教程中也已经讲过,为了方便不同项目的移植和维护,我们采样封装的方式,去对每个函数进行封装和接口留出;

独立看门狗初始化

void FWDGT_Init(uint8_t prer,uint16_t rlr)
{fwdgt_write_enable();          //使能对寄存器的写操作fwdgt_config(rlr, prer);       //设置重装载值和预分频值fwdgt_counter_reload();        //将FWDGT_RLD寄存器的值重装载FWDGT计数器fwdgt_enable();                //使能独立看门狗定时器}

使用例子:

#define  reload_number  625FWDGT_Init(FWDGT_PSC_DIV64,reload_number);  	       //分频数为64,重载值为625,溢出时间为1s	

喂狗代码:

可以直接调用GD32库函数中的喂狗操作:

  fwdgt_counter_reload();        //喂狗

窗口看门狗初始化

void WWDGT_Init(uint8_t tr,uint8_t wr,uint32_t fprer)
{rcu_periph_clock_enable(RCU_WWDGT);           //使能WWDGT时钟wwdgt_config(tr, wr, fprer);                //设置WWDGT计数器值、窗口值和预分频值 ;wwdgt_enable();                             //使能窗口看门狗定时器wwdgt_flag_clear();                         //清除WWDGT提前唤醒中断标志位状态wwdgt_interrupt_enable();                   //使能窗口看门狗提前唤醒中断nvic_irq_enable(WWDGT_IRQn, 0, 3);          //抢占优先级0,响应优先级为3
}

使用例子

#define  count_number 0x8F
#define  WWD_number   0x4FWWDGT_Init(count_number,WWD_number, WWDGT_CFG_PSC_DIV8); //计数器值为8F,窗口值为4F,预分频值为8

提前唤醒中断函数

void WWDGT_IRQHandler(void)
{ wwdgt_counter_update(100);                    //更新窗口看门狗值wwdgt_flag_clear();                         //清除WWDGT提前唤醒中断标志位状态/***********************************************/用户代码编辑区域/***********************************************/}

拓展

那么我们通过调用上面不同的功能函数,就能够完成看门狗的初始化和定义了,不知道大家对以前我发过的一篇文章有没有印象:

GD32F103RCT6/GD32F303RCT6-杂项-GD32复位源寄存器(判断复位/重启生成)

哈哈,答案来了,在外面之前这篇文章里面,我们完成了对每次复位以后,对上一次复位来源的分析,那么是不是就意味着,当看门狗发生复位以后,我们能够每次重启读取到呢?

再深一点,是不是就意味着我们每次因为软件故障导致开门狗复位以后,都能在下一次复位后重新读出,告诉用户上一次发生了复位!这将对我们调试和找错误有极大的帮忙!

群号:621154399

有问题欢迎大家加入我们一起交流,这个群是开源性技术交流群。

感兴趣点个关注支持一下吧!

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

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

相关文章

集合的综合练习

自动点名器1&#xff1a;班级里有N个学生&#xff0c;实现随机点名器 public class test {public static void main(String [] args) {ArrayList<String> listnew ArrayList<>();//创建一个集合//在集合中添加元素Collections.addAll(list, "李明",&quo…

MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案

一、找不到my.ini配置文件 MySQL 8 安装或启动过程中&#xff0c;如果系统找不到my.ini文件&#xff0c;通常意味着 MySQL服务器没有找到其配置文件。在Windows系统上&#xff0c;MySQL 8 预期使用my.ini作为配置文件&#xff0c;而不是在某些情况下用到的my.cnf文件。 通过 …

常用的优化器汇总及keras实现

1.SGD&#xff08;Stochastic Gradient Descent&#xff09; 2.RMSprop&#xff08;Root Mean Square Propagation&#xff09; 3.Adadelta 4.Adam&#xff08;Adaptive Moment Estimation&#xff09; 5.Nadam 6.代码实现 from sklearn.compose import make_column_transforme…

Java----Maven详解

前言 Maven是Java项目的构建工具&#xff0c;通过项目对象模型&#xff08;POM&#xff09;管理项目配置信息&#xff0c;自动化构建、测试和部署过程。开发人员可定义项目结构、依赖和构建流程&#xff0c;提高开发效率和质量。本文介绍基本概念和用法&#xff0c;帮助您更好…

文本生成流程图 泰酷啦 Excalidraw Mermaid Obsidian

前言 介绍一个很酷的工具&#xff0c;Mermaid to Excalidraw 。作用是用代码生成流程图。 Mermaid 是一款强大的、轻量级的文本到图表的转换工具&#xff0c;它允许用户使用简单的Markdown风格的语法编写文本描述&#xff0c;然后通过JavaScript引擎将其转换成美观的图表。Mer…

vue3 vite title 页面标题设置

效果图&#xff1a; 1. 安装 vite-plugin-html 插件 npm install vite-plugin-html -D2. 修改 vite.config.js import {defineConfig, loadEnv} from vite import { createHtmlPlugin } from "vite-plugin-html" import {resolve} from path import vue from vitej…

生成随机数值与二维数组的探索之旅

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、随机数生成的策略 三、实现过程与代码案例 四、注意事项与扩展讨论 一、引言…

el-image本地图片不显示,提示加载失败

问题描述&#xff1a;el-image使用本地图片不显示&#xff0c;提示加载失败。 <el-image src"../../assets/img/value.png"></el-image> 解决方法&#xff1a;src用里面加个require&#xff0c;注意给 src 属性加: <el-image :src"require(../..…

Mac在docker可视化界面上安装主流数据库

前言 篇幅有点长&#xff0c;大家可以打开目录快速跳转到想要的数据库即可&#xff01; 虽然说用命令行会显得我们更加专业一些&#xff0c;但对于我英语水平不怎么好的人来说&#xff0c;毕竟命令多又长&#xff0c;还不好记。我个人是喜欢复杂问题简单化&#xff0c;踩了很多…

今日好料推荐(大数据湖体系规划)

今日好料推荐&#xff08;大数据湖体系规划&#xff09; 参考资料在文末获取&#xff0c;关注我&#xff0c;获取优质资源。 大数据湖体系规划 一、大数据湖简介 大数据湖&#xff08;Data Lake&#xff09;是一个集中式的存储库&#xff0c;用于存储来自各种来源的结构化和…

「读书感悟」我们为什么要睡觉?

书名&#xff1a;我们为什么要睡觉&#xff1f; 作者&#xff1a;马修沃克 我觉得这是一本每个人都必须看的书&#xff0c;尤其是在如今卷上天的社会&#xff0c;部分人沉迷于学习工作&#xff0c;经常奋斗到半夜甚至通宵&#xff0c;更有甚者会有&#xff1a;“睡觉是在…

创建特定结构的二维数组:技巧与示例

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;二维数组的奇妙世界 二、方法一&#xff1a;直接初始化 1. 初始化一个…

利润而不是损失:谁信任你的游戏本地化

中国游戏市场巨大且前景广阔。这尤其适用于移动游戏&#xff1a;Statista预测&#xff0c;2024年。它的收入将达到346.6亿美元。然而&#xff0c;这种巨大的财务潜力也有其反面&#xff1a;游戏进入市场的次数越多&#xff0c;它们就越难以相互争夺玩家的注意力。此外&#xff…

Docker搭建Redis主从 + Redis哨兵模式(一主一从俩哨兵)

我这里是搭建一主一从&#xff0c;俩哨兵&#xff0c;准备两台服务器&#xff0c;分别安装docker 我这里有两台centos服务器 主服务器IP&#xff1a;192.168.252.134 从服务器IP&#xff1a;192.168.252.135 1.两台服务器分别拉取redis镜像 docker pull redis 2.查看镜像 d…

Nginx配置及优化

Nginx配置及优化 前言nginx.conf拆分理解上线 最近在配置Nginx的时候&#xff0c;偶尔一些细致的理论有些模糊&#xff0c;配置起来费了点功夫&#xff0c;今天来详细写一下我个人的理解&#xff0c;文章参考了一些官网和其他优秀博主的文章http://t.csdnimg.cn/GbID9。 前言 …

一款免费的软件媒体系统软件!!【送源码】

Jellyfin是一个免费的软件媒体系统&#xff0c;让您在管理和流媒体控制您的媒体。它是专有的Emby和Plex的替代品&#xff0c;通过多个应用程序从专用服务器向最终用户设备提供媒体。Jellvfin是Emby的3.5.2版本的后裔&#xff0c;并被移植到.NETCore框架中&#xff0c;以实现完全…

安卓赤拳配音v1.0.2Ai配音神器+百位主播音色

Ai配音神器 本人自用版本&#xff01;超级稳定&#xff01;百位主播音色 登陆即可用 链接&#xff1a;https://pan.baidu.com/s/1WVsrYZqLaPAriHMMLMdPBg?pwdz9ru 提取码&#xff1a;z9ru

Linux: network: tcp spurious retrans 的一个原因

最近分析问题的时候&#xff0c;从wireshark里看有&#xff1a;tcp spurious retrans 的包&#xff0c;309这个是307 的retransmission&#xff0c;而且在308 回复了ACK。那为什么会重传&#xff1f; 从网上找了一些&#xff0c;比如 https://www.packetsafari.com/blog/2021…

MySQL-innodb后台线程

文章目录 一、结构图二、后台线程①Master Thread②IO Thread③Purge Thread④Page Cleaner Thread 拓展知识 一、结构图 二、后台线程 InnoDB是多线程的模型&#xff0c;因此其后台有多个不同的后台线程&#xff0c;负责处理不同的任务 后台线程有&#xff1a; ①Master Thr…

洗地机哪个牌子最好用?十大名牌洗地机排行榜

作为一种新兴的智能家居产品&#xff0c;洗地机的市场规模已经突破了百亿大关。如此庞大的市场自然吸引了大量资本的涌入&#xff0c;许多品牌纷纷推出自己的洗地机产品&#xff0c;试图在这个竞争激烈的市场中占据一席之地。然而&#xff0c;面对如此多的品牌和型号&#xff0…