NSSine™ MCU 串口性能优化实战:如何用 DMA 提升数据吞吐效率

来源:纳芯微电子 #纳芯微# #DMA#
732

文章导读

在嵌入式系统设计中,串口通信被广泛应用。传统轮询方式需要 CPU 持续参与数据收发,在多接口并发或控制任务负载较高时,可能造成CPU 占用较高、硬件 FIFO 溢出、数据丢失或系统响应延迟等问题。

针对上述资源占用与数据吞吐问题,本文以纳芯微NSSine™系列实时控制MCU/DSP芯片NS800RT1137 为载体,重点解析:

  • 核心方案:基于DMA自动触发数据搬运,减少CPU对串口数据搬运的参与;

  • 性能提升:在不提升波特率的前提下,提高数据吞吐效率,降低系统延迟与CPU资源占用;

  • 应用价值:为串口吞吐受限、CPU资源紧张及大数据量传输场景提供可落地的解决方案。

硬件信号驱动DMA搬运

事件触发与自动搬移机制剖析

本方案的核心在于利用芯片内的DMA(负责数据搬运)和DMAMUX(负责信号路由)模块,与UART模块协同工作,实现“信号触发-自动搬运”的闭环。

整个系统的数据流可以清晰地概括为:

1. 事件触发:UART接收到数据,当其FIFO达到预设水位时会产生接收满信号,线路变为空闲时会产生空闲信号;

2. 信号路由:DMAMUX模块负责将UART的硬件事件信号路由至指定的DMA通道,作为DMA传输的硬件触发信号;

3. 自由搬运:DMA通道被触发后,无需CPU干预,自动将数据从UART数据寄存器搬运到指定的内存缓冲区(对于发送功能则反之);

4. 状态管理:软件通过查询DMA传输状态(如已传输字节数)或结合串口空闲状态标志位,来感知数据接收完成,从而在应用层进行处理。

在UART与内存之间,DMA模块承担了数据搬运的工作:数据到达后由DMA直接完成传输,整个过程无需 CPU干预,从而大幅提升数据吞吐效率。

实战详解

如何配置关键模块(以接收为例)

第一步:配置UART,使其产生接收空闲信号(通知应用已完成接收)与接收满信号(触发DMA自动搬运)。

接收空闲信号(IDLE):用于判断一帧不定长数据的结束。通过配置ILT(空闲位检测起始点)和IDLECFG(空闲字符数长度)等寄存器,当总线上连续出现特定数量的空闲为后,UART便会置位IDLE标志。

接收满信号(RDRF):当接收FIFO中的数据量超过预设的水位(RXWATER)时,会产生此信号。通过使能UART_BAUD寄存器中的RDMAE位,将此信号转换为DMA请求。

DMAMUX 模块负责实现信号源与DMA通道的映射:将特定外设的硬件事件信号(如UART接收请求)路由至指定的DMA通道。通过配置相应寄存器(CHCONFIG)完成绑定与使能后,即可建立事件与通道的对应关系。

核心引擎

DMA通道的精细配置

本方案最核心的部分:配置DMA,需要理解其传输机制(次循环、主循环)。关键配置项包括:

源/目的地址:数据传输的源地址与目标地址;

传输数据宽度:单次传输的数据宽度(如8位);

地址偏移:单次传输及主循环完成后,源地址与目标地址的增减方式;

次循环字节数:单次触发后连续传输的字节数;

主循环次数:完成整个DMA传输(如填满缓冲区)所需的触发次数。

实际应用中:在主循环完成后,通过配置TCDn_DLASTSGA(目标地址最后调整值)为负的缓冲区长度,可使DMA的目标地址自动复位到缓冲区起始处,实现环形缓冲,为连续接收数据打下基础。

应用层技巧

巧妙管理不定长数据

启用DMA后,无法通过直接读取UART寄存器来获取数据深度。应用层需要通过计算DMA控制结构体(TCD)中的初始主循环计数(BITER)当前主循环计数(CITER)的差值,来实时获取已接收到的字节数。

需要注意的是,此方法仅在每次次循环搬运1字节(NBYTES=1)时成立,即“已接收字节数 = BITER − CITER”;若 NBYTES>1,则需乘以单次次循环字节数(已接收字节数 = (BITER − CITER) × NBYTES)。

软件在接收过程中通过实时查询DMA传输计数,不断从DMA目标缓冲区“分段式”迁移数据到应用层的环形缓冲区,而DMA通道则与UART的接收FIFO自动同步,在硬件层面完成数据的连续、无感搬运。

具体流程如下:

1. DMA自动搬运:DMA通道被UART接收FIFO满硬件信号自动触发,将数据从UART数据寄存器实时、分段地搬运到一块专用于DMA的中间内存缓冲区;

2. 实时分段迁移:应用层软件(在主循环或低优先级任务中)不断查询DMA的已传输字节数,并据此计算出自上次查询后新到达的字节数量,进而将这部分新到达的数据,从DMA的中间缓冲区复制到应用层的软件环形缓冲区中。这个过程是持续、分段进行的,而非等到一帧结束;

3. 空闲标志用于帧同步与DMA重置:当串口空闲状态(IDLE)发生时,这标志着一帧完整数据的传输“间隙”或结束。此时软件会完成最后一小段数据的迁移,并对DMA通道进行重置;

4. 应用层处理:应用层代码可从软件环形缓冲区中,按自身节奏和协议解析完整的数据帧,不受底层数据接收过程的阻塞。

这种“DMA自动搬运 + 实时分段迁移 + 空闲时同步重置”的模式,正是实现高带宽、低延迟处理异步不定长串口通信的核心机制。它确保了数据从物理层到应用层持续高效流转,避免了在数据接收期间CPU的轮询等待,也防止了因数据延迟导致的数据覆盖或丢失。

方案优势

核心优势

  • 高带宽:DMA的硬件自动搬运机制,无需CPU频繁查询等待,最大化串口物理带宽的利用率;

  • 低损耗:CPU仅在数据帧接收完成或需要发送时接入,资源占用极低,可更专注于关键控制任务;

  • 高可靠性:从根本上避免了因CPU繁忙、多个串口同时收发导致的硬件FIFO溢出问题;

  • 高吞吐:软件FIFO的增加大大解决了硬件FIFO的深度限制,用户不再担心硬件溢出问题。

了解更多

访问NSSine™系列实时控制 MCU/DSP专区

本文介绍的DMA方案可将串口通信从CPU轮询方式转变为硬件自动搬运方式,有效提升系统的数据吞吐能力,降低CPU资源占用,并提高多串口场景下的数据传输可靠性。

责编: 爱集微
来源:纳芯微电子 #纳芯微# #DMA#
THE END
关闭
加载

PDF 加载中...