RT1052 的周期定时器

文章目录

  • 1 PIT 周期中断定时器
  • 2 PIT定时器的使用
  • 3 PIT定时器配置
    • 3.1 PIT 时钟使能。
      • 3.1.1 CLOCK_EnableClock
    • 3.2 初始化 PIT 定时器
      • 3.2.1 PIT_Init
    • 3.3 设置 通道 0 的 加载值
      • 3.3.1 PIT_SetTimerPeriod
    • 3.4 使能 通道 0 的中断
      • 3.4.1 PIT_EnableInterrupts
    • 3.5 开启 PIT 定时器
      • 3.5.1 PIT_StartTimer
    • 3.6开启 PIT 中断并设置优先级
    • 3.7编写中断服务函数
      • 3.7.1 PIT_GetStatusFlags
      • 3.7.2 PIT_ClearStatusFlags
    • 3.8 代码

1 PIT 周期中断定时器

PIT 定时器实际上是一个定时器阵列,RT1052 内部的 PIT 定时器共有 4 个通道,可用于产生中断和触发 DMA。
在这里插入图片描述PIT 定时器内部有 4 个计数器(Timer0~Timer3),也就是 4 个通道

  • 这些定时器可以产生中断,或者产生触发条件
  • 其时钟来自外设总线时钟,即 PERCLK_CLK_ROOT,频率为 75M。

PIT功能
1)32 位计数器(CNT),仅支持递减计数方式。
2)支持四个通道。
3)可以级联,实现超长定时(最长可组成 128 位定时器)。
4)支持中断/触发功能。

2 PIT定时器的使用

以 PIT 定时器通道 0 为例

  • 一旦开启 PIT 时钟(MCR[MDIS]=0)
  • 并使能通道 0 的计数(TCTRLx[TEN]=1,x=0~3,下同)
  • 则通道 0 的 CNT 计数器会从 LDVAL0 加载值开始,做递减计数
  • 当 CNT 等于 0 的时候,就产生超时事件,触发中断
  • 然后 CNT 的又会重新加载 LDVAL0 的值,进行下一次递减计数周期,依次循环。

在这里插入图片描述

3 PIT定时器配置

3.1 PIT 时钟使能。

使用函数 CLOCK_EnableClock 使能 PIT 时钟。此函数会被 PIT 定时器初始化函数 PIT_Init 调用,所以不需要我们显示的调用。

3.1.1 CLOCK_EnableClock

CLOCK_EnableClock(kCLOCK_Pit)

3.2 初始化 PIT 定时器

使用函数 PIT_Init 初始化 PIT 定时器

3.2.1 PIT_Init

void PIT_Init(PIT_Type *base, const pit_config_t *config)
  • 第一个参数指定使用哪个 PIT,因为 RT1052 只有一个 PIT 定时器,所以这个参数只能为PIT。
  • 第二个参数是指向结构体 pit_config_t 的指针
typedef struct _pit_config
{bool enableRunInDebug; //debug 的时候 PIT 是否可以使用
} pit_config_t;

PIT_Init 的一般使用方法如下:

PIT_GetDefaultConfig(&pit_config); //初始化为默认配置
pit_config.enableRunInDebug=true; //调试模式下 PIT 继续运行
PIT_Init(PIT,&pit_config); //初始化 PIT 定时器

3.3 设置 通道 0 的 加载值

使用函数 PIT_SetTimerPeriod 设置通道 0 的加载值,也就是寄存器 LADVAL0 的值。

3.3.1 PIT_SetTimerPeriod

static inline void PIT_SetTimerPeriod(PIT_Type *base, pit_chnl_t channel, uint32_t count)
  • 此函数第一个参数固定为 PIT
  • 第二个参数指定设置哪个通道的:
typedef enum _pit_chnl
{kPIT_Chnl_0 = 0U, //PIT 通道 0kPIT_Chnl_1, //PIT 通道 1kPIT_Chnl_2, //PIT 通道 2kPIT_Chnl_3, //PIT 通道 3
} pit_chnl_t;
  • 第三个参数就是要设置的加载值

3.4 使能 通道 0 的中断

使能通道 0 的中断以后,每当设置好的加载值倒计数到 0 就会产生相应的中断。
使用函数 PIT_EnableInterrupts 使能通道 0中断

3.4.1 PIT_EnableInterrupts

static inline void PIT_EnableInterrupts(PIT_Type *base, pit_chnl_t channel, int32_t mask)
  • 第一个参数固定为 PIT
  • 第二个参数是要设置的通道,这里为通道 0,即 kPIT_Chnl_0。
  • 第三个参数是要使能的中断类型
typedef enum _pit_interrupt_enable
{kPIT_TimerInterruptEnable = PIT_TCTRL_TIE_MASK,
} pit_interrupt_enable_t;

只 有 一 个 中 断 类 型 kPIT_TimerInterruptEnable。

3.5 开启 PIT 定时器

配置好 PIT 定时器以后需要开启定时器,开启 PIT 定时器的函数为 PIT_StartTimer

3.5.1 PIT_StartTimer

此函数原型如下;

static inline void PIT_StartTimer(PIT_Type *base, pit_chnl_t channel)
  • 第一个参数固定为PIT
  • 第二个产生是要开启哪个通道,这里是通道0,即kPIT_Chnl_0。设置 TCTRL 的 TEN 位为 1。

3.6开启 PIT 中断并设置优先级

在定时器配置完了之后,因为要产生中断,必不可少的要设置 NVIC 相关寄存器
使用如下函数开启 PIT 中断并设置相应的优先级。

RT1052_NVIC_SetPriority(PIT_IRQn,6,0); //抢占优先级 6,子优先级 0
EnableIRQ(PIT_IRQn); //使能 PIT 中断

3.7编写中断服务函数

在中断产生后使用函数 PIT_GetStatusFlags 来获取中断状态,此函数就是获取 TFLG0 的 TIF 位状态,通过 TIF 位状态判断是否是通道 0 的中断。

  • 调用函数 PIT_ClearStatusFlags 来清除相应的中断标志位,就是往 TIF 位写 1。

3.7.1 PIT_GetStatusFlags

中断状态获取函数 PIT_GetStatusFlags 原型如下:

static inline uint32_t PIT_GetStatusFlags(PIT_Type *base, pit_chnl_t channel)
  • 第一个参数是要获取的定时器,这里为 PIT
  • 第二参数就要获取的通道,这里为 kPIT_Chnl_0

此函数其实就是读取寄存器 TFLG 的值,通过这个返回值就可以知道中断是否发生。

3.7.2 PIT_ClearStatusFlags

中断状态(标志位)清除函数 PIT_ClearStatusFlags 原型如下:

static inline void PIT_ClearStatusFlags(PIT_Type *base, pit_chnl_t channel, uint32_t mask)
  • 第一个参数为 PIT
  • 第二参数为要清除的通道,本例程选择 kPIT_Chnl_0
  • 第三个参数是要清除的中断标志位,这里只有 kPIT_TimerFlag 可选择。

3.8 代码

pit_config_t pit_config;//初始化PIT通道0,PIT时钟源为perclk_clk_root=75MHz.
//ldval: CH0初始值,0~0xFFFFFFFF
//递减计数,当ldval==0时,产生中断.
//定时时间=ldval/PERCLK_CLK_ROOT
void PIT_CH0_Int_Init(u32 ldval)
{PIT_GetDefaultConfig(&pit_config);  //初始化为默认配置pit_config.enableRunInDebug=true;   //调试模式下PIT继续运行PIT_Init(PIT,&pit_config);          //初始化PIT定时器PIT_SetTimerPeriod(PIT,kPIT_Chnl_0,ldval);//设置倒计时初始值PIT_EnableInterrupts(PIT,kPIT_Chnl_0,kPIT_TimerInterruptEnable);//使能中断RT1052_NVIC_SetPriority(PIT_IRQn,6,0);	//抢占优先级6,子优先级0EnableIRQ(PIT_IRQn);	                //使能PIT中断PIT_StartTimer(PIT,kPIT_Chnl_0);        //打开PIT
}//PIT中断服务函数
void PIT_IRQHandler(void)
{//PIT CH0中断if((PIT_GetStatusFlags(PIT,kPIT_Chnl_0)&kPIT_TimerFlag)==kPIT_TimerFlag){LED1_Toggle;			//LED灯翻转PIT_ClearStatusFlags(PIT,kPIT_Chnl_0,kPIT_TimerFlag);//清楚中断标志位}__DSB();				//数据同步屏蔽指令
}

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

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

相关文章

NetSuite ERP顾问的进阶之路

目录 1.修养篇 1.1“道”是什么?“器”是什么? 1.2 读书这件事儿 1.3 十年计划的力量 1.3.1 一日三省 1.3.2 顾问损益表 1.3.3 阶段课题 2.行为篇 2.1协作 2.2交流 2.3文档管理 2.4时间管理 3.成长篇 3.1概念能力 3.1.1顾问的知识结构 …

word转pdf怎么转?几种常用方法分享

word转pdf怎么转?在日常工作和学习中,将Word文档转换为PDF格式是一项必要的任务。不仅可以保证文档的格式不变,还可以防止文档被他人篡改。但是,Word文档并不是所有人都能够轻松打开和编辑的,而PDF文件则可以在各种设备…

使用DataX实现mysql与hive数据互相导入导出

一、概论 1.1 什么是DataX DataX 是阿里巴巴开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle 等)、HDFS、Hive、ODPS、HBase、FTP 等各种异构数据源之间稳定高效的数据同步功能。 1.2 DataX 的设计 为了解决异构数据源同步问题&#xf…

安全学习DAY09_加密逆向,特征识别

算法逆向&加密算法分类,特征识别 文章目录 算法逆向&加密算法分类,特征识别算法概念,分类单向散列加密 - MD5对称加密 - AES非对称加密 - RSA 常见加密算法识别特征,解密特点MD5密文特点BASE64编码特点AES、DES特点RSA密文…

Vue实现leafletMap自定义绘制线段 并且删除指定的已绘制的点位

效果&#xff1a;点击表格可实现选中地图点位&#xff0c;删除按钮点击可删除对应点位并且重新绘制线段&#xff0c;点击确定按钮 保存已经绘制的点位信息传给父组件 并且该组件已实现回显 完整的组件代码如下 文件名称为&#xff1a; leafletMakePointYt <!--* Descripti…

cpolar内网穿透可应用于哪些场景?

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于恒川的日常汇报系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏C语言初…

校园跑腿小程序运营攻略

作为一名校园跑腿小程序的运营者&#xff0c;你可能会面临诸如用户获取、平台推广、服务质量保证等挑战。在本篇推文中&#xff0c;我将为你提供一些关键的运营策略&#xff0c;帮助你成功运营校园跑腿小程序。 1. 用户获取和留存 用户是校园跑腿小程序成功的关键。以下是一些…

2023华为OD统一考试(B卷)题库清单(持续收录中)以及考点说明

目录 专栏导读2023 B卷 “新加题”&#xff08;100分值&#xff09;2023Q2 100分2023Q2 200分2023Q1 100分2023Q1 200分2022Q4 100分2022Q4 200分牛客练习题 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》。 刷的越多&…

NLP实战9:Transformer实战-单词预测

目录 一、定义模型 二、加载数据集 三、初始化实例 四、训练模型 五、评估模型 &#x1f368; 本文为[&#x1f517;365天深度学习训练营]内部限免文章&#xff08;版权归 *K同学啊* 所有&#xff09; &#x1f356; 作者&#xff1a;[K同学啊] 模型结构图&#xff1a; &a…

无涯教程-Lua - while语句函数

只要给定条件为真&#xff0c;Lua编程语言中的 while 循环语句就会重复执行目标语句。 while loop - 语法 Lua编程语言中 while 循环的语法如下- while(condition) dostatement(s) end while loop - 流程图 在这里&#xff0c;需要注意的关键是 while 循环可能根本不执行。…

【Linux | Shell】结构化命令2 - test命令、方括号测试条件、case命令

目录 一、概述二、test 命令2.1 test 命令2.2 方括号测试条件2.3 test 命令和测试条件可以判断的 3 类条件2.3.1 数值比较2.3.2 字符串比较 三、复合条件测试四、if-then 的高级特性五、case 命令 一、概述 上篇文章介绍了 if 语句相关知识。但 if 语句只能执行命令&#xff0c…

软考 系统分析师和系统架构师 项目管理师

软考整起 https://www.ruankao.org.cn/ 什么是计算机技术与软件&#xff08;初级、中级、高级&#xff09;考试&#xff08;软考&#xff09;&#xff1f; - 知乎 系统分析师和系统架构师关系 这两年&#xff0c;我先后报考了计算机技术与软件专业技术资格&#xff08;水平&a…

Spark性能调优之数据序列化

前言 在使用Spark进行数据开发的时候,避不开的一个问题就是性能调优。网上一搜一大堆所谓的调优策略很多作者自己都不知所云,导致读者看了后只会更加困惑。我们在研究一个技术的时候第一手资料永远都请参考官网,官网对性能优化不一定是最全甚至最优,但是可以解决大部分问题…

为Android构建现代应用——应用导航设计

在前一章节的实现中&#xff0c;Skeleton: Main structure&#xff0c;我们留下了几个 Jetpack 架构组件&#xff0c;这些组件将在本章中使用&#xff0c;例如 Composables、ViewModels、Navigation 和 Hilt。此外&#xff0c;我们还通过 Scaffold 集成了 TopAppBar 和 BottomA…

js将当前时间转换成标准的年月日

直接上代码了&#xff1a; /*** * param e 转换成标准的年月日进行拆分* returns */changeCreationtime(e:any) {let year e.getFullYear(),month (e.getMonth() 1) > 9 ? (e.getMonth() 1) : 0 (e.getMonth() 1),day e.getDate() > 9 ? e.getDate() : 0 e.get…

小研究 - JVM 垃圾回收方式性能研究(一)

本文从几种JVM垃圾回收方式及原理出发&#xff0c;研究了在 SPEC jbb2015基准测试中不同垃圾回收方式对于JVM 性能的影响&#xff0c;并通过最终测试数据对比&#xff0c;给出了不同应用场景下如何选择垃圾回收策略的方法。 目录 1 引言 2 垃圾回收算法 2.1 标记清除法 2.2…

JVM-运行时数据区

目录 什么是运行时数据区&#xff1f; 方法区 堆 程序计数器 虚拟机栈 局部变量表 操作数栈 动态连接 运行时常量池 方法返回地址 附加信息 本地方法栈 总结&#xff1a; 什么是运行时数据区&#xff1f; Java虚拟机在执行Java程序时&#xff0c;将它管…

PyTorch从零开始实现Transformer

文章目录 自注意力Transformer块编码器解码器块解码器整个Transformer参考来源全部代码&#xff08;可直接运行&#xff09; 自注意力 计算公式 代码实现 class SelfAttention(nn.Module):def __init__(self, embed_size, heads):super(SelfAttention, self).__init__()self.e…

Prometheus + Grafana安装

Prometheus是一款基于时序数据库的开源监控告警系统&#xff0c;非常适合Kubernetes集群的监控。Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态&#xff0c;任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做非常适合做…

7、Kubernetes核心技术 - Secret

目录 一、Secret概述 二、Secret 三种类型 2.1、Opaque 2..2、kubernetes.io/dockerconfigjson 2.3、kubernetes.io/service-account-token 三、Secret创建 3.1、命令行方式创建 Secret 3.2、yaml方式创建 Secret 四、Secret解码 五、Secret使用 5.1、将 Secret 挂载…