IMX6ULL--EPIT 定时器理论
0.绪论
上一讲写了EPIT定时器的实验,中间讲到那个中断放入了延时函数,这种办法是不可行的,需要使用定时器去消抖,后面就想先不看教程自己写,发现写不出来,于是回过头来在看一下手册,把EPIT定时器的理论知识在学习一下。这里包含消抖的理论知识。可以直接看正点原子提供的手册,每个人理解不一样,接受程度不一样,我就属于接受比较慢的,完整的资料官网就有,不是他家的板子也可以参考一下。
1.EPIT定时器简介
EPIT是一个32位的定时器,在处理器几乎不用介入的情况下提供精准的定时中断,软件使能以后EPIT就会开始运行,EPIT定时器的特点:
1.时钟源可选的32位向下计数器
2.12位的分频值
3.当计数值和比较直相等的时候产生中断。

- 多路选择器,有三个时钟源可供选择
- 是一个12位的分频器,负责对时钟源进行分频,12位对应的值是0-4095,对应着1-4096分频。
- 经过分频的时钟进入到EPIT内部,在EPIT内部有三个重要的寄存器分别是:计数寄存器(EPIT_CNR),加载寄存器(EPIT_LR)和比较寄存器(EPIT_CMPR),都是32位寄存器。EPIT是一个向下计数器,也就是说给他一个初值,他就会从这个初值开始递减,直到减为0,EPIT_CNR(计数寄存器),里面保存的就是当前的计数值。这里就要提及EPIT的工作模式了
- 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中获取数据的。
- 比较器。
- EPIT可以设置引脚输出,如果设置了的话就会通过指定的引脚输出信号。
- 产生比较中断,也就是定时中断。
2.EPIT的配置步骤
这里拿上一讲的定时器代码来讲解一下,重新写一下。

这一步创建EPIT1的初始化函数,这里需要传递两个参数:分频值和计数值。上面有讲分频值是12位的,最大值是0XFFF,所以我们需要判断输入的分频值是否大于0XFFF以及是否小于0,如果大于0XFFF则将分频值设定为0XFFF,若小于0设定为0,即是1分频,防止原则上的错误。
2.1.设置EPIT1的时钟源

EPIT1->CR = 1 << 24;
2.2.设置分频值

由上图可以 EPITx_CR的pin4~pin15为设置EPIT的分频值,所以将我们输入的分频值左移4位即可。
EPIT1->CR = frec << 4;
2.3.设置工作模式

这里是设置的set-and-forget的工作模式,所以将bit3置为1,即是:
EPIT1->CR = 1 << 3;
2.4.设置计数器的初始值来源
这个就是我们传进来的第二个参数了,将计数值赋值给LR寄存器
EPIT1->CR = 1 << 1;
2.5.使能比较中断

EPIT1->CR = 1 << 2;
2.6.设置加载值和比较值
EPIT1->LR = value;
EPIT1->CMPR = 0;
2.7.使能EPIT1定时器
EPIT1->CR |= 1 << 0;