当前位置: 首页 > news >正文

I.MX6UL:EPIT

        EPIT (Enhanced Periodic Interrupt Timer)增强的周期中断定时器,它主要是完成周期性中断定时的。学过 STM32 的话应该知道,STM32 里面的定时器还有很多其它的功能,比如输入捕获、PWM 输出等等。但是 I.MX6U 的 EPIT 定时器只是完成周期性中断定时的,仅此一项功能,这里与STM32不同至于输入捕获、PWM 输出等这些功能,I.MX6U 由其它的外设来完成。

一、EPIT 定时器详解

        IMX6UL有两个EPTI定时器,EPIT 是一个 32 位定时器,EPIT 定时器结构如图所示:
(1)时钟源可选的 32 位向下计数器。
(2)12 位的分频值。
(3)当计数值和比较值相等的时候产生中断。

图中各部分的功能如下:
①、这是个多路选择器,用来选择 EPIT 定时器的时钟源,EPIT 共有 3 个时钟源可选择,
ipg_clk、ipg_clk_32k 和 ipg_clk_highfreq。
②、这是一个 12 位的分频器,负责对时钟源进行分频,12 位对应的值是 0~4095,对应着
1~4096 分频。
③、经过分频的时钟进入到 EPIT 内部,在 EPIT 内部有三个重要的寄存器:计数寄存器(EPIT_CNR)、加载寄存器(EPIT_LR)和比较寄存器(EPIT_CMPR),这三个寄存器都是 32 位的。EPIT 是一个向下计数器,也就是说给它一个初值,它就会从这个给定的初值开始递减,直到减为 0,计数寄存器里面保存的就是当前的计数值。如果 EPIT 工作在 set-and-forget 模式下,当计数寄存器里面的值减少到 0,EPIT 就会重新从加载寄存器读取数值到计数寄存器里面,重新开始向下计数。比较寄存器里面保存的数值用于和计数寄存器里面的计数值比较,如果相等的话就会产生一个比较事件。

④、比较器。
⑤、EPIT 可以设置引脚输出,如果设置了的话就会通过指定的引脚输出信号。
⑥、产生比较中断,也就是定时中断。

        EPIT 定时器有两种工作模式:set-and-forget 和 free-running,这两个工作模式的区别如下:set-and-forget 模式:EPITx_CR(x=1,2)寄存器的 RLD 位置 1 的时候 EPIT 工作在此模式下,在此模式下 EPIT 的计数器从加载寄存器 EPITx_LR 中获取初始值,不能直接向计数器寄存器写入数据。不管什么时候,只要计数器计数到 0,那么就会从加载寄存器 EPITx_LR 中重新加载数据到计数器中,周而复始(是不是像STM32定时器的自动重装载)
        free-running 模式:EPITx_CR 寄存器的 RLD 位清零的时候 EPIT 工作在此模式下,当计数器计数到 0 以后会重新从 0XFFFFFFFF 开始计数,并不是从加载寄存器 EPITx_LR 中获取数据。        


      接下来看一下 EPIT 重要的几个寄存器,EPIT 的配置寄存器 EPITx_CR,此寄存器的结构如图。

寄存器 EPITx_CR 我们用到的重要位如下:
CLKSRC(bit25:24):EPIT 时钟源选择位,为 0 的时候关闭时钟源,1 的时候选择Peripheral 时钟(ipg_clk),为 2 的时候选择 High-frequency 参考时钟(ipg_clk_highfreq),为 3 的时候选择 Low-frequency 参考时钟(ipg_clk_32k)。在本例程中,我们设置为 1,也就是选择 ipg_clk作为 EPIT 的时钟源,ipg_clk=66MHz。
PRESCALAR(bit15:4):EPIT 时钟源分频值,可设置范围 0~4095,分别对应 1~4096 分频。        

        RLD(bit3):EPIT 工作模式,为 0 的时候工作在 free-running 模式,为 1 的时候工作在 set-and-forget 模式。本章例程设置为 1,也就是工作在 set-and-forget 模式。
OCIEN(bit2):比较中断使能位,为 0 的时候关闭比较中断,为 1 的时候使能比较中断,本章试验要使能比较中断。
ENMOD(bit1):设置计数器初始值,为 0 时计数器初始值等于上次关闭 EPIT 定时器以后计数器里面的值,为 1 的时候来源于加载寄存器(RLD=1)或者0XFFFFFFFF(RLD=0)。
EN(bit0):EPIT 使能位,为 0 的时候关闭 EPIT,为 1 的时候使能 EPIT。


寄存器 EPITx_SR 结构体如图。

        寄存器 EPITx_SR的OCIF(bit0),这个位是比较中断标志位,为 0 的时候表示没有比较事件发生,为 1 的时候表示有比较事件发生。当比较中断发生以后需要手动清除此位,此位是写 1 清零的(图中标注了w1c)。


        EPITx_CMPR寄存器如下图:当计数器的值和CMPR相等之后就会产生比较中断。

二、程序编写

        实验为LED灯500ms闪烁,设置了 EPIT1 工作模式为 set-and-forget,并且时钟源为 ipg_clk=66MHz。我们现在要设置 EPIT1 中断周期为 500ms,可以设置分频值为 0,也就是 1 分频,这样进入 EPIT1的时 钟 就 是 66MHz (1s对应66Mhz即1s计数66M次数)。如 果 要 实 现 500ms 的中 断 周 期 , EPIT1 的加 载 寄 存 器 就 应 该 为66000000/2=33000000。


#include "bsp_epittimer.h"
#include "bsp_int.h"
#include "bsp_led.h"/** @description		: 初始化EPIT定时器.*					  EPIT定时器是32位向下计数器,时钟源使用ipg=66Mhz		 * @param - frac	: 分频值,范围为0~4095,分别对应1~4096分频。* @param - value	: 倒计数值。* @return 			: 无*/
void epit1_init(unsigned int frac, unsigned int value)
{if(frac > 0XFFF)frac = 0XFFF;EPIT1->CR = 0;	/* 先清零CR寄存器 *//** CR寄存器:* bit25:24 01 时钟源选择Peripheral clock=66MHz* bit15:4  frac 分频值* bit3:	1  当计数器到0的话从LR重新加载数值* bit2:	1  比较中断使能* bit1:    1  初始计数值来源于LR寄存器值* bit0:    0  先关闭EPIT1*/EPIT1->CR = (1<<24 | frac << 4 | 1<<3 | 1<<2 | 1<<1);EPIT1->LR = value;	/* 倒计数值 */EPIT1->CMPR	= 0;	/* 比较寄存器,当计数器值和此寄存器值相等的话就会产生中断 *//* 使能GIC中对应的中断 			*/GIC_EnableIRQ(EPIT1_IRQn);/* 注册中断服务函数 			*/system_register_irqhandler(EPIT1_IRQn, (system_irq_handler_t)epit1_irqhandler, NULL);	EPIT1->CR |= 1<<0;	/* 使能EPIT1 */ 
}/** @description			: EPIT中断处理函数* @param				: 无* @return 				: 无*/
void epit1_irqhandler(void)
{ static unsigned char state = 0;state = !state;if(EPIT1->SR & (1<<0)) 			/* 判断比较事件发生 */{led_switch(LED0, state); 	/* 定时器周期到,反转LED */}EPIT1->SR |= 1<<0; 				/* 清除中断标志位 */
}


文章转载自:

http://V7HXxrvs.bydpr.cn
http://AlwzbQRA.bydpr.cn
http://FpmIpG9u.bydpr.cn
http://T3HITzTE.bydpr.cn
http://X3Bcna03.bydpr.cn
http://QjXgurtP.bydpr.cn
http://OcrVmtN3.bydpr.cn
http://WIErrvNq.bydpr.cn
http://ibqYeaqg.bydpr.cn
http://T9Mhkwcc.bydpr.cn
http://Ahtwrz86.bydpr.cn
http://uHv9GqXv.bydpr.cn
http://jsfnsOQe.bydpr.cn
http://gbHgW5oU.bydpr.cn
http://oGnjM0Af.bydpr.cn
http://Dn7xrW1n.bydpr.cn
http://jaYUllTp.bydpr.cn
http://nCZBg35S.bydpr.cn
http://dcRK69Jc.bydpr.cn
http://coHYWx9p.bydpr.cn
http://gjlegh3n.bydpr.cn
http://UNjsJqsp.bydpr.cn
http://ALkIMKu5.bydpr.cn
http://fnP3rkB0.bydpr.cn
http://moOWObPJ.bydpr.cn
http://e8UQTbUa.bydpr.cn
http://uKxcgvbD.bydpr.cn
http://WTa2scBK.bydpr.cn
http://lO5AfGLs.bydpr.cn
http://Fs3zZK9R.bydpr.cn
http://www.dtcms.com/a/385279.html

相关文章:

  • 企业数字化转型的 4A 架构指南:从概念解读到 TOGAF 阶段对应
  • Linux基础之部署mysql数据库
  • 【文献分享】空间互近邻关系在空间转录组学数据中的应用
  • 高精度、高带宽的磁角度传感器——MA600A
  • HarmonyOS服务卡片开发:动态卡片与数据绑定实战指南
  • HarmonyOS迷宫游戏鸿蒙应用开发实战:从零构建随机迷宫游戏(初版)
  • 拥抱依赖注入的优雅与灵活:深入解析 Spring ObjectProvider
  • HarmonyOS数据持久化:Preferences轻量级存储实战
  • 机器学习势函数(MLPF)入门:用DeePMD-kit加速亿级原子模拟
  • X电容与Y电容的区别:电路安全设计的黄金组合
  • MySQL学习笔记02-表结构创建 数据类型
  • etcd压测造成数据目录过大恢复
  • 信息系统运维管理
  • 回溯算法经典题目+详细讲解+图示理解
  • 全网首发! Nvidia Jetson Thor 128GB DK 刷机与测评(四)常用功能测评 - 目标跟踪 Object Tracking 系列
  • [代码规范篇]Java代码规范
  • C++:string模拟实现中的赋值拷贝函数现代写法诡异地崩掉了......
  • 构建AI大模型对话系统
  • Linux基本指令(9)
  • 64_基于深度学习的蝴蝶种类检测识别系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)
  • 3-12〔OSCP ◈ 研记〕❘ WEB应用攻击▸利用XSS提权
  • 3dma渲染噪点成因排查及优化方案
  • Lombok
  • React Scheduler(调度器)
  • 多任务数据集的具体使用场景
  • KITTI数据集
  • 什么云服务器更好用推荐一下!?
  • 根据Linux内核原理 LRU链表如何知道page的活动频繁程度?
  • 2025全球LoRaWAN模组技术对比与应用方案解析
  • 社区主题征文——「异构融合与存算一体:架构探索与创新实践」算力技术征文