Linux(十三)定时器系统

EPIT定时器

 

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

EPIT 是一个 32 位定时器,在处理器几乎不用介入的情况下提供精准的定时中断,软件使能以后 EPIT 就会开始运行, EPIT 定时器有如下特点:

①、时钟源可选的 32 位向下计数器。

②、 12 位的分频值。

③、当计数值和比较值相等的时候产生中断。

 

和STM32不同:

1.EPIT是一个纯粹的定时器功能,但是只能向下计数。

2.时钟源可选三种,STM32不可选。

3.没有输入捕获、PWM等功能,只能用做计数。

4.EPIT没有单次模式,只有循环模式,除非关闭定时器。

 

EPIT结构

Linux(十三)定时器系统

1.这是个多路选择器,用来选择 EPIT 定时器的时钟源, EPIT 共有 3 个时钟源可选择,ipg_clk、 ipg_clk_32k 和 ipg_clk_highfreq。

2.这是一个 12 位的分频器,负责对时钟源进行分频, 12 位对应的值是 0~4095,对应着1~4096 分频。

3.经过分频的时钟进入到 EPIT 内部,在 EPIT 内部有三个重要的寄存器:计数寄存器(EPIT_CNR)、加载寄存器(EPIT_LR)和比较寄存器(EPIT_CMPR),这三个寄存器都是 32 位的。

EPIT 是一个向下计数器,也就是说给它一个初值,它就会从这个给定的初值开始递减,直到减为 0,计数寄存器里面保存的就是当前的计数值。如果 EPIT 工作在 set-and-forget 模式下,当计数寄存器里面的值减少到 0, EPIT 就会重新从加载寄存器读取数值到计数寄存器里面,重新开始向下计数。若是free-running模式下,则计数器每次从0xffffffff开始计数。比较寄存器里面保存的数值用于和计数寄存器里面的计数值比较,如果相等的话就会产生一个比较事件。

如何使用EPIT来翻转LED?

本章我们使用 EPIT 产生定时中断,然后在中断服务函数里面翻转 LED0,接下来以 EPIT1 为例,讲解需要哪些步骤来实现这个功能。 EPIT 的配置步骤如下:

1、设置 EPIT1 的时钟源

设置寄存器 EPIT1_CR 寄存器的 CLKSRC(bit25:24)位,选择 EPIT1 的时钟源。

2、设置分频值

设置寄存器 EPIT1_CR 寄存器的 PRESCALAR(bit15:4)位,设置分频值。

3、设置工作模式

设置寄存器 EPIT1_CR 的 RLD(bit3)位,设置 EPTI1 的工作模式。

4、设置计数器的初始值来源

设置寄存器 EPIT1_CR 的 ENMOD(bit1)位, 设置计数器的初始值来源。

5、 使能比较中断

我们要使用到比较中断,因此需要设置寄存器 EPIT1_CR 的 OCIEN(bit2)位,使能比较中断。

6、设置加载值和比较值

设置寄存器 EPIT1_LR 中的加载值和寄存器 EPIT1_CMPR 中的比较值,通过这两个寄存器就可以决定定时器的中断周期。

7、 EPIT1 中断设置和中断服务函数编写

使能 GIC 中对应的 EPIT1 中断,注册中断服务函数,如果需要的话还可以设置中断优先级。最后编写中断服务函数。

8、使能 EPIT1 定时器

配置好 EPIT1 以后就可以使能 EPIT1 了,通过寄存器 EPIT1_CR 的 EN(bit0)位来设置。

 

如何编写驱动,使LED按照500ms翻转一次

配置一个定时器,使得500ms触发一次。

前面我们了解到EPIT是可以选择时钟源的,这里我们选择66MHZ的时钟源,那么要使得周期为500ms,则分频为1,计数器值为66M/2,模式配置为 set-and-forget。

Linux(十三)定时器系统

Linux(十三)定时器系统

在main函数中对EPIT1进行初始化

Linux(十三)定时器系统

 

那么epit1_irqhandler中断服务函数

Linux(十三)定时器系统

 

====================================================================================================

GPT定时器

GPT 定时器全称为 General Purpose Timer。通用定时器。

GPT 定时器是一个 32 位向上定时器(也就是从 0X00000000 开始向上递增计数), GPT 定时器也可以跟一个值进行比较,当计数器值和这个值相等的话就发生比较事件,产生比较中断。GPT 定时器有一个 12 位的分频器,可以对 GPT 定时器的时钟源进行分频。

GPT 定时器特性如下:

①、一个可选时钟源的 32 位向上计数器。

②、两个输入捕获通道,可以设置触发方式。

③、三个输出比较通道,可以设置输出模式。

④、可以生成捕获中断、比较中断和溢出中断。

⑤、计数器可以运行在重新启动(restart)或(*运行)free-run 模式。

 

用法:

和EPIT不同的是GPT是向上计数器,而且还有两个通道的输入捕获和三个通道的输出功能(可以选择不用,像EPIT一样,只用比较中断)。

若配置了输出比较功能,则当计数器与比较器比较后若相等,则可以在对应通道上输出设定的电平,这种方式占用GPTx_CAPTUREx管脚;当然,如果不对通道的管脚输出,只做比较中断用也是可以的,这种方式不占用GPTx_CAPTUREx管脚。同STM32一样,都需要使能三个输出比较中断。

若配置了输入捕获,则根据配置上升沿、下降沿、上升和下降沿,触发中断。需要使能输入捕获中断。

若输出、输入功能都不用,仅作为计数器去也是可以的。使能GPT,即CR寄存器0bit设为1,就开启了定时器。

 

GPT可以不开启中断,只让他不停的向上计数。若开启中断则从GPTx_IR寄存器使能中断。

 

GPT和EPIT相同,有两种模式:

重启模式:当比较事件触发后,计数器回到0继续上升。

*模式:不管比较事件,只有到了0xffffffff,计数器才回到0继续上升,并且会使得GPTx_SR的ROV(bit5): 回滚标志位置1。