《嵌入式硬件(十三):基于IMX6ULL的增强型中断周期定时器(EPIT)操作》
一、增强型中断周期定时器的基本概念
图例说明:
ipg_clk,上次已经设置为66m;ipg_clk_32k晶体振荡器;ipg_clk_higned,ipg高频;
梯形,选通门;右边长方形为12位分频器
左下角为寄存器:计数寄存器,加载寄存器,比较寄存器;计数寄存器和比较寄存器在CMP进行比较,相等发送中断标记置位ITIF(后面需要置位),如果此时中断使能位(ITIE)是打开的,通过与门,会发送中断。
特点:
32位,减定时器
tips:用EPIT定时器可以消除按键抖动
硬件消抖:加俩电容,阻交流,通直流
软件消抖:延时函数消抖
二、定时器原理
1.控制寄存器
2.状态寄存器
3.加载寄存器
4.比较寄存器
5.计数寄存器
三、代码
结构(没有写的意思是和之前一样)
1.main.c
#include "beep.h"
#include "led.h"
#include "key.h"
#include "MCIMX6Y2.h"
#include "core_ca7.h"
#include "gpio.h"
#include "interrupt.h"
#include "clock.h"
#include "epit.h"int main(void)
{init_clock();system_interrupt_init();init_led();init_beep();init_epit(); while(1){}return 0;
}
2.epit.c
#include "epit.h"
#include "MCIMX6Y2.h"
#include "core_ca7.h"
#include "interrupt.h"
#include "led.h"void epit1_interrupt_handler(void)//中断服务函数
{if((EPIT1->SR & (1 << 0)) != 0){led_nor();EPIT1->SR |= (1 << 0); //清除标志位}
}void init_epit(void)
{EPIT1->CR = 0;EPIT1->CR |= (1 << 24) | (1 << 17) | (65 << 4) | (1 << 3) | (1 << 2) | (1 << 1);//设置寄存器的值EPIT1->LR = 1000000;//设置为1msEPIT1->CMPR = 0;system_interrupt_register(EPIT1_IRQn, epit1_interrupt_handler);//注册中断GIC_EnableIRQ(EPIT1_IRQn);//GIC使能EPIT1->CR |= (1 << 0);//EPIT使能
}
3.epit.h
#ifndef _CLOCK_H_
#define _CLOCK_H_extern void init_clock(void);#endif