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.mzph.cn/news/15072.shtml

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

相关文章

PysparkNote006---pycharm加载spark环境

pycharm配置pyspark环境,本地执行pyspark代码 spark安装、添加环境变量不提了 File-Settings-Project-Project Structure-add content root添加如下两个路径 D:\code\spark\python\lib\py4j-0.10.7-src.zipD:\code\spark\python\lib\pyspark.zip 2023-07-26 阴 于…

Redis缓存预热

说明:项目中使用到Redis,正常情况,我们会在用户首次查询数据的同时把该数据按照一定命名规则,存储到Redis中,称为冷启动(如下图),这种方式在一些情况下可能会给数据库带来较大的压力…

AcWing 算法基础课二 数据结构 链表 栈 队列 并查集 哈希表

单链表. AcWing. 826.单链表 import java.util.Scanner; public class Main{static int[] e new int[100010];//结点i的值static int[] ne new int[100010];//结点i的next指针static int idx,head;//head是头结点,idx存当前已经用到了哪个点public static void i…

【简化程序设计】C++STL“容器适配器“之栈和队列

【STL】容器适配器之栈和队列 stack的介绍和使用stack的介绍stack的使用stack的模拟实现 queue的介绍和使用queue的介绍queue的使用queue的模拟实现 priority_queue的介绍和使用priority_queue的介绍priority_queue的使用priority_queue的模拟实现 容器适配器什么是容器适配器&…

基于x-scan扫描线的3D模型渲染算法

基于x-scan算法实现的z-buffer染色。c#语言&#xff0c;.net core framework 3.1运行。 模型是读取3D Max的obj模型。 x-scan算法实现&#xff1a; public List<Vertex3> xscan() {List<Vertex3> results new List<Vertex3>();SurfaceFormula formula g…

从使用回溯分割字符串的技巧到前向搜索

题目 131. 分割回文串 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 答案&#xff1a; class Solution {boolean[][] f;List<List<String>>…

【多线程中的线程安全问题】线程互斥

1 &#x1f351;线程间的互斥相关背景概念&#x1f351; 先来看看一些基本概念&#xff1a; 1️⃣临界资源&#xff1a;多线程执行流共享的资源就叫做临界资源。2️⃣临界区&#xff1a;每个线程内部&#xff0c;访问临界资源的代码&#xff0c;就叫做临界区。3️⃣互斥&…

【密码学】三、AES

AES 1、AES产生2、数学基础2.1有限域GF(2^8^)2.1.1加法运算2.1.2乘法运算2.1.3x乘运算2.1.4系数在GF(2^8^)上的多项式 3、AES算法描述3.1字节代换3.2行移位3.3列混合3.4轮密钥加3.5密钥扩展 1、AES产生 征集AES算法的活动&#xff0c;目的是确定一个非保密的、公开的、全球免费…

HCIP——重发布及路由策略实验

重发布及路由策略实验 一、实验拓扑二、实验要求三、实验思路三、实验步骤1、配置接口IP地址以及环回地址2、配置动态路由协议3、重发布4、更改接口类型5、配置路由策略 一、实验拓扑 二、实验要求 1、使用双点双向重发布2、所有路由器进行最佳选路3、存在备份路径&#xff0c…

软考05根据内存区域大小计算芯片数量

文章目录 前言一、原题二、解题思路1.计算内存区域的大小2.计算每个存储器芯片的容量3.计算芯片数量 总结 前言 从网上看题答案是有了&#xff0c;但是不知道具体的计算过程就很难受&#xff0c;不然下次还是不会&#xff0c;只能自己梳理了 一、原题 二、解题思路 1.计算内存…

Android开发之Fragment动态添加与管理

文章目录 主界面布局资源两个工具Fragment主程序 主界面布局资源 在activity_main.xml中&#xff0c;声明两个按钮备用&#xff0c;再加入一个帧布局&#xff0c;待会儿用来展示Fragment。 <?xml version"1.0" encoding"utf-8"?> <LinearLayo…

手机的python怎么运行文件,python在手机上怎么运行

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;手机上的python怎么运行程序&#xff0c;手机的python怎么运行文件&#xff0c;今天让我们一起来看看吧&#xff01; 1、python程序怎么在手机上运行 python语言应用很广泛&#xff0c;自己也很喜欢使用它&#xff0c;其…

iOS - 检测项目中无用类和无用图片

一、无引用图片检测 LSUnusedResources 安装插件 LSUnusedResources &#xff0c;用【My Mac】模拟器运行,如下图&#xff1a; Project Path 就是项目所在的路径&#xff0c;然后点击右下角 Search按钮&#xff0c;就可以看到被搜索出来的图片资源。 注意&#xff1a;这里被搜…

Linux——进程控制

目录 1. 进程创建 1.1 fork函数 1.2 fork系统调用内部宏观流程 1.3 fork后子进程执行位置分析 1.4 fork后共享代码分析 1.5 fork返回值 1.6 写时拷贝 1.7 fork常规用法 1.8 fork调用失败的原因 2.进程终止 2.1 进程退出场景 2.2 strerror函数—返回描述错误号的字符…

解决问题:python PermissionError: [WinError 5]拒绝访问

重要&#xff1a;关闭PyCharm Community Edition 2022.3等与python相关的编程程序找到按照python解释器的位置python->右键>属性>安全->点击组或用户名"中的Users->编辑点击"组或用户名"中的Users->把"完全控制"打钩->应用->…

Servlet文件的下载

第一种方法直接在前端使用超链接&#xff0c;也就是a标签 浏览器不能识别会直接下载&#xff08;像压缩文件不能直接下载&#xff09;&#xff0c;浏览器能识别&#xff0c;想要下载加一个download属性。download可以不写任何信息。 首先在web下建一个文件&#xff0c;放需要…

在Windows 10和11中恢复已删除的照片

可以在Windows 10或11上恢复已删除的照片吗&#xff1f; 随着技术的发展&#xff0c;越来越多的用户习惯在电子设备上存储照片。如果这些照片被删除&#xff0c;可能会给用户带来重大损失。当照片丢失时&#xff0c;您可能会想是否可以恢复已删除的照片&#xff1f; …

Kafka原理剖析

一、简介 Kafka是一个分布式的、分区的、多副本的消息发布-订阅系统&#xff0c;它提供了类似于JMS的特性&#xff0c;但在设计上完全不同&#xff0c;它具有消息持久化、高吞吐、分布式、多客户端支持、实时等特性&#xff0c;适用于离线和在线的消息消费&#xff0c;如常规的…

内网隧道代理技术(十五)之 Earthworm的使用(二级代理)

Earthworm的使用(二级代理) 本文紧接着上一篇文章继续讲解Earthworm工具的使用 (二级代理)正向连接 二级正向代理发生在如下的情况: 1、Web服务器在公网,黑客可以直接访问 2、B机器在内网,黑客不能直接访问 3、Web服务器可以访问内网机器B 4、内网机器B可以访问公司…

ARM将常数加载到寄存器方法之LDR伪指令

一、是什么&#xff1f; LDR Rd,const伪指令可在单个指令中构造任何32位数字常数,使用伪指令可以生成超过MOV和MVN指令 允许范围的常数. 实现原理: (1)如果可以用MOV或MVN指令构造该常数,则汇编程序会生成适当的指令 (2)如果不能用MOV或MVN指令构造该常数,则汇编程序会执行下列…