1.简介
EPIT(Enhanced Periodic Interrupt Timer)
EPIT block diagram
大胆猜测:
ITIF(Interval Timer Interrupt Flag)
ITIE(Interval Timer Interrupt Enable)
2.寄存器
不配图了,从文档上搜索。
Control register (EPIT1_CR)
Status register (EPIT1_SR)
Load register (EPIT1_LR)
Compare register (EPIT1_CMPR)
Counter register (EPIT1_CNR)
3.流程
## 1.配置整体控制 EPIT1_CR
### 1.1.设置时钟源
### 1.2.设置分频
### 1.3.设置模式 set-and-forget
### 1.4.设置 EPIT1_CNR 的 初始值 为 EPIT1_LR 的值
### 1.5.使能 ITIE 为 1
## 2.设置计数器默认值 EPIT1_LR
## 3.设置 EPIT1_CMPR 为 0
## 4. GIC 使能中断
## 5. 注册中断函数
## 6. 使能 EPIT1 EPIT1_CR
void epit1_init(unsigned int frac, unsigned int value) {
if (frac > 0XFFF) {
frac = 0XFFF;
}
// ## 1.配置整体控制 EPIT1_CR
EPIT1->CR = 0;
// 1.1.设置时钟源
EPIT1->CR |= 1 << 24;
// 1.2.设置分频
EPIT1->CR |= frac << 4;
// 1.3.设置模式 set-and-forget
EPIT1->CR |= 1 << 1;
// 1.4.设置 EPIT1_CNR 的 初始值 为 EPIT1_LR 的值
EPIT1->CR |= 1 << 3;
// 1.5.使能 ITIE 为 1
EPIT1->CR |= 1 << 2;
// 2.设置计数器默认值 EPIT1_LR
EPIT1->LR = value;
// 3.设置 EPIT1_CMPR 为 0
EPIT1->CMPR = 0;
// 4. GIC 使能中断
GIC_EnableIRQ(EPIT1_IRQn);
// 5. 注册中断函数
system_register_irqhandler(EPIT1_IRQn, (system_irq_handler_t)epit1_irqhandler, NULL);
// 6. 使能EPIT1 EPIT1_CR
EPIT1->CR |= 1 << 0;
}
void epit1_irqhandler(void) {
static unsigned char state = 0;
state = !state;
// 读取
if (EPIT1->SR & (1 << 0)) {
led_switch(state);
}
EPIT1->SR |= 1 << 0;
}
4.中断函数流程
1.读取 ITIF(EPIT1_SR),判断是否为 1
2.清除 EPIT1_SR
void epit1_irqhandler(void) {
static unsigned char state = 0;
state = !state;
// 1.读取 ITIF(EPIT1_SR),判断是否为 1
if (EPIT1->SR & (1 << 0)) {
led_switch(state);
}
// 2.清除 EPIT1_SR
EPIT1->SR |= 1 << 0;
}
结束
// main.c
int main(void) {
int_init();
imx6u_clkinit();
clk_enable();
led_init();
beep_init();
exit_init();
epit1_init(0, 66000000); // 1s
while (1) {
delay(500);
}
}
// Makefile
#...
showdev:
ls /dev/sd*
down:
chmod 777 imxdownload
@echo "./imxdownload $(TARGET).bin /dev/sd"
#...
# shell cmd
make clean
make
make showdev
make down
./imxdownload main.bin /dev/sdb