GD 32独立看门狗

news2024/11/13 12:12:13

前言


...


独立看门狗简介

独立看门狗定时器(FWDGT)有独立的时钟源(IRC40K)。因此就算是主时钟失效了,它仍然能保持工作状态,这非常适合于需要独立环境且对计时精度要求不高的场合。

内部向下计数器的计数值达到0,独立看门狗会产生一个复位。使能独立看门狗的寄存器写保护功能可以避免寄存器的值被意外的配置篡改。


独立看门狗主要特征

  自由运行的12位向下计数器;

 如果看门狗定时器被使能,那么当向下计数器的值达到0时产生系统复位;

 独立时钟源,独立看门狗定时器在主时钟故障(例如待机和深度睡眠模式下)时仍能工作;

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

 可以配置独立看门狗定时器在调试模式下选择停止还是继续工作


独立看门狗功能说明

独立看门狗定时器带有一个8级预分频器和一个12位的向下递减计数器。 图14-1. 独立看门狗定时器框图的独立看门狗定时器的功能模块。

RUD独立看门狗定时器计数器重装载值更新
PUD独立看门狗定时器预分频值更新


独立看门狗硬件结构


独立看门狗初始化

fwdgt_config(uint16_t reload_value, uint8_t prescaler_div)

 这个库函数第一个参数是重装载计数器的值,第二个参数是预分频器的值

看门狗初始化函数

// 独立看门狗初始化
void WdgDrvInit(void)
{
		/* 关闭FWDGT_PSC和FWDGT_RLD的写保护 */
		/* 配置预分频器和重装载寄存器 */
		fwdgt_config
		(
			2500,
			FWDGT_PSC_DIV32  // 分频后40KHz / 32 = 1.25KHz,周期0.8ms,2500 * 0.8 = 2000ms
		);
		// 开启独立看门狗
		fwdgt_enable();
}

看门狗喂狗函数

喂狗指的是不让计数器里面的值递减为0,而是恢复为重装载寄存器里面的值

// 看门狗喂狗
void FeedDog(void)
{
	// 配置看门狗重转载计数器
	fwdgt_counter_reload();
}

完整代码

#include <stdint.h>
#include "gd32f30x.h"


// 独立看门狗初始化
void WdgDrvInit(void)
{
		/* 关闭FWDGT_PSC和FWDGT_RLD的写保护 */
		/* 配置预分频器和重装载寄存器 */
		fwdgt_config
		(
			2500,
			FWDGT_PSC_DIV32  // 分频后40KHz / 32 = 1.25KHz,周期0.8ms,2500 * 0.8 = 2000ms
		);
		// 开启独立看门狗
		fwdgt_enable();
}


// 看门狗喂狗
void FeedDog(void)
{
	// 配置看门狗重转载计数器
	fwdgt_counter_reload();
}

头文件代码:

#ifndef _WDG_DRV_H_
#define _WDG_DRV_H_

/**
***********************************************************
* @brief 独立看门狗初始化
* @param
* @return 
***********************************************************
*/
void WdgDrvInit(void);

/**
***********************************************************
* @brief 喂狗
* @param
* @return 
***********************************************************
*/

void FeedDog(void);

#endif

应用层代码

将代码写在应用层的目的是让驱动层和应用层实现分离,在没有操作系统的情况下实现程序架构

#include <stdio.h>
#include "wdg_drv.h"

// 应用层看门狗喂狗处理程序
void WdgTask(void)
{
	printf("********喂狗***********");
	// 调用看门狗重装载值进行喂狗
	FeedDog();
}



应用层头文件代码

#ifndef _WDG_APP_H_
#define _WDG_APP_H_

/**
***********************************************************
* @brief 看门狗任务处理函数
* @param 
* @return 
***********************************************************
*/
void WdgTask(void);

#endif

main 函数测试

主函数的设计采用的也是模块化的程序架构方式,在没有操作系统的情况下,通过一个个的时间片实现程序架构的独立性。

#include <stdint.h>
#include <stdio.h>
#include "led_drv.h"
#include "key_drv.h"
#include "systick.h"
#include "usb2com_drv.h"
#include "delay.h"
#include "wdg_drv.h"
#include "hmi_app.h"
#include "wdg_app.h"

typedef struct
{
	uint8_t run;                // 调度标志,1:调度,0:挂起
	uint16_t timCount;          // 时间片计数值
	uint16_t timRload;          // 时间片重载值
	void (*pTaskFuncCb)(void);  // 函数指针变量,用来保存业务功能模块函数地址
} TaskComps_t;

static TaskComps_t g_taskComps[] = 
{
	{0, 5,    5,    HmiTask},
	{0, 1000, 1000, WdgTask},
	/* 添加业务功能模块 */
};

#define TASK_NUM_MAX   (sizeof(g_taskComps) / sizeof(g_taskComps[0]))

static void TaskHandler(void)
{
	for (uint8_t i = 0; i < TASK_NUM_MAX; i++)
	{
		if (g_taskComps[i].run)                  // 判断时间片标志
		{
			g_taskComps[i].run = 0;              // 标志清零
			g_taskComps[i].pTaskFuncCb();        // 执行调度业务功能模块
		}
	}
}

/**
***********************************************************
* @brief 在定时器中断服务函数中被间接调用,设置时间片标记,
         需要定时器1ms产生1次中断
* @param
* @return 
***********************************************************
*/
static void TaskScheduleCb(void)
{
	for (uint8_t i = 0; i < TASK_NUM_MAX; i++)
	{
		if (g_taskComps[i].timCount)
		{
			g_taskComps[i].timCount--;
			if (g_taskComps[i].timCount == 0)
			{
				g_taskComps[i].run = 1;
				g_taskComps[i].timCount = g_taskComps[i].timRload;
			}
		}
	}
}

static void DrvInit(void)
{
	SystickInit();
	LedDrvInit();
	KeyDrvInit();
	DelayInit();
	Usb2ComDrvInit();
	WdgDrvInit();
}
static void AppInit(void)
{
	TaskScheduleCbReg(TaskScheduleCb);
}

int main(void)
{	
	DrvInit();
	AppInit();
	printf("*******看门狗测试*******\n");
	while (1)
	{
		TaskHandler();
	}
}

测试结果


后记:


...


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

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

相关文章

迎接新时代:通过Web Distribution分发您的iOS应用

背 景 《数字市场法案》&#xff08;Digital Markets Act&#xff0c;DMA&#xff09;是欧盟委员会于2020年11月提出的旨在规范大型科技公司行为的立法提案&#xff0c;于2022年3月8日由欧盟议会和欧盟理事会正式通过&#xff0c;并于2022年11月1日正式生效&#xff0c;主要条…

面试题:MySQL 索引

1. 谈一下你对于MySQL索引的理解?(为什么MySQL要选择B+树来存储索引) MySQL的索引选择B+树作为数据结构来进行存储,使用B+树的本质原因在于可以减少IO次数,提高查询的效率,简单来说就是可以保证在树的高度不变的情况下存储更多的数据: IO效率的提高:在MySQL数据库中,…

最细哈希表相关的力扣题和讲解和Java、C++常用的数据结构(哈希法)来源于代码随想录,十分感谢这位我失散多年的老师!!

20240725 一、什么时候适用什么样的结构。1.java中1.1 HashSet&#xff1a;1.2 TreeSet&#xff1a;1.3 LinkedHashSet&#xff1a;1.4 HashMap&#xff1a;1.5 TreeMap&#xff1a;1.6 LinkedHashMap&#xff1a;1.7 总结 2. c中2.1 std::unordered_set&#xff1a;2.2 std::s…

mysql 的MHA

mysql 的MHA 什么是MHA 高可用模式下的故障切换&#xff0c;基于主从复制。 单点故障和主从复制不能切换的问题。 至少需要3台。 故障切换过程0-30秒。 vip地址&#xff0c;根据vip地址所在的主机&#xff0c;确定主备。 主 vip 备 vip 主和备不是优先确定的&#xff…

机器视觉13镜头

镜头作用&#xff1a; 一端收集物体的光线&#xff0c;并将光线在另一端汇聚为实像&#xff0c;并投影到接收面的物体。 此时&#xff0c;汇集光线的点称为焦点&#xff0c;镜头中心到焦点的距离称为焦点距离。 当镜头为凸镜时&#xff0c;焦点距离将根据镜头的厚度&#xf…

必看!CRM系统选型指南:10款CRM系统对比,你该用哪个?

不同行业、不同规模、不同业务模式的企业&#xff0c;对CRM系统的需求千差万别。 如何在众多选择中挑选出最适合自己企业的那一款&#xff0c;成为了许多管理者面临的难题。因为&#xff0c;如今的CRM系统成为了企业提升竞争力、深化客户关系、优化业务流程的关键工具。 因此…

【嵌入式】C51 和标准 C 语言的关键字对比详解

目录 C51 和标准 C 语言的关键字对比详解1. 概述2. C51 和标准 C 语言的关键字对比2.1 关键字对比表2.2 对比表详细解释2.2.1 C51 特定关键字2.2.2 标准 C 语言关键字 2.3 C51 特定关键字2.4 标准 C 语言关键字 3. 示例详细解释3.1 C51 特定关键字bitsfrsbitdataidatapdataxdat…

基于JSP的水果销售管理网站

你好&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a; Java 数据库&#xff1a; MySQL 技术&#xff1a; JSP技术 工具&#xff1a; 未在文档中明确指出&#xff0c;可能包括但不限于IDEs&#xff08;如Ec…

.NET 相关概念

.NET 和 .NET SDK .NET 介绍 .NET 是一个由 Microsoft 开发和维护的广泛用于构建各种类型应用程序的开发框架。它是一个跨平台、跨语言的开发平台&#xff0c;提供了丰富的类库、API和开发工具&#xff0c;支持开发者使用多种编程语言&#xff08;如C#、VB.NET、F#等&#xf…

盘点2024年网上很火的4个语音识别转文字工具。

语音识别转文字是一项非常实用的技术&#xff0c;可以帮助我们在会议记录中省去手动记录&#xff0c;在采访中迅速得到文字稿&#xff0c;在学习中快速生成课堂笔...运用十分广泛。但是很多人不知道要怎么转换&#xff0c;在这里我便给大家介绍几款效率非常高的语音转文字的工具…

Java微服务架构设计:Spring Boot与Spring Cloud实践

1. 引言 1.1 微服务架构概述 微服务架构是一种将单个应用程序划分为一组小型服务的方法&#xff0c;每个服务运行在其独立的进程中&#xff0c;并通过轻量级机制&#xff08;通常是HTTP资源API&#xff09;进行通信。这些服务围绕业务能力构建&#xff0c;并且可以由全自动部署…

如何保证分布式服务接口的幂等性

1 问题背景 可能你最先想到的就是使用数据库的事务保证。比如创建订单时&#xff0c;要同时往订单表和订单商品表中插入数据&#xff0c;那这些插入数据的INSERT必须在一个数据库事务中执行&#xff0c;数据库的事务可以确保&#xff1a;执行这些INSERT语句&#xff0c;共赴生死…

DDR核心和事务调度程序(DDRC)

DDR Core and Transaction Scheduler (DDRC)是内存管理系统中一个关键组件&#xff0c;它主要负责管理和调度对DDR&#xff08;Double Data Rate&#xff0c;双倍数据率&#xff09;内存的读写操作。这个组件对于确保系统能够高效地访问内存至关重要&#xff0c;特别是在处理多…

实验15.多线程调度

简介 实验.多线程调度 内核线程 1.在时钟中断函数中处理中&#xff0c;减少当前线程pcb的tick&#xff0c;tick为0则启动调度2.调度&#xff0c;把当前线程pcb放入就绪对立队尾&#xff0c;把就绪线程队首拿出来执行主要代码 引导 省略内核 list.h #ifndef __LIB_KERNEL_…

【GoodERP更新日志】增加采购发票、销售发票 批量抵扣记账 批量撤销入账 功能

开源项目GoodERP更新-2024年7月29日 本次提交合并增加的功能或解决的问题&#xff1a; 1、增加采购发票、销售发票 批量抵扣记账 批量撤销入账 功能&#xff08;增加上了批量抵扣记账&#xff08;会检查发票号、开票日期有没有填写上&#xff09;、批量撤销入账 两个批量功能…

H616设计时候存在的问题

1.存在大量孤铜的问题&#xff1a; 这种情况是绝对不允许的&#xff0c;但是GBA焊盘打大量的过孔会出现很多这样的孤铜&#xff1a; 解决办法&#xff1a; 像这种出现大量重复焊盘的&#xff0c;用导线连接起来&#xff0c;之后铺铜形成铜皮&#xff0c;再在这个小铜皮上面打…

用frp内网穿透https网站

场景说明 在微信小程序上线测试的时候&#xff0c;自主开发的后端服务在公司局域网&#xff0c;小程序前端在微信公众平台只支持配置https协议的域名来访问服务端。公司一直在使用frp内网穿透工具实现公网访问公司局域网服务&#xff0c;因此&#xff0c;研究如何实现frp代理h…

低代码平台飞书apaas

1. 低代码平台 1.1 概述 低代码是无需编码&#xff08;0 代码&#xff09;或通过少量代码就可以快速生成应用程序的开发平台。 通过可视化进行应用程序开发的方法&#xff0c;具有不同经验水平的开发人员可以通过图形化的用户界面&#xff0c;使用拖拽组件和模型驱动的逻辑来…

BIM、数字孪生、可视化一结合,我就知道这大屏效果稳稳的啦

在日常的项目中&#xff0c;经常会用到上述三个方面的能力结合&#xff0c;比如智慧工地、智慧楼宇、智慧园区等项目&#xff0c;本文就分享一批这方面的精彩作品。 BIM&#xff08;建筑信息模型&#xff09;、数字孪生和可视化大屏可以结合起来&#xff0c;为建筑行业和工程管…

C语言中的二维数组

文章目录 &#x1f34a;自我介绍&#x1f34a;二维数组&#x1f34a;代码实战 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介绍 Hello,大家好&#xff0c;我是小珑也要变强&…