目录

嵌入式硬件十三基于IMX6ULL的增强型中断周期定时器EPIT操作

《嵌入式硬件(十三):基于IMX6ULL的增强型中断周期定时器(EPIT)操作》

一、增强型中断周期定时器的基本概念

https://i-blog.csdnimg.cn/direct/4093f96cc2d84e9d993474ad2c7aab6d.png

图例说明:

        ipg_clk,上次已经设置为66m;ipg_clk_32k晶体振荡器;ipg_clk_higned,ipg高频;

        梯形,选通门;右边长方形为12位分频器

        左下角为寄存器:计数寄存器,加载寄存器,比较寄存器;计数寄存器和比较寄存器在CMP进行比较,相等发送中断标记置位ITIF(后面需要置位),如果此时中断使能位(ITIE)是打开的,通过与门,会发送中断。

特点:

        32位,减定时器

tips:用EPIT定时器可以消除按键抖动

        硬件消抖:加俩电容,阻交流,通直流

        软件消抖:延时函数消抖

二、定时器原理

1.控制寄存器

https://i-blog.csdnimg.cn/direct/ccdc4ca8932a4e32ae559c68c1ea4ed2.png

https://i-blog.csdnimg.cn/direct/123a9d11d4094f9088fe99ae05d5b7a3.png

https://i-blog.csdnimg.cn/direct/b2a0a5907f1540e6b5e7b0bbd5838460.png

2.状态寄存器

https://i-blog.csdnimg.cn/direct/21ddff56b0de47b9a2cd5d9df1787f4e.png

3.加载寄存器

https://i-blog.csdnimg.cn/direct/ed5a5d94c6ba4243bf69ad42c35ab6d5.png

4.比较寄存器

https://i-blog.csdnimg.cn/direct/12dddf20deee4d5a97a2aa0c5c512c87.png

5.计数寄存器

https://i-blog.csdnimg.cn/direct/61d5030082ac42f8a0a1cf55d5f54cb8.png

三、代码

        结构(没有写的意思是和之前一样)

https://i-blog.csdnimg.cn/direct/eb45b38acef44dbebda5ef8bb0048138.png

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