EPIT

EPIT 是 "Enhanced Periodic Interrupt Timer"(增强型周期中断定时器)的缩写,它是 I.MX6U 系列处理器中一个专门用于产生周期性中断的硬件定时器模块

最主要的作用就是:每隔一个精确的时间,就向CPU触发一次中断

核心特性如下:

  • 32位向下计数器:你可以设定一个初始值,它会从这个值开始递减计数。

  • 可编程的时钟源与12位分频器:它可以选用IPG_CLK等多种时钟源,并支持1~4096范围的分频,方便你得到想要的计数频率。

  • 比较中断功能:这是其工作的核心。当计数器递减到与比较寄存器(EPITx_CMPR)的值相等时,就会触发一次中断。

两种工作模式

  • Set-and-Forget模式:计数器减到0后,会自动从加载寄存器(EPITx_LR)重新装载初始值,并开始下一轮计数,产生的是周期性中断。

  • Free-Running模式:计数器减到0后,会回滚到0xFFFFFFFF继续向下计数,并不会重新加载

ITIF:中断标记位

ITIE: 中断使能位

实现每秒灯翻转一次

void epit_interrupt_handler(void)
{
    if((EPIT1->SR & (1<<0))!=0)
    {
        led_nor();
    }
    EPIT1->SR |= (1<<0);
}

void epit_init(void)
{
    EPIT1->CR=0;
    EPIT1->CR |=(1<<24)|(1<<17)|(65<<4)|(1<<3)|(1<<2)|(1<<1);
    EPIT1->LR = 1000000;
    EPIT1->CMPR=0;

    // 注册EPIT1中断
    system_interrupt_register(EPIT1_IRQn, epit_interrupt_handler);

    // 设置EPIT中断优先级
    GIC_SetPriority(EPIT1_IRQn, 1);

    // 使能EPIT中断
    GIC_EnableIRQ(EPIT1_IRQn);

    // 开启EPIT1定时器
    EPIT1->CR |= (1 << 0);

}

GPT

GPT(General Purpose Timer,通用定时器) 是 i.MX6ULL 等 ARM 处理器中的一个多功能定时器模块,用于实现各种定时、计数、输入捕获和输出比较功能。计数器向上计数

输入捕获(Input Capture) 和 输出比较(Output Compare) 是定时器最核心的两种工作模式,广泛应用于脉冲测量、PWM 生成、电机控制等场景。

sync:同步寄存器

输入捕获
记录外部信号到来的时间(测量脉冲宽度、频率)

输出比较
当计数器达到预设值时,自动改变输出引脚的电平

void gpt_init(void)
{
    GPT1->CR=0;
    GPT1->CR |=(1<<15);//复位GPT
    while((GPT1->CR & (1<<15))!=0);
    GPT1->CR |=(1<<9);// GPT运行在Free-Run模式
    GPT1->CR |=(1<<6);// 时钟源选择为ipg_clk
    GPT1->PR = 65;              // 预分频器选择为66分频
    GPT1->CR |= (1 << 0);       // 使能GPT
}
// 微秒延时函数
void delay_us(unsigned int n)
{
    unsigned int counter=0;
    unsigned int new_counter =0;
    unsigned int old_counter =0;

    old_counter=GPT1->CNT;
    while(1)
    {
        new_counter=GPT1->CNT;
        if(new_counter!=old_counter)
        {
            if(new_counter>old_counter)
            {
                counter +=new_counter-old_counter;
            }
            else
            {
                counter +=0xFFFFFFFF-old_counter+new_counter;
            }
            if(counter>=n)
            {
                return;
            }
            old_counter=new_counter;
        }
    }
}

// 毫秒延时函数
void delay_ms(unsigned int n)
{
    while (n--)
    {
        delay_us(1000);
    }
}

GPT 是功能全面的通用定时器,适合需要输入捕获、PWM 输出等复杂场景;EPIT 是专为周期中断设计的精简定时器,适合只需要定时中断的简单场景。选择哪个取决于你的具体需求——功能用 GPT,简单周期中断用 EPIT。

1. 什么是EPIT,什么是GPT?

  • EPIT (Enhanced Periodic Interrupt Timer):即增强型周期中断定时器。它是一款设计目标非常专一的定时器,核心功能就是产生精确的周期性中断,结构简单,配置方便,适用于像LED精确翻转、按键消抖、操作系统时间片调度这类需要稳定周期信号的场景。

  • GPT (General Purpose Timer):即通用目的定时器。相比EPIT,它的功能要丰富和强大得多,是一个真正的多功能定时器模块。除了基本的定时功能,GPT还具备:

    • 输入捕获:有两个捕获通道,可用于测量外部信号的脉冲宽度或频率。

    • 输出比较:有三个比较通道,可以在特定时刻产生中断或改变引脚输出电平,常用于生成PWM波

2. EPIT和GPT是多少位定时器?向上计数还是向下计数?

特性 EPIT 定时器 GPT 定时器
位数 32位 32位
计数方向 向下计数 (Decrementing) 向上计数 (Incrementing)
设计侧重 专精于周期性中断 功能丰富,通用性强,支持输入捕获/输出比较
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐