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

2024-05-30 14:28

本文主要是介绍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

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

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

这篇关于GD32F103RCT6/GD32F303RCT6(10)独立看门狗/窗口看门狗实验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1016364

相关文章

【Java算法】滑动窗口 下

​ ​    🔥个人主页: 中草药 🔥专栏:【算法工作坊】算法实战揭秘 🦌一.水果成篮 题目链接:904.水果成篮 ​ 算法原理 算法原理是使用“滑动窗口”(Sliding Window)策略,结合哈希表(Map)来高效地统计窗口内不同水果的种类数量。以下是详细分析: 初始化:创建一个空的哈希表 map 用来存储每种水果的数量,初始化左右指针 left

高性能并行计算华为云实验五:

目录 一、实验目的 二、实验说明 三、实验过程 3.1 创建PageRank源码 3.2 makefile的创建和编译 3.3 主机配置文件建立与运行监测 四、实验结果与分析 4.1 采用默认的节点数量及迭代次数进行测试 4.2 分析并行化下节点数量与耗时的变化规律 4.3 分析迭代次数与耗时的变化规律 五、实验思考与总结 5.1 实验思考 5.2 实验总结 E

2024年6月24日-6月30日(ue独立游戏为核心)

试过重点放在独立游戏上,有个indienova独立游戏团队是全职的,由于他们干了几个月,节奏暂时跟不上,紧张焦虑了。五一时也有点自暴自弃了,实在没必要,按照自己的节奏走即可。精力和时间也有限,放在周末进行即可。除非哪天失业了,再也找不到工作了,再把重心放在独立游戏上。 另外,找到一个同样业余的美术,从头做肉鸽游戏,两周一次正式交流即可。节奏一定要放慢,不能影响正常工作生活。如果影响到了,还不如自

物联网系统运维——移动电商应用发布,Tomcat应用服务器,实验CentOS 7安装JDK与Tomcat,配置Tomcat Web管理界面

一.Tomcat应用服务器 1.Tomcat介绍 Tomcat是- -个免费的开源的Ser Ivet容器,它是Apache基金会的Jakarta 项目中的一个核心项目,由Apache, Sun和其他一 些公司及个人共同开发而成。Tomcat是一一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。 在Tomcat中,应用程序的成部署很简

STM32HAL库--SDRAM实验(速记版)

STM32F429IGT6 自带了 256K 字节的 SRAM,对一般应用来说,已经足够了,不过在一些对内存要求高的场合, STM32F429 自带的这些内存就不够用了。比如使用 LTDC 驱动RGB 屏、跑算法或者跑 GUI 等,就可能不太够用,所以阿波罗 STM32F429 开发板板载了一颗 32M 字节容量的 SDRAM 芯片:W9825G6KH,满足大内存使用的需求。 1

Vue3的Teleport:Teleport是Vue3的一个新功能,它允许我们将子组件渲染到父组件以外的地方,这在处理模态框、弹出窗口等情况时非常有用

I. Teleport 的概述 Teleport 的定义:   在 Vue 3.0 中,Teleport 是一个新的内置组件,它允许我们将任何部分的渲染内容 Teleport(传送)到 Vue 应用范围之外的地方。 换句话说,你可以控制片段,让它们在 DOM 中的任何位置渲染,而不仅仅是在当前组件内部。   Teleport 的效用和应用场景:   Teleport 的主要用途是处理在 UI

leetcode刷题(43)——239. 滑动窗口最大值

给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值------------

HCIA 19 结束 企业总部-分支综合实验(下)

3.6出口NAT配置可以访问互联网 配置NAT使内网可以访问公网8.8.8.8,当前总部PC1 PING不通公网地址8.8.8.8。 3.6.1总部配置NAT访问互联网 步骤1:配置NAT acl number 2000    rule 5 permit source 192.168.0.0 0.0.255.255 # interface GigabitEthernet0/0/2

STM32G030F6使用CubeMx配置PWM实验

1. 使用 CubeMx 创建 PWM 工程 打开 CubeMx 软件,选中我们此次使用的单片机型号 STM32G030F6P6 ,点击 StartProject. 配置定时器 配置定时器1的通道1和通道2 产生PWM; 设置定时器1的主频:设置了( 63 + 1) 分频即定时器主频为1M 设置PWM定时的周期计数为 1000 即 1000HZ 设置通道一 翻转的计数值为 500 即

STM32G030F6使用CubeMx配置DMA读取多通道ADC实验

1. 使用 CubeMx 创建 ADC 工程 打开 CubeMx 软件,选中我们此次使用的单片机型号 STM32G030F6P6 ,点击 StartProject. 先配置一下串口,用来打印相关信息 再来配置 ADC 配置DMA PS:DMA 需要要配置成循环模式,否则只填满一次缓存数组后就停止工作,需要重调用启动 DMA 的函数. 配置时钟 ps:本实验使用内部高速时钟