11.IMX6ULL裸机开发之EPIT定时器

299 阅读1分钟

一、原理介绍EPIT

16_EPIT.png

1.是一个计数器,他没有其他花里胡哨的功能,仅仅是一个向下计数器。

2.时钟源选择。

3.选择完时钟源以后进行分频,是一个12bit的分频器。

4.分频以后获得计数器。load会向下加载,compare会与counter比较。

5.进入cmp比较器中。要设置CR寄存器的模式,有两种模式,set-and-forget模式是当counter减到0以后会停止重新装载计数器的值;free-running模式是counter减到0以后就不再运行了。

二、寄存器设置

CR寄存器:

其中有一些位是在不同的模式下才会使用的,就不需要管他们。

bit[0] 设置EPIT使能

bit[1] 设置初始化寄存器的值

bit[3] 设置定时器工作模式

bit[15-4] 设置分频值

bit[25] 设置时钟源的选择

SR寄存器是在中断定时器中才用到的状态位。

LR寄存器:load 寄存器。设置寄存器的加载值。

CMPR寄存器:当load与counter相等置位为1。

CNR寄存器:当前寄存器的值。

三、EPIT中断实例

void Epit_Init(unsigned int frac , unsigned int value)
{
    if(frac > 4095)
        frac = 4095;
    /*Setup EPIT_CR Register*/
    EPIT1->CR = 0;
    EPIT1->CR = ( (1 << 1)| (1 << 2) | (1 << 3)|(frac << 4) | (1<<24) );
    EPIT1->LR = value;
    EPIT1->CMPR = 0;
​
    /*Init interrupt*/
    GIC_EnableIRQ(EPIT1_IRQn);
    system_register_irqhandler(EPIT1_IRQn , (system_irq_handler_t)EPIT1_irq_handler ,NULL);
​
    /*Enable EPIT*/
    EPIT1->CR |= (1 << 0);
}
​
/*EPIT1 IRQ*/
void EPIT1_irq_handler(unsigned int gicciar,void *param){
    static unsigned char state = 0 ;
​
    state = !state;
    if(EPIT1->SR & (1 << 0 ) ){
        led_switch(LED_GREEN , state);
    }
​
    /*clear INterrupte*/
    EPIT1->SR |= (1 << 0);
}

\