硬件(十一):EPIT、GPT、UART 外设配置
一、EPIT(增强型周期性中断定时器)
1. 核心概念
EPIT(Enhanced Periodic Interrupt Timer)是嵌入式处理器(如i.MX6ULL)内部的增强型周期性中断定时器,用于产生周期性中断、实现精准延时或对外部事件计数,可释放 CPU 资源,提升系统效率。
2. 工作模式
- set-and-forget 模式:计数器从加载寄存器(
EPITx_LR
)获取初始值,计数到 0 后,重新从加载寄存器加载数据到计数器,周而复始。 - free-running 模式:计数器计数到 0 后,重新从
0xFFFFFFFF
开始计数,而非从加载寄存器获取数据。
3. 关键寄存器
EPITx_CR
:控制寄存器,用于设置时钟源、分频值、工作模式、使能中断等。EPITx_SR
:状态寄存器,用于标志中断是否产生,需软件清除中断标志。EPITx_LR
:加载寄存器,存储计数器的初始 “加载值”,决定定时时间。EPITx_CMPR
:比较寄存器,当计数器值与该寄存器值匹配时,可触发中断(部分场景使用)。EPITx_CNR
:当前计数寄存器,可读取当前计数器的实时值,用于调试或动态调整定时。
4. 配置代码与分析
void epit1_interrupt_handler(void)
{if((EPIT1->SR & (1 << 0)) != 0){led_on_off();EPIT1->SR |= (1 << 0);}
}void init_epit1(void)
{EPIT1->CR = 0;// 配置时钟源、分频、工作模式、使能比较中断等EPIT1->CR |= (1 << 24) | (1 << 17) | (65 << 4) | (1 << 3) | (1 << 2) | (1 << 1);EPIT1->LR = 1000000; // 设置加载值,决定定时周期EPIT1->CMPR = 0; // 计数到 0 触发中断system_interrupt_register(EPIT1_IRQn, epit1_interrupt_handler);GIC_EnableIRQ(EPIT1_IRQn);EPIT1->CR |= (1 << 0); // 使能 EPIT1 定时器
}
- 工作逻辑:配置为
set-and-forget
模式,EPIT1->LR = 1000000
为初始加载值,计数到 0 时触发中断,在中断处理函数中实现led_on_off
(LED 翻转),若定时 1 秒,可实现 LED 1 秒闪一次。
二、GPT(通用定时器)
1. 核心功能
GPT(General Purpose Timer)是通用定时器,可用于产生定时中断、实现延时功能,也能进行输入捕获(测量外部脉冲)和比较输出(控制引脚电平)等操作。
2. 关键特性
- 支持输入捕获:以
GPT_CAPTURE1
为例,可设置为上升沿捕获,当引脚出现上升沿时,GPT 会将当前计数值保存到Timer Input Reg1
寄存器中。 - 支持比较输出:在
Timer Output Reg1
中设置一个数值,当计数值到达该值时,会按照设置改变GPT_COMPARE1
引脚的电平。
3. 配置代码与分析
void init_gpt1(void)
{GPT1->CR = 0;GPT1->CR |= (1 << 15); // 软件复位while((GPT1->CR & (1 << 15)) != 0);GPT1->CR |= (1 << 9) | (1 << 6); // 配置工作模式等GPT1->PR = 65; // 设置分频值GPT1->CR |= (1 << 0); // 使能 GPT1 定时器
}void delayus(unsigned int n)
{unsigned int counter = 0;unsigned int old_counter, new_counter;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 delayms(unsigned int n)
{while(n--){delayus(1000);}
}
- 工作逻辑:
init_gpt1
初始化 GPT1 定时器,配置分频等参数;delayus
和delayms
函数利用 GPT1 的计数器实现微秒级和毫秒级延时,可用于各种需要精准延时的场景,也能配合其他逻辑实现如 LED 定时闪烁等功能(若基于延时函数控制 LED 翻转,可实现 1 秒闪一次)。
三、UART(通用异步收发传输器)
1. 核心概念
UART(Universal Asynchronous Receiver/Transmitter)是通用异步收发传输器,用于设备间的串行异步通信,广泛应用于串口调试、数据传输等场景。
2. DTE 与 DCE 区别
- DTE(Data Terminal Equipment,数据终端设备):指用户端的设备,如计算机、单片机等,是数据的发起者或最终接收者。
- DCE(Data Circuit-terminating Equipment,数据电路终接设备):指通信线路端的设备,如调制解调器(Modem)、串口转 USB 模块等,用于将 DTE 发出的信号转换为适合通信线路传输的形式,或进行反向转换。
3. 配置代码与分析
void init_uart1(void)
{// 配置 UART1 收发引脚的复用功能IOMUXC_SetPinMux(IOMUXC_UART1_TX_DATA_UART1_TX, 0);IOMUXC_SetPinMux(IOMUXC_UART1_RX_DATA_UART1_RX, 0);// 配置 UART1 收发引脚的电气属性IOMUXC_SetPinConfig(IOMUXC_UART1_TX_DATA_UART1_TX, 0x10B0);IOMUXC_SetPinConfig(IOMUXC_UART1_RX_DATA_UART1_RX, 0x10B0);UART1->UCR1 = 0;UART1->UCR2 = 0;// 配置 UCR2:使能 Tx/Rx、8 位数据位、无校验等UART1->UCR2 |= (1 << 14) | (1 << 5) | (1 << 2) | (1 << 1);UART1->UCR3 |= (1 << 2); // 忽略 RTS 引脚UART1->UFCR = (5 << 7); // 设置分频UART1->UBIR = 999; // 波特率设置UART1->UBMR = 43402; // 波特率设置UART1->UCR1 |= (1 << 0); // 使能 UART1
}void putc(unsigned char ch)
{// 等待发送缓冲区为空while((UART1->USR2 & (1 << 3)) == 0);UART1->UTXD = ch; // 发送字符
}
- 工作逻辑:
init_uart1
初始化 UART1,配置引脚复用、电气属性、波特率等参数;putc
函数实现字符的发送,在主函数中循环调用putc('A')
并延时 1 秒,可实现每秒向串口发送一个字符'A'
。
四、EPIT 与 GPT 区别
特性 | EPIT | GPT |
---|---|---|
核心定位 | 专注周期性中断,释放 CPU 资源 | 通用定时器,功能更丰富(输入捕获、比较输出等) |
工作模式 | set-and-forget 、free-running | 多种工作模式,支持输入捕获、比较输出等场景 |
典型应用 | 周期性任务调度、精准延时 | 延时、输入捕获(脉冲测量)、比较输出(引脚控制) |
精度侧重 | 高精度周期性中断 | 精度满足一般定时、捕获、输出需求 |
两者都能实现如 LED 1 秒闪一次的功能,EPIT 更专注于周期性中断场景,GPT 则是通用型定时器,适用范围更广。