嵌入式硬件十三基于IMX6ULL的增强型中断周期定时器EPIT操作
目录
《嵌入式硬件(十三):基于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;//设置为1ms
EPIT1->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