LINUX-I.MX6U从零开始之1.8--定时器

一,EPIT 定时器

EPIT 的全称是:Enhanced Periodic Interrupt Timer,直译过来就是增强的周期中断定时器。
I.MX6U 的 EPIT 定时器只是完成周期性中断定时的,仅此一项功能!无输入捕获、PWM 输出等功能。

1.1 定时器特性

EPIT 是一个 32 位定时器,在处理器几乎不用介入的情况下提供精准的定时中断,软件使能以后 EPIT 就会开始运行。
EPIT 定时器有如下特点:
1.时钟源可选的 32 位向下计数器。
2.12 位的分频值。
3.当计数值和比较值相等的时候产生中断。

1.2定时器结构

① 多路选择器,选择 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 可以设置引脚输出,如果设置了的话就会通过指定的引脚输出信号。
⑤ 产生比较中断,也就是定时中断。
在这里插入图片描述

1.3 定时器工作模式

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

1.3.1 配置寄存器 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 的时候来源于加载寄存器。
EN(bit0):EPIT 使能位,为 0 的时候关闭 EPIT,为 1 的时候使能 EPIT。
在这里插入图片描述

1.3.2 寄存器 EPITx_SR(比较中断)

寄存器 EPITx_SR 只有一个位有效,那就是 OCIF(bit0),这个位是比较中断标志位。
为 0 的时候表示没有比较事件发生,为 1 的时候表示有比较事件发生。
当比较中断发生以后需要手动清除此位,此位是写 1 清零的。
在这里插入图片描述

1.3.3 寄存器 EPITx_LR、 EPITx_CMPR 和 EPITx_CNR(存放数据)

寄存器 EPITx_LR、 EPITx_CMPR 和 EPITx_CNR 分别为加载寄存器、 比较寄存器和计数寄存器,这三个寄存器都是用来存放数据的,很简单。

寄存器详细的描述,请参考《I.MX6ULL 参考手册》第 1174 页的 24.6 小节。

1.4 EPIT 配置步骤(例)

使用 EPIT 产生定时中断,然后在中断服务函数里面翻转 LED0,以 EPIT1 为例。
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)位来设置。

二,GPT 定时器

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

2.1 GPT 定时器特性

①、一个可选时钟源的 32 位向上计数器。
②、两个输入捕获通道,可以设置触发方式。
③、三个输出比较通道,可以设置输出模式。
④、可以生成捕获中断、比较中断和溢出中断。
⑤、计数器可以运行在重新启动(restart)或(自由运行)free-run 模式。

2.2 GPT 定时器设置
2.2.1 可选时钟源

一共有五个时钟源,分别为:ipg_clk_24M、GPT_CLK(外部时钟)、ipg_clk、 ipg_clk_32k 和 ipg_clk_highfreq。 本例程选择 ipg_clk 为 GPT 的时钟源, ipg_clk-66MHz。
在这里插入图片描述

2.2.2 定时器结构

①、此部分为 GPT 定时器的时钟源,前面已经说过了,本章例程选择 ipg_clk 作为 GPT 定时器时钟源。
②、此部分为 12 位分频器,对时钟源进行分频处理,可设置 0~4095,分别对应 1~4096 分频。
③、经过分频的时钟源进入到 GPT 定时器内部 32 位计数器。④和⑤、这两部分是 GPT 的两路输入捕获通道,本章不讲解 GPT 定时器的输入捕获。
⑥、此部分为输出比较寄存器,一共有三路输出比较,因此有三个输出比较寄存器,输出比较寄存器是 32 位的。
⑦、此部分位输出比较中断,三路输出比较中断,当计数器里面的值和输出比较寄存器里面的比较值相等就会触发输出比较中断。
在这里插入图片描述

2.2.3 两种工作模式

重新启动(restart)模式和自由运行(free-run)模式。
重新启动(restart) 模式:当 GPTx_CR(x=1,2)寄存器的 FRR 位清零的时候 GPT 工作在此模式。在此模式下,当计数值和比较寄存器中的值相等的话计数值就会清零,然后重新从0X00000000 开始向上计数, 只有比较通道 1 才有此模式! 向比较通道 1 的比较寄存器写入任何数据都会复位 GPT 计数器。对于其他两路比较通道(通道 2 和 3) ,当发生比较事件以后不会复位计数器。
自由运行(free-run) 模式:当 GPTx_CR(x=1,2)寄存器的 FRR 位置 1 时候 GPT 工作在此模式下,此模式适用于所有三个比较通道,当比较事件发生以后并不会复位计数器,而是继续计数,直到计数值为 0XFFFFFFFF,然后重新回滚到 0X00000000。

2.3 GPT 定时器的寄存器
2.3.1 配置寄存器 GPTx_CR

寄存器 GPTx_CR 我们用到的重要位如下:
SWR(bit15):复位 GPT 定时器,向此位写 1 就可以复位 GPT 定时器,当 GPT 复位完成以后此为会自动清零。
FRR(bit9) :运行模式选择,
当此位为 0 的时候比较通道 1 工作在重新启动(restart)模式。
当此位为 1 的时候所有的三个比较通道均工作在自由运行模式(free-run)。
CLKSRC(bit8:6):GPT 定时器时钟源选择位,
为 0 的时候关闭时钟源;
为 1 的时候选择ipg_clk 作为时钟源;
为 2 的时候选择 ipg_clk_highfreq 为时钟源;
为 3 的时候选择外部时钟为时钟源;
为 4 的时候选择 ipg_clk_32k 为时钟源;
为 5 的时候选择 ip_clk_24M 为时钟源。
本章例程选择 ipg_clk 作为 GPT 定时器的时钟源,因此此位设置位 1(0b001)。
ENMODE(bit1) :GPT 使能模式,
此位为 0 的时候如果关闭 GPT 定时器,计数器寄存器保存定时器关闭时候的计数值。
此位为 1 的时候如果关闭 GPT 定时器,计数器寄存器就会清零。
EN(bit) :GPT 使能位,
为 1 的时候使能 GPT 定时器,
为 0 的时候关闭 GPT 定时器。
在这里插入图片描述

2.3.2 分频寄存器 GPTx_PR

寄存器 GPTx_PR 我们用到的重要位就一个:PRESCALER(bit11:0),这就是 12 位分频值,可设置 0~4095,分别对应 1~4096 分频。
在这里插入图片描述

2.3.3 状态寄存器 GPTx_SR

ROV(bit5) :回滚标志位,当计数值从 0XFFFFFFFF 回滚到 0X00000000 的时候此位置 1。
IF2~IF1(bit4:3) :输入捕获标志位,当输入捕获事件发生以后此位置 1,一共有两路输入捕获通道。
如果使用输入捕获中断的话需要在中断处理函数中清除此位。
OF3~OF1(bit2:0):输出比较中断标志位,当输出比较事件发生以后此位置 1,一共有三路输出比较通道。
如果使用输出比较中断的话需要在中断处理函数中清除此位。
在这里插入图片描述

2.3.4 计数寄存器 GPTx_CNT

这个寄存器保存着 GPT 定时器的当前计数值。

2.3.5 输出比较寄存器 GPTx_OCR

每个输出比较通道对应一个输出比较寄存器,因此一个 GPT 定时器有三个 OCR 寄存器,它们的作都是相同的。以输出比
较通道 1 为例,其输出比较寄存器为 GPTx_OCR1,这是一个 32 位寄存器,用于存放 32 位的比较值。当计数器值和寄存器 GPTx_OCR1 中的值相等就会产生比较事件,如果使能了比较中断的话就会触发相应的中断。

2.4 GPT 定时器实现高精度延时原理

高精度延时函数的实现肯定是要借助硬件定时器。
如果设置 GPT 定时器的时钟源为 ipg_clk=66MHz, 设置 66 分频, 那么进入 GPT定时器的最终时钟频率就是 66/66=1MHz, 周期为 1us。 GPT 的计数器每计一个数就表示 “过去”了 1us。如果计 10 个数就表示“过去”了 10us。通过读取寄存器 GPTx_CNT 中的值就知道计了个数。
比如现在要延时100us, 那么进入延时函数以后纪录下寄存器GPTx_CNT中的值为200,当 GPTx_CNT 中的值为 300 的时候就表示 100us 过去了,也就是延时结束。GPTx_CNT 是个32 位寄存器, 如果时钟为 1MHz 的话, GPTx_CNT 最多可以实现 0XFFFFFFFFus=4294967295us≈4294s≈72min。

也就是说 72 分钟以后 GPTx_CNT 寄存器就会回滚到 0X00000000,也就是溢出,所以需要在延时函数中要处理溢出的情况。

2.4.1 实现步骤

1 、设置 GPT1 定时器
首先设置 GPT1_CR 寄存器的 SWR(bit15)位来复位寄存器 GPT1。复位完成以后设置寄存器 GPT1_CR 寄存器的 CLKSRC(bit8:6)位,选择 GPT1 的时钟源为 ipg_clk。设置定时器 GPT1的工作模式,
2 、设置 GPT1 的分频值
设置寄存器 GPT1_PR 寄存器的 PRESCALAR(bit111:0)位,设置分频值。
3 、设置 GPT1
如果要使用 GPT1 的输出比较中断,那么 GPT1 的输出比较寄存器 GPT1_OCR1 的值可以根据所需的中断时间来设置。本章例程不使用比较输出中断,所以将 GPT1_OCR1 设置为最大值,即:0XFFFFFFFF。
4、使能 GPT1 定时器
设置好 GPT1 定时器以后就可以使能了, 设置 GPT1_CR 的 EN(bit0)位为 1 来使能 GPT1 定时器。
5 、编写延时函数
GPT1定时器已经开始运行了, 根据高精度延时函数原理来编写延时函数,针对 us 和 ms 延时分别编写两个延时函数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值