S32K146-LPUART+DMA方案实现
介绍:
本章主要记录了我在使用 NXP S32K146 芯片进行开发过程中,所遇到的串口(LPUART)数据接收问题,以及在分析问题、尝试多种方法后,最终通过更换方案解决问题的过程与总结。
在实际应用中,串口通信常常承担着高速、连续数据传输的任务。然而,当我在项目中需要频繁接收固定长度的数据包时,原有的基于中断的接收方式暴露出诸如 CPU 占用率过高、系统资源紧张、数据接收不稳定甚至丢包等问题。这些问题不仅影响了系统的实时性,也降低了整体稳定性。
为了解决这一瓶颈,我深入研究了 LPUART 与 DMA 联合使用的机制。通过采用 DMA 进行数据搬运,CPU 从逐字节处理中解放出来,只需在数据块搬运完成后通过一次中断进行处理,从而显著降低了系统负载,提高了数据接收的稳定性与效率。
本章将结合具体问题和解决方案,对比中断方式与 DMA 方式的差异,总结 DMA 在串口通信中的优势与注意事项,并分享实践中的经验与体会。希望这些内容能为今后在类似场景中使用 DMA 提供参考和借鉴。
目录
一丶背景介绍
二、LPUART中断方案的分析
三、LPUART+DMA的简介
四、LPUART+DMA的优势
五、具体流程
六、具体代码分析
七、总结
一丶背景介绍
起初在频繁接收固定 34 字节数据时,曾出现过接收中断停止的情况。调试发现 LPUART 的 CTRL 寄存器状态(RE / RIE)被关闭。我最初的处理方法是检测到寄存器被关闭后,通过重新使能和初始化来恢复串口接收,但这种做法并不是长久之计,也不被允许。
二、LPUART中断方案的分析
在 1,115,200 bps 的速率下,接收 34 个字节大约需要 3 ms。然而,由于工程中还包含其他任务和事件处理,整体运行难以满足需求。若每接收 1 个字节就触发一次中断,不仅会导致 CPU 占用率过高,还会在串口接收速率下降时增加丢包风险,从而进一步消耗有限的系统资源,降低整体稳定性。
三、LPUART+DMA的简介
3.1、LPUART:
-
是 NXP S32K146 等 MCU 内置的低功耗 UART 外设。
-
具备常规 UA