本节主要介绍EPIT定时器,主要介绍CR,SR,CNR,CMPR的寄存器。
一、EPIT定时器
EPIT定时器(Enhanced Periodic Interrupt Timer)是增强型周期中断定时器,只有周期性定时的功能。EPIT 定时器有两种工作模式: set-and-forget 和 free-running。
set-and-forget 模式:EPITx_CR(RLD )=1,计数器加载EPITx_LR中的值,计数到0再次加载EPITx_LR中的值。
free-running 模式:EPITx_CR(RLD )=0,当计数器计数到0以后会重新从0XFFFFFFFF开始计数。
比较重要的寄存器有:寄存器 EPITx_LR、 EPITx_CMPR 和 EPITx_CNR 分别为加载寄存器、比较寄存器和计数寄存器
我们选择set-and-forget 模式。
1.我们选择ipg_clk时钟,所以EPITx_CR[25:24]=01;
2.设置分频,我们选择不分频EPITx_CR[15:4]=0;
3.设置set-and-forget 模式,EPITx_CR[3]=1;
4.打开比较中断使能,EPITx_CR[2]=1;
5.EPIT使能位,EPITx_CR[1]=1;EPITx_CR[0]=1;
6.中断标志位, EPITx_SR[0],读到1时即发生中断,写入1清除中断。
7.设置PIT1_LR 中的加载值和寄存器 EPIT1_CMPR 中的比较值。
二、定时器实验
定时器实验,使用EPIT产生定时中断,在中断函数中点亮LED,实现周期性的led灯的闪烁。
#include "bsp_epit_timer.h"
/*EPIT时钟初始化*/
void epit_init(unsigned int frac,int value){
if(frac > 0XFFF){
frac = 0XFFF;
}
EPIT1->CR = 0; //清零
/*配置CR寄存器的值,按照上面的配置*/
EPIT1->CR |= (1<<24) | (frac << 4) | (1 << 3) | (1 << 2) | (1 << 1);
EPIT1->LR = value; //设置加载寄存器的值
EPIT1->CMPR = 0; //设置比较寄存器的值
GIC_EnableIRQ(EPIT1_IRQn); //初始化GIC对应的中断
/*中断处理函数注册*/
system_register_irq_handler(EPIT1_IRQn, epit1_irq_handler, NULL);
EPIT1->CR |= (1 << 0); //打开定时器
}
/*中断处理函数*/
void epit1_irq_handler(unsigned int gicciar, void *param){
static unsigned char status = 0;
if (EPIT1->SR & 0x1)
{ status = !status;
led_switch(LED0,status); //点亮led
EPIT1->SR = 0x1; //复位中断标志位
}
}
这一节比较简单,只需要配置EPIT的几个寄存器的设置,然后一个比较中断处理函数的编写。