1. 为什么需要LPUART DMA空闲中断方案
在实际的嵌入式开发中,串口通信是最基础也是最常用的功能之一。特别是在处理大量数据时,传统的单字节中断接收方式会显得力不从心。每次接收一个字节就进一次中断,不仅占用大量CPU资源,还可能导致数据丢失或响应延迟。我在做智能车项目时就深有体会——当传感器数据以115200的波特率持续发送时,系统几乎被串口中断淹没了。
这时候DMA(直接内存访问)就派上用场了。DMA可以在不需要CPU干预的情况下,自动将外设数据搬运到内存中。配合空闲中断(Idle Interrupt)机制,我们就能实现高效的不定长数据接收。所谓空闲中断,就是在串口线路上检测到一定时间的空闲状态时触发的中断,这个特性非常适合用来判断一帧数据的结束。
NXP i.MX RT1064的LPUART模块原生支持DMA和空闲中断功能,但说实话,刚开始用的时候确实有点懵。官方文档都是英文的,中文资料又少,我花了整整六个小时才把整个流程跑通。不过一旦理解了原理,你会发现这个方案确实很香。
2. 硬件配置与初始化细节
2.1 GPIO和LPUART基础配置
首先要搞定硬件层面的配置。i.MX RT1064的引脚复用功能比较灵活,需要正确设置IOMUXC控制器。以下是我的实际配置代码:
void LPUART_GPIO_Init(GPIO_Type *base_tx, uint32_t pin_tx,
GPIO_Type *base_rx, uint32_t pin_rx,
uint32_t muxRegister, uint32_t muxMode,
uint32_t inputRegister, uint32_t inputDaisy,
uint32_t configRegister)
{
gpio_pin_config_t config = {0};
// 配置RX引脚为输入模式
config.direction = kGPIO_DigitalInput;
config.interruptMode = kGPIO_NoIntmode;
GPIO_PinInit(base_rx, pin_rx, &config);
// 配置TX引脚为输出模式
config.direction = kGPIO_DigitalOutput;
config.outputLogic = 1;
GPIO_PinInit(base_tx, pin_tx, &config);
// 设置引脚复用功能
IOMUXC_SetPinMux(muxRegister, muxMode, inputRegister,
inputDaisy, configRegister, 0U);
// 设置引脚电气特性
IOMUXC_SetPinConfig(muxRegister, muxMode, inputRegister,
inputDaisy, configRegister,
UART_RX_PAD_CONFIG_DATA);
}
这里要特别注意引脚的电平配置。我一开始没注意驱动强度设置,在长距离传输时出现了数据错误。后来把驱动强度调到R0/6,问题就解决了。
2.2 LPUART模块参数设置
串口本身的配置相对直接,但有几个关键参数需要特别注意:


2230

被折叠的 条评论
为什么被折叠?



