imx6ull Enhanced Periodic Interrupt Timer (EPIT)

2023-11-11 05:30

本文主要是介绍imx6ull Enhanced Periodic Interrupt Timer (EPIT),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、overview

EPIT是一个32位的计时器,能够在处理器很少干预的情况下以固定的时间间隔提供精确的中断。软件使能后,EPIT就开始计数。IMX6ULL有2个EPIT定时器。其框图如下所示:

1.1 epit 特性

EPIT具有以下主要特性:
•可选择时钟源的32位递减计数器
•12位预分频器,用于对输入时钟进行分频
•可即时编程的计数器值
•可以设置在低功耗和调试模式下,计数器仍然运行
•计数器达到比较值时产生中断

1.2操作模式

EPIT可以设置为set-and-forget或free-running模式,设置EPIT_CR[RLD]选择所需的模式。

① set-and-forget模式
要选择这种操作模式,将控制寄存器(EPIT_CR)中的RLD位置1。在这种模式下,计数器从加载寄存器(EPIT_LR)获取初始值,你不能直接写入初始值。每当计数器达到零时,EPIT_LR中的值就会加载到计数器中,计数器再次将此值减到零。要想立刻设置EPIT的计数值,不必等到它减小到0后再加载EPIT_LR。可以设置EPIT计数器覆盖使能位(EPIT_CR [IOVW]),并将所需的初始化值写EPIT_LR。

② free-runnning模式
选择此操作模式的话,需要清除RLD位。在这种模式下,计数器递减到0000 0000h时,会翻转到FFFF FFFFh。不会从加载寄存器重新加载新值。翻转后,计数器继续递减计数。要直接初始化计数器,需要设置EPIT计数器覆盖使能位(EPIT_CR[IOVW]),并将所需的初始化值写入EPIT_LR。

1.3比较事件

EPIT启动后,EPIT_CNR中的值递减,当它等于EPIT_CMPR的值时,就产生比较事件:设置比较状态标志,产生中断(如果控制寄存器中的OCIEN位是1的话)。可以设置控制寄存器中输出模式(OM)位,当发生比较事件时,对应的输出引脚如何动作:置位(set)、清除(clear)、翻转(toggle)或者不受影响。先讲个概念:翻转(rollover),就是当计数器值达到0x0000_0000时,它需要加载新值,这就叫rollover。如果需要在翻转时产生中断,则比较寄存器的取值要小心设置:
① 在set-and-forget模式下,应该取EPITx_LR的值;
② 在free-running模式下,应该取0xFFFF_FFFF。

下图显示了比较事件和中断的时序:

计数器值覆盖:可以在任何时候将EPIT计数器值设置为所需要的值,操作方法为:
① 设置控制寄存器中的IOVW位,即EPIT_CR[IOVW];
② 然后将值写入到加载寄存器,即EPIT_LR;
如果EPIT正在运行,则计数器将以新值继续计数。

二、EPIT寄存器

2.1 EPIT Control register (EPITx_CR)

位域读写描述
[25:24]CLKSRCR/W时钟源选择,00:时钟源断开;01:Peripheral clk,即ipg_clk;10:Hign-frequency,即ipg_clk_highfreq;11:low-frequency,即ipg_clk_32k
[23:22]OMR/W用来设置输出通道模式,00:输出引脚跟EPIT断开,即输出引脚不受影响;01:输出引脚翻转;10:输出引脚清0;11:输出引脚置位
[21]STOPENR/Wstop mode时EPIT是否使能,0:在stop mode下,EPIT禁止1:在stop mode下,EPIT仍然使能
[19]WAITENR/WWait mode时EPIT是否使能,0:在wait mode下,EPIT禁止1:在wait mode下,EPIT仍然使能
[18]DBGENR/WDebug mode时EPIT是否使能,0:在debug mode下,EPIT禁止1:在debug mode下,EPIT仍然使能
[17]IOVWEPIT计数器覆盖使能位,0:写入EPIT_LR的值不会覆盖EPIT计数器;1:写入EPIT_LR的值会马上覆盖EPIT计数器的值
[16]SWRR/W软件复位,这位会自动清零,a. EPIT在复位状态时,该位自动置1b. 复位结束时,该位自动清0c. 设置该位为1时,会把所有寄存器设置为它们的默认值,EPITx_CR中这些位不受影响:EN、ENMOD、STOPEN、WAITEN、DBGEN
[15:4]PRESCALERR/WEPIT时钟的分频系数,0x000:除以1;0x001:除以2;……0xFFF:除以4096
[3]RLDR/W计数器模式(计数器加载模式),0:free-running mode,计数器到达0时,变为0xFFFFFFFF;1:set-and-forget mode,计数器到达0时,加载EPITx_LR的值
[2]OCIENR/W输出比较中断使能,0:比较事件发生时,中断禁止;1:比较事件发生时,中断使能
[1]ENMODR/W当EPIT重新使能后,主计数值从什么值开始计数:0:从上次关闭时的计数值继续计数;1:如果RLD为1,从加载计数器开始计数;如果RLD为0,从0xFFFF_FFFF开始计数;EPIT重新使能时,预分频计数器总是从0开始计数。
[0]ENR/WEPIT使能位,0:EPIT禁止;1:EPIT使能

2.2 Status register (EPITx_SR)

位域读写描述
[0]OCIFR/WOutput compare interrupt flag,0:比较事件未发生;1:比较事件已发生

2.3 Load register (EPITx_LR)

位域读写描述
[31:0]LOADR/W加载值

2.4 Compare register (EPITx_CMPR)

位域读写描述
[31:0]COMPARER/W比较值

2.5 Counter register (EPITx_CNR)

位域读写描述
[31:0]COUNTR/WEPIT计数器的值

三、编程

使用epit 产生定时中断

/* assume use ipc clk which is 66MHz, 1us against to 66 count */
#define USEC_TO_COUNT(us) (us * 66 - 1)void epit_init(EPIT_Type *base, unsigned int us)
{base->CR = 0;//software reset base->CR |= (1 << 16);/* wait for software reset self clear*/while((base->CR) & (1 << 16)) ;/** EPIT_CR* bit21 stopen; bit19 waiten; bit18 debugen* bit17 overwrite enable; bit3 reload* bit2 compare interrupt enable; bit1 enable mode*/base->CR |= (1 << 21) | (1 << 19) | (1 << 3) | (1 << 1);/** EPIT_CR* bit25-24: 00 off, 01 peripheral clock(ipg clk), 10 high, 11 low* bit15-4: prescaler value, divide by n+1*/base->CR &= ~((0x3 << 24) | (0xFFF << 4));base->CR |= (1 << 24);/* EPIT_CMPR: compare register */base->CMPR = 0;/* EPIT_LR: load register , assue use ipc clk 66MHz*/base->LR = USEC_TO_COUNT(us);
}void epit_enable_interrupt(EPIT_Type *base, int on)
{/*  EPIT_CR bit2 OCIEN compare interrupt enable */if (on)base->CR |= (1 << 2);elsebase->CR &= ~(1 << 2);
}void epit_run(EPIT_Type *base, int on)
{/*  EPIT_CR bit0 EN */if (on)base->CR |= (1 << 0);elsebase->CR &= ~(1 << 0);
}int main()
{boot_clk_init();gic_init();epit_init(EPIT1, 1000000);// set 1srequest_irq(EPIT1_IRQn, (irq_handler_t)EPIT1_handle_irq, NULL);gic_enable_irq(EPIT1_IRQn);epit_enable_interrupt(EPIT1, 1);epit_run(EPIT1, 1);while(1){}
}

这篇关于imx6ull Enhanced Periodic Interrupt Timer (EPIT)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/387874

相关文章

4.15 版本内核调用 init_timer()函数出错

linux/include/linux/timer.h4.15 之前版本struct timer_list {14 /*15 * All fields that change during normal runtime grouped to the16 * same cacheline17 */18 struct hl

基于IMX6ULL的Cortex-A中断原理讲解,以及编写其中断向量表

首先借助STM32我们需要了解中断系统是如何构成的         会有一个中断源,也就是能够向CPU发出中断请求的设备或事件。中断源不分硬件和软件,也就是产生中断信号,就会执行中断服务函数         但是CPU是如何知道中断源产生后就找到对应的中断服务函数呢,这个时候就要引入中断向量表,它的主要功能是描述中断对应的中断服务函数,每个中断源都有一个唯一的中断号(也称向量号),

java AWT 绘图,实现弹球游戏,有实现keylistener,timer功能

Timer(int delay, ActionListener listener):每间隔delay毫秒,系统自动触发ActionListener监听器里的事件处理器(actionPerformed()方法)。 package javaAWT;import java.awt.Canvas;import java.awt.Color;import java.awt.Dimension;imp

正点原子阿尔法ARM开发板-IMX6ULL(二)——介绍情况以及汇编

文章目录 一、裸机开发(21个)二、嵌入式Linux驱动例程三、汇编3.1 处理器内部数据传输指令3.2 存储器访问指令3.3 压栈和出栈指令3.4 跳转指令3.5 算术运算指令3.6 逻辑运算指令 一、裸机开发(21个) 二、嵌入式Linux驱动例程 三、汇编 我们在进行嵌入式 Linux 开发的时候是绝对要掌握基本的 ARM 汇编,因为 Cortex-A 芯片一

Timer和ScheduledThreadPoolExecutor

文章来源: https://blog.csdn.net/u013332124/article/details/79603943 在jdk自带的库中,有两种技术可以实现定时任务。一种是使用Timer,另外一个则是ScheduledThreadPoolExecutor。下面为大家分析一下这两个技术的底层实现原理以及各自的优缺点。 一、Timer 1. Timer的使用

Segmentation简记5-AuxNet: Auxiliary tasks enhanced Semantic Segmentation for Automated Driving

创新点 1.分割网络为主任务,深度估计网络为辅任务 2.loss的设计 总结如图所示 网络结构如图所示 其实很容易理解。 backbone是基于ResNet50 分割网络是基于FCN8 深度估计网络与分割网络类似,最后一层是回归深度层。 最有意思的是两种任务的loss的合并。 分割的loss很常见:cross entropy 深度loss:mean absolute error 算法一:

Android -- 视频音频多媒体播放,在线播放, MediaPlayer, SurfaceView, SoundPool, Timer定时器使用

1. SoundPool 用于快速重复的播放短音频 [java]  view plain copy public class MainActivity extends Activity {       private SoundPool soundPool;       private int soundId;          @Override       protec

Android开发Timer计时器的操作实例

本文内容讲的是Android开发中Timer计时器如何实现。实际上Timer和TimerTask都是JDK自带的功能,两个类结合可以实现定时任务执行一次,或者定期重复执行任务。 下面模拟一个Android开发Timer计时器实例:   1、新建一个项目:Lesson34_Timer2、MainActivity.java代码如下:   package basic.android.timer

STM32CUBEIDE FreeRTOS操作教程(四):timer软件定时器

STM32CUBEIDE FreeRTOS操作教程(四):timer软件定时器 STM32CUBE开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件,不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开发板为例,只用到USB,USART1极少的接口,体现FreeRTOS的各种操作过程。 操作教程(四)配置FreeRTO

NLP-文本匹配-2016:ESIM【Enhanced LSTM for Natural Language Inference】

NLP-文本匹配-2016:ESIM【Enhanced LSTM for Natural Language Inference】