一、原理介绍EPIT
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);
}