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

相关文章

基于imx6ull开发板 移植opencv4.7.0

一、概述 本章节是针对opencv-4.7.0移植到Linux系统,运行在正点原子-I.MX6U ALPHA开发板 上,详细的移植流程如下。 二、环境要求 2.1 硬件环境 正点原子-I.MX6U ALPHA开发板虚拟机:VMware 2.2 软件环境 Ubuntu系统要求:20.04opencv版本: 4.7.0opencv贡献软件版本:4.x交叉工具链版本:gcc-linaro-6

任务调度--使用java.util.Timer实现

任务调度是指基于给定时间点,给定时间间隔或者给定执行次数自动执行任务。 举个例子,比如说我们希望一个系统每周日晚上9点都将数据库文件备份一次,这时我们就可以使用任务调度来实现。为了更加的方便,我们需要在tomcat启动后,自动开始这个调度。 下面是TimerTask的API: 下面是Timer类的API 下面的例子中实现了两个功能: 1.监测tomcat的web容器的启动与关闭

java之定时器Timer

文章目录 1 概览2 终止Timer线程3 反复执行一个任务4 进一步分析schedule和scheduleAtFixedRate5 一些注意的问题 1 概览 Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以计划执行一个任务一次或反复多次。 TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。 简单的一个例程: import java

Documentation\devicetree\bindings\arm\arch_timer.txt

如果想评论或更新本文的内容,请直接联系原文档的维护者。 如果你使用英文交流有困难的话,也可以向中文版维护者求助。 如果本翻译更新不及时或者翻译存在问题,请联系中文版维护者。 中文版维护者: 陶莹莉  tyl18768122426@163.com 中文版翻译者:  陶莹莉  tyl18768122426@163.com 中文版校译者:  陶莹莉  tyl18768122426@1

Polyp-DDPM: Diffusion-Based Semantic Polyp Synthesis for Enhanced Segmentation

Polyp- ddpm:基于扩散的语义Polyp合成增强分割 摘要: 本研究介绍了一种基于扩散的方法Polyp-DDPM,该方法用于生成假面条件下息肉的逼真图像,旨在增强胃肠道息肉的分割。我们的方法解决了与医学图像相关的数据限制、高注释成本和隐私问题的挑战。通过对分割掩模(代表异常区域的二进制掩模)的扩散模型进行调节,poly - ddpm在图像质量(实现fr起始距离(FID)得分为78.47

MPC5748G之spi polling interrupt

开发环境: 硬件:MPC5748G软件:S32 Design Studio for Power Architecture Version 2017.R1外设:W25Q64 spi引脚: PI[6] CS0_2 xxxPE[15] SCLK_2 819PG[15] SOUT_2 xxxPG[14] SIN_2 818 步骤及注意事项: 1.配置好外设及系统时钟2.初始化sp

MPC5748G之can polling interrupt

开发环境: 硬件:MPC5748G软件:S32 Design Studio for Power Architecture Version 2017.R1外设:TPS43331 I2CTJA1043 CAN can引脚: PB0PB1 步骤及注意事项: 1.配置好外设及系统时钟2.初始化can设置1)轮询模式2)中断模式a.需要在中断向量表中配置中断函数b.初始化中断寄存器P

MPC5748G之adc polling interrupt

开发环境: 硬件:MPC5748G软件:S32 Design Studio for Power Architecture Version 2017.R1 adc引脚: PB5 步骤及注意事项: 1.配置好外设及系统时钟2.初始化adc设置1)轮询模式2)中断模式a.需要在中断向量表中配置中断函数b.初始化中断寄存器PSRc.使能adc转换中断 遇到的问题: EOC与ECH在

MPC5748G之i2c polling interrupt

开发环境: 硬件:MPC5748G软件:S32 Design Studio for Power Architecture Version 2017.R1外设:24LC256 I2C引脚: PE8PE9 步骤及注意事项: 1.配置好外设及系统时钟2.初始化I2C设置1)轮询模式2)中断模式a.需要在中断向量表中配置中断函数b.初始化中断寄存器PSRc.使能I2C接收发送中断

MPC5748G之uart polling interrupt

开发环境: 硬件:MPC5748G软件:S32 Design Studio for Power Architecture Version 2017.R1 串口引脚: PC8PC9 步骤及注意事项: 1.配置好外设及系统时钟2.初始化串口设置1)轮询模式2)中断模式a.需要在中断向量表中配置中断函数b.初始化中断寄存器PSRc.使能串口接收发送中断3.然后就可以愉快的开启串口终