RT1052 的周期定时器

news2024/9/21 20:34:18

文章目录

  • 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 通道 0
	kPIT_Chnl_1, //PIT 通道 1
	kPIT_Chnl_2, //PIT 通道 2
	kPIT_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,子优先级0
	EnableIRQ(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.coloradmin.cn/o/811976.html

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

相关文章

在登录界面中设置登录框、多选项和按钮(HTML和CSS)

登录框(Input框)的样式: /* 设置输入框的宽度和高度 */ input[type"text"], input[type"password"] {width: 200px;height: 30px; }/* 设置输入框的边框样式、颜色和圆角 */ input[type"text"], input[type&q…

测试|测试分类

测试|测试分类 文章目录 测试|测试分类1.按照测试对象分类(部分掌握)2.是否查看代码:黑盒、白盒灰盒测试3.按开发阶段分:单元、集成、系统及验收测试4.按实施组织分:α、β、第三方测试5.按是否运行代码:静…

100行代码写一个简易QT点名程序

照例演示一下: 分享一个简易的Qt点名程序,满打满算一百行代码(还要什么自行车)。 UI界面比较丑,按钮是自己做的,背景是AI作画生成的,大家可以自行更换背景以及按钮。 内容也是非常的简单,就是…

JWT登录认证

JWT认证流程 跨域认证解决方案,JWT的流程为: 客户端发送账号和密码请求服务端收到请求,验证用户名密码是否通过验证成功后,服务端会生成唯一的token,将其返回给客户端客户端收到token,会将其存储在cookie…

拓扑排序详解(带有C++模板)

目录 介绍: 实现原理: 简答来说: 例子 模板(C) 介绍: 拓扑排序(Topological Sorting)是一种针对有向无环图(DAG)的节点进行排序的算法。DAG是一个图&…

Android 之 使用 MediaRecord 录音

本节引言 本节是Android多媒体基本API调用的最后一节,带来的是MediaRecord的简单使用, 用法非常简单,我们写个例子来熟悉熟悉~ 1.使用MediaRecord录制音频 运行结果: 实现代码: 布局代码:activity_main.…

自动化测试如何做?真实企业自动化测试流程,自动化测试分类...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 企业自动化测试流…

一文讲清楚地图地理坐标系

前言 我最近在做一个和地图有关的项目,这里本人地图采用的是mapbox,其中涉及一个功能需要根据用户输入的地点直接定位到地图上的对应的位置,本人开始想的是直接调用百度的接口根据地名直接获取坐标,发现在地图上的位置有偏移不够…

C++——模板的作用2:特例化

目录 模板的形式: 一.模板的多参数应用: 例: 错误使用1:使用不标准的模板形参表 ​编辑 错误使用2:使用变量作为实参传递给函数模板 二.模板的特例化: 类模板: 针对模板的特化步骤&am…

乌班图22.04安装wireguard实现异地组网

1. 前言: wireguard是新型的异地组网工具,在此之前,又已经被抛弃的pptp,l2tp,有配置复杂的openvpn,wireguard被linux作者linus赞叹优雅,于linux 5.6合并至linux内核主线。 2. 安装过程&#…

文心一言 VS 讯飞星火 VS chatgpt (68)-- 算法导论6.5 7题

文心一言 VS 讯飞星火 VS chatgpt (68)-- 算法导论6.5 7题 七、试说明如何使用优先队列来实现一个先进先出队列,以及如何使用优先队列来实现栈(队列和栈的定义见 10.1 节。) 文心一言: 优先队列是一种数据结构,其中…

干货|一次完整的性能测试,测试人员需要做什么?

作者介绍 邓宝菊(Kiki Deng),10 年软件测试经验,4 年团队管理经验,当前任职研发部架构质量工程部,整体负责研发部测试团队的效能、工具流程建设和人才培养。 前言 一、 规范性能测试实施流程的意义 规范…

Qt: 查看qmake相关参数设置

Qt开发中,经常会遇到qmake相关问题,比如同时安装了多个Qt版本的情况。比如我的情况是系统自带了Qt 5.12.8, 但是开发中遇到一些兼容性问题,于是又手动安装了5.9.8。 查看qmake版本,qmake -v, 虽然项目中已经指定了5.9.8, 但是系统…

通过String字符生成base64编码在生成图片

* base64转图片 //对字节数组字符串进行Base64解码并生成图片 * param base64str base64码 * return // param savePath 图片路径private static final String savePath"image_ver\\verifyCode"; 判断是否为base64编码 public static void mainDD…

关闭深度学习训练/推理进程的方法

引言 设想有一种情况,在ssh服务器训练/推理的时候,突然断线,再次打开ssh的时候,发现后台在运行,此时无法使用 ctrlc 终止,从而,可以用一个很简单的办法来结束:手动关闭进程。 方法 输…

python中如何记录日志?

日志是一种可以追踪某些软件运行时所发生事件的方法。一条日志信息对应的是一个事件的发生,而一个事件通常需要包括以下几个内容:事件发生时间、事件发生位置、事件的严重程度--日志级别、事件内容。 logging模块定义的函数和类为应用程序和库的开发实现…

Python-Python基础综合案例——数据可视化 - 动态柱状图

版本说明 当前版本号[20230729]。 版本修改说明20230729初版 目录 文章目录 版本说明目录知识总览图Python基础综合案例——数据可视化 - 动态柱状图案例效果基础柱状图通过Bar构建基础柱状图反转x和y轴将数值标签放在右侧 基础时间线柱状图创建时间线自动播放时间线设置主题…

基于FPGA的VGG16卷积神经网络加速器--WL

VGG16是一个典型的卷积神经网络,由13层卷积层,5层池化层和3层全连接层组成。且卷积层的计算时间在整个计算过程中占比极大,通过FPGA的并行运算可以有效的加快卷积层的计算速度。 一个卷积层可以有若干个卷积核,以第一层为例&#…

NetSuite 工单超额完工

用户问题 在报工时,完工数量能否超过工单上的计划数量? 解决方法 在制造相关的参数中,有一个参数控制: ALLOW OVERAGE ON WORK ORDER TRANSACTIONS •Check On允许超出工单计划数量 •Check Off不允许超出工单计划数量 Demo 工单计划数量…

前缀和拆分

前缀和 前缀和:一段序列里的前n项和 给出n个数,在给出q次问询,每次问询给出L、R,快速求出每组数组中一段L至R区间的和 给出一段数组,每次问询为求出l到r区间的和 普通方法:L到R进行遍历,那么…