全志T113-S3裸机定时器驱动(timer0,timer1操作)

        虽然只有2个定时器,但是好在是32bit的,日常使用刚好够,1个定时器当做StopWatch定时器,1us精度,用于时间测量,1个定时器给OS作为滴答时钟使用。

        直接上代码:

/************************************************************************************************************** 文件名:		t113_timer.c* 功能:		t113定时器支持* 作者:		cp1300@139.com* 邮箱:		cp1300@139.com* 创建时间:	2023-09-30* 最后修改时间:2023-09-30* 详细:		支持timer0 timer1 2个32bit定时器
*************************************************************************************************************/
#include "t113_system.h"
#include "t113_map.h"
#include "typedef.h"
#include "t113_timer.h"
#include "t113_const.h"/*
writel(0x2EE0, TMR_0_INTV); //Set the interval value
writel(0x94, TMR_0_CTRL); //Select Single mode, 24 MHz clock source, 2 pre-scale
writel(readl(TMR_0_CTRL)|(1<<1), TMR_0_CTRL); //Set the Reload bit
while((readl(TMR_0_CTRL)>>1)&1); //Waiting the Reload bit turns to 0
writel(readl(TMR_0_CTRL)|(1<<0), TMR_0_CTRL); //Enable Timer0
*/static void (*sg_pTimer0_Callback)(void) = NULL;	//定时器0中断回调,外部初始化
static void (*sg_pTimer1_Callback)(void) = NULL;	//定时器0中断回调,外部初始化void TIMER0_IRQHandler(void);	//中断处理函数
void TIMER1_IRQHandler(void);	//中断处理函数/*************************************************************************************************************************
* 函数			:	void T113_TimerSet(TIMER_CH ch, bool isPeriodicMode,TIMER_PRES_TYPE Pers, u32 Cycle, bool isEnableInt, void (*pCallback)())
* 功能			:	定时器设置
* 参数			:	ch:定时器通道选择;isPeriodicMode:是否为周期模式(否则为单次模式);Pers:分频设置;Cycle:计数周期;isEnableInt:是否使能中断;pCallback:中断回调
* 返回			:	无
* 依赖			:	底层宏定义
* 作者			:	cp1300@139.com
* 时间			:	2023-09-30
* 最后修改时间 	: 	2023-09-30
* 说明			:	会关闭定时器,不会启动定时器
*************************************************************************************************************************/
void T113_TimerSet(TIMER_CH ch, bool isPeriodicMode, TIMER_PRES_TYPE Pers, u32 Cycle, bool isEnableInt, void (*pCallback)())
{switch (ch){case TIMER_CH0:{r_TMR_IRQ_EN &= ~BIT0;	//关闭定时器0 中断r_TMR0_CTRL = 0;									//关闭定时器0if (FALSE == isPeriodicMode) r_TMR0_CTRL |= BIT7;	//单次模式r_TMR0_CTRL |= (Pers & 0x07) << 4;					//设置分频if (Pers & 0x0100) r_TMR0_CTRL |= 1 << 2;			//使用24MHz时钟r_TMR0_INTV_VALUE = Cycle;							//设置初值r_TMR0_CUR_VALUE = Cycle;							//计数器值r_TMR0_CTRL |= BIT1;								//使能自动重载,会自动清除if (TRUE == isEnableInt)	//使能中断了{r_TMR_IRQ_STA |= BIT0;	//清除中断0状态r_TMR_IRQ_EN |= BIT0;	//使能中断sg_pTimer0_Callback = pCallback;				//设置中断回调GIC_SetIrqPriority(GIC_IRQ_TIMER0, 1);	                    		//GIC设置一个中断的优先级GIC_SetIrqEdgeTriggered(GIC_IRQ_TIMER0, TRUE);              		//GIC设置一个中断为边沿触发GIC_RegisterIRQHandler(GIC_IRQ_TIMER0, TIMER0_IRQHandler);   		//注册中断服务程序GIC_IrqEnable(GIC_IRQ_TIMER0, TRUE);	                    		//GIC中断使能-中断使能}else{sg_pTimer0_Callback = NULL;GIC_IrqEnable(GIC_IRQ_TIMER0, FALSE);	                    		//GIC中断使能-中断关闭}}break;case TIMER_CH1:{r_TMR_IRQ_EN &= ~BIT1;	//关闭定时器1中断r_TMR1_CTRL = 0;									//关闭定时器1if (FALSE == isPeriodicMode) r_TMR1_CTRL |= BIT7;	//单次模式r_TMR1_CTRL |= (Pers & 0x07) << 4;					//设置分频if (Pers & 0x0100) r_TMR1_CTRL |= 1 << 2;			//使用24MHz时钟r_TMR1_INTV_VALUE = Cycle;							//设置初值r_TMR1_CUR_VALUE = Cycle;							//计数器值r_TMR1_CTRL |= BIT1;								//使能自动重载,会自动清除if (TRUE == isEnableInt)	//使能中断了{r_TMR_IRQ_STA |= BIT1;	//清除中断1状态r_TMR_IRQ_EN |= BIT1;	//使能中断sg_pTimer1_Callback = pCallback;				//设置中断回调GIC_SetIrqPriority(GIC_IRQ_TIMER1, 3);	                    		//GIC设置一个中断的优先级GIC_SetIrqEdgeTriggered(GIC_IRQ_TIMER1, TRUE);              		//GIC设置一个中断为边沿触发GIC_RegisterIRQHandler(GIC_IRQ_TIMER1, TIMER1_IRQHandler);   		//注册中断服务程序GIC_IrqEnable(GIC_IRQ_TIMER1, TRUE);	                    		//GIC中断使能-中断使能}else{sg_pTimer1_Callback = NULL;GIC_IrqEnable(GIC_IRQ_TIMER1, FALSE);	                    		//GIC中断使能-中断关闭}}break;default: return;}
}/*************************************************************************************************************************
* 函数			:	void T113_TimerEnable(TIMER_CH ch, bool isEnable)
* 功能			:	使能定时器(开启或关闭定时器)
* 参数			:	ch:定时器通道选择;isEnable:TRUE:开启定时器;FALSE:关闭定时器
* 返回			:	无
* 依赖			:	底层宏定义
* 作者			:	cp1300@139.com
* 时间			:	2023-09-30
* 最后修改时间 	: 	2023-09-30
* 说明			:	需要提前初始化定时器
*************************************************************************************************************************/
void T113_TimerEnable(TIMER_CH ch, bool isEnable)
{switch (ch){case TIMER_CH0:{if (TRUE == isEnable){r_TMR0_CTRL |= BIT0;	//使能定时器}else{r_TMR0_CTRL &= ~BIT0;	//关闭定时器}}break;case TIMER_CH1:{if (TRUE == isEnable){r_TMR1_CTRL |= BIT0;	//使能定时器}else{r_TMR1_CTRL &= ~BIT0;	//关闭定时器}}break;default:return;}
}/*************************************************************************************************************************
* 函数			:	u32 T113_GetTimerCount(TIMER_CH ch)
* 功能			:	获取计数器当前值
* 参数			:	ch:定时器通道选择
* 返回			:	无
* 依赖			:	底层宏定义
* 作者			:	cp1300@139.com
* 时间			:	2023-10-02
* 最后修改时间 	: 	2023-10-02
* 说明			:	自减计数器
*************************************************************************************************************************/
u32 T113_GetTimerCount(TIMER_CH ch)
{switch (ch){case TIMER_CH0: return r_TMR0_CUR_VALUE;case TIMER_CH1: return r_TMR1_CUR_VALUE;default:return 0;}
}/*************************************************************************************************************************
* 函数			:	void T113_ClearTimerInt(TIMER_CH ch)
* 功能			:	清除定时器中断
* 参数			:	ch:定时器通道选择
* 返回			:	无
* 依赖			:	底层宏定义
* 作者			:	cp1300@139.com
* 时间			:	2024-07-19
* 最后修改时间 	: 	2024-07-19
* 说明			:	
*************************************************************************************************************************/
void T113_ClearTimerInt(TIMER_CH ch)
{switch (ch){case TIMER_CH0: r_TMR_IRQ_STA |= BIT0; break;	//清除中断0状态case TIMER_CH1: r_TMR_IRQ_STA |= BIT1; break;	//清除中断1状态default:break;}
}//中断处理函数 timer0
void TIMER0_IRQHandler(void)
{r_TMR_IRQ_STA |= BIT0;	//清除中断0状态if (sg_pTimer0_Callback != NULL) sg_pTimer0_Callback();
}//中断处理函数 timer1
void TIMER1_IRQHandler(void)
{r_TMR_IRQ_STA |= BIT1;	//清除中断1状态if (sg_pTimer1_Callback != NULL) sg_pTimer1_Callback();
}
/************************************************************************************************************** 文件名:		t113_timer.h* 功能:		t113定时器支持* 作者:		cp1300@139.com* 邮箱:		cp1300@139.com* 创建时间:	2023-09-30* 最后修改时间:2023-09-30* 详细:		支持timer0 timer1 2个32bit定时器
*************************************************************************************************************/
#ifndef _T113_TIMER_H_  
#define _T113_TIMER_H_
#include "typedef.h"
#include "t113_map.h"
#include "t113_const.h"//普通定时器通道选择
typedef enum
{TIMER_CH0 = 0,TIMER_CH1 = 1,
}TIMER_CH;//分频选择
typedef enum
{TIMER_PRES_LOSC_1_1 = 0x0100,	//LOSC 1分频TIMER_PRES_LOSC_1_2 = 0x0101,	//LOSC 2分频TIMER_PRES_LOSC_1_4 = 0x0102,	//LOSC 4分频TIMER_PRES_LOSC_1_8 = 0x0103,	//LOSC 8分频TIMER_PRES_LOSC_1_16 = 0x0104,	//LOSC 16分频TIMER_PRES_LOSC_1_32 = 0x0105,	//LOSC 32分频TIMER_PRES_LOSC_1_64 = 0x0106,	//LOSC 64分频TIMER_PRES_LOSC_1_128 = 0x0107,	//LOSC 128分频TIMER_PRES_24M_1_1 = 0x0100,	//24MHz 1分频TIMER_PRES_24M_1_2 = 0x0101,	//24MHz 2分频TIMER_PRES_24M_1_4 = 0x0102,	//24MHz 4分频TIMER_PRES_24M_1_8 = 0x0103,	//24MHz 8分频TIMER_PRES_24M_1_16 = 0x0104,	//24MHz 16分频TIMER_PRES_24M_1_32 = 0x0105,	//24MHz 32分频TIMER_PRES_24M_1_64 = 0x0106,	//24MHz 64分频TIMER_PRES_24M_1_128 = 0x0107,	//24MHz 128分频
}TIMER_PRES_TYPE;void T113_TimerSet(TIMER_CH ch, bool isPeriodicMode, TIMER_PRES_TYPE Pers, u32 Cycle, bool isEnableInt, void (*pCallback)());//定时器设置
void T113_TimerEnable(TIMER_CH ch, bool isEnable);	//使能定时器(开启或关闭定时器)
u32 T113_GetTimerCount(TIMER_CH ch);				//获取计数器当前值
void T113_ClearTimerInt(TIMER_CH ch);				//清除定时器中断#endif //_T113_TIMER_H_

注意:定时器需要使用中断,中断需要依赖GIC。

测试代码:

//中断回调0-闪烁LED
static void time0_callback(void)
{GPIOD->DATA ^= BIT16;
}//中断回调1-打印数据
static void time1_callback(void)
{static u32 count = 0;uart_printf("tim1:%u\r\n", count++);
}//定时器测试
void timer_test(void)
{//timer0 500毫秒中断T113_TimerSet(TIMER_CH0, TRUE, TIMER_PRES_24M_1_1, 24 * 1000000 * 0.5, TRUE, time0_callback);//定时器设置T113_TimerEnable(TIMER_CH0, TRUE);	//使能定时器(开启或关闭定时器)//timer1 1中断T113_TimerSet(TIMER_CH1, TRUE, TIMER_PRES_24M_1_1, 24 * 1000000 * 1, TRUE, time1_callback);	//定时器设置T113_TimerEnable(TIMER_CH1, TRUE);	//使能定时器(开启或关闭定时器)
}

例子:

给FreeOS作为滴答时钟


//RTOS滴答时钟中断初始化
void vConfigureTickInterrupt( void )
{T113_TimerSet(FREE_RTOS_TIME_CH, TRUE, TIMER_PRES_24M_1_8, RTOS_TIME_CYCLE, TRUE, FreeRTOS_Tick_Handler);T113_TimerEnable(FREE_RTOS_TIME_CH, TRUE);				//启动定时器      
}
/*-----------------------------------------------------------*/void vClearTickInterrupt( void )
{T113_ClearTimerInt(FREE_RTOS_TIME_CH);//清除定时器中断
}void vApplicationIRQHandler(uint32_t ulICCIAR)
{if (ulICCIAR == GIC_IRQ_TIMER0)	//如果是定时器0中断,则直接调用 FreeRTOS_Tick_Handler() ,因为定时器0是滴答时钟中断{g_OS_RunTime ++;									//操作系统运行时间-单位msFreeRTOS_Tick_Handler();		//由于直接调用了 FreeRTOS_Tick_Handler 导致定时器的中断没有被清除,所以必须实现 vClearTickInterrupt()}else{SystemIrqHandler(ulICCIAR);}
}

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

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

相关文章

pdf2image:将PDF文档转化为图像的Python魔法

标题&#xff1a;探索pdf2image&#xff1a;将PDF文档转化为图 像的Python魔法 背景 在数字时代&#xff0c;我们经常需要处理各种格式的文档&#xff0c;尤其是PDF文件。PDF以其跨平台的可读性和稳定性而广受欢迎。然而&#xff0c;有时我们需要将PDF文件转换成图像格式&am…

C++ - char*、const char*、char[]、string

const char* const char* 用来定义字符串常量。 char[ ] char型的字符数组是一种定长的数组&#xff0c;存储指定长度的字符序列&#xff0c;数组中的每个元素都是一个char类型的变量&#xff0c;如&#xff1a; char arr[] {h, a, l, l, o, \0}; char c arr[0]; // 访问…

CentOS怎么关闭自动锁屏?

禁止自动锁屏 有时候几分钟不用Centos&#xff0c;系统就自动锁屏了&#xff0c;这是一种安全措施&#xff0c;防止别人趁你不在时使用你的系统。但对于大部分人而言&#xff0c;这是没有必要的&#xff0c;尤其是Centos虚拟机&#xff0c;里面没啥重要的东西&#xff0c;每次…

光伏发电管理软件:光伏企业的核心驱动力

光伏产业面对日益增长的装机容量、复杂多变的运维需求以及激烈的市场竞争&#xff0c;光伏企业如何高效管理、优化运营、提升效益&#xff0c;成为了行业关注的焦点。在此背景下&#xff0c;鹧鸪云光伏发电管理软件应运而生&#xff0c;并逐渐成为光伏企业的核心驱动力。 一、提…

Transformer合集

资料 位置编码&#xff1a;https://zhuanlan.zhihu.com/p/454482273 自注意力&#xff1a;https://zhuanlan.zhihu.com/p/455399791 LN&#xff1a;https://zhuanlan.zhihu.com/p/456863215 ResNet&#xff1a;https://zhuanlan.zhihu.com/p/459065530 Subword Tokenizati…

效率翻倍的秘密:探索AI工具的新世界

大家好&#xff0c;我是你们的效率小助手米兔&#xff01;你是否曾在加班熬夜中挣扎&#xff0c;对着电脑屏幕发呆&#xff0c;感觉工作效率低到怀疑人生&#xff1f;别急&#xff0c;今天我要给你们安利几款超给力的AI工具&#xff0c;让你的工作变得轻松又愉快&#xff01; …

c++笔记4

目录 深度优先搜索DFS DFS的复杂度 DFS与递归 递归与暴力枚举 递归树 DFS与栈 DFS的搜索剪枝 搜索剪枝与优化 可行性剪枝 最优化剪枝 减少等效的分支 优化搜索顺序 搜索的记忆化 搜索的复杂度 大多时候&#xff0c;搜索的复杂度都是指数级的。各种剪枝方案&#…

2024世界技能大赛某省选拔赛“网络安全项目”B模块--操作系统取证解析

2024世界技能大赛某省选拔赛“网络安全项目”B模块--操作系统取证解析 任务一、操作系统取证解析:总结:任务一、操作系统取证解析: A 集团某电脑系统被恶意份子攻击并控制,怀疑其执行了破坏操作,窃取了集团内部的敏感信息,现请分析 A 集团提供的系统镜像和内存镜像,找到…

WIX Toolset 3.11 对本地化的支持方案

1.准备主题文件和本地化文件 WIX Toolset种主题文件为xml文件&#xff0c;负责配置控件的布局&#xff0c; 本地化文件为wxl文件&#xff0c;负责配置待加载的字符串&#xff0c;主题文件根据ID加载需要显示的文字内容。考虑到英文和中文字符长度大小不一&#xff0c;所以这里…

与Bug较量:Codigger之软件项目体检Software Project HealthCheck来帮忙

在软件工程师的世界里&#xff0c;与 Java 小程序中的 Bug 作战是一场永不停歇的战役。每一个隐藏在代码深处的 Bug 都像是一个狡猾的敌人&#xff0c;时刻准备着给我们的项目带来麻烦。 最近&#xff0c;我就陷入了这样一场与 Java 小程序 Bug 的激烈较量中。这个小程序原本应…

【充电模块】

目录 一、实物图 二、原理图 引脚定义 模块特性 原理 三 、简介 四、注意事项 源文件下载 可访问底部联系方式也可前往电子校园网官网搜索关键词 关键词&#xff1a; 充电模块 一、实物图 二、原理图 引脚定…

springboot校园论坛网站-计算机毕业设计源码11401

摘 要 基于Java语言和Springboot框架的校园论坛网站设计与实现&#xff0c;为校园内的师生提供了丰富的功能和便捷的服务。本论文旨在详细介绍该网站的设计思路、功能特点以及技术实现。 论文介绍了网站的注册与登录功能&#xff0c;用户可以通过提供必要信息注册账号&#xf…

代码随想录算法训练营day6 | 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1.两数之和

文章目录 哈希表键值 哈希函数哈希冲突拉链法线性探测法 常见的三种哈希结构集合映射C实现std::unordered_setstd::map 小结242.有效的字母异位词思路复习 349. 两个数组的交集使用数组实现哈希表的情况思路使用set实现哈希表的情况 202. 快乐数思路 1.两数之和思路 总结 今天是…

yolov8训练自己的实例分割数据集

参考&#xff1a; 1、官方教程&#xff1a;https://docs.ultralytics.com/zh/tasks/segment/ 2、YOLOv8制作自己的实例分割数据集保姆级教程&#xff08;包含json转txt&#xff09; 下载最新yolov8代码 git clone https://github.com/ultralytics/ultralytics.git一、制作自…

【日常记录】【JS】对一个数组,按照某个字段的值,进行分组

文章目录 1. 前言2. lodash 的分组3. Object.groupBy()参考链接 1. 前言 在开发中&#xff0c;经常会遇到一组数据&#xff0c;要按照某个字段进行分组&#xff0c;这个时候会有很多种方法&#xff0c;可以使用 forEach、reduce、等其他方法 reduce 方法 function groupBy(arr…

亚马逊云科技 re:Inforce 2024中国站大会

亚马逊云科技 re:Inforce 2024中国站大会 - 生成式AI时代的全面安全&#xff0c;将于7月25日本周四在北京富力万丽酒店揭幕

最新2024海报制作工具免费下载,赶紧体验!

在这个信息爆炸的时代&#xff0c;一张独特而有吸引力的海报如何打动观众的心已经成为每个人都需要关注的问题。如果你感到困惑&#xff0c;那么你就来到了正确的地方。今天我们要讨论的是免费版本的海报制作软件。我们将从软件的选择、操作模式、设计技巧等方面进行详细的解释…

AlibabaCloudAI

快速体验 Spring Cloud Alibaba AI JDK要求最低17 1.SpringAI Spring AI 旨在简化包含人工智能相关功能的应用程序的开发&#xff0c;避免不必要的复杂性。 Spring AI 的核心是提供抽象&#xff0c;作为开发 AI 应用程序的基础。这些抽象有多种实现方式&#xff0c;只需极少…

数据库-小练习

根据题目要求&#xff0c;完成下列任务&#xff1a; 新建表和数据库 //建立数据库 mysql> create database mydb15_indexstu; Query OK, 1 row affected (0.00 sec)//使用数据库 mysql> use mydb15_indexstu; Database changed//创建表student mysql> create table s…

Pytorch深度学习实践(5)逻辑回归

逻辑回归 逻辑回归主要是解决分类问题 回归任务&#xff1a;结果是一个连续的实数分类任务&#xff1a;结果是一个离散的值 分类任务不能直接使用回归去预测&#xff0c;比如在手写识别中&#xff08;识别手写 0 − − 9 0 -- 9 0−−9&#xff09;&#xff0c;因为各个类别…