当前位置: 首页 > news >正文

深入解析PXD10 DMA引擎:从AHB总线到TCD编程与性能调优

1. 项目概述与核心价值

在嵌入式系统开发中,尤其是涉及高速数据流处理的应用,如音频编解码、图像传感器数据采集或网络通信,CPU如果被频繁的数据搬运任务所拖累,整个系统的实时性和效率将大打折扣。这时,直接内存访问(DMA)技术就成为了系统架构师的“王牌”。它的核心思想非常直观:让一个专门的、高效的“搬运工”(DMA控制器)来负责在内存与外设之间搬移数据,而让CPU这个“总指挥”腾出手来处理更复杂的计算和逻辑任务。简单来说,CPU只需要告诉DMA控制器“从A地址搬多少数据到B地址”,然后就可以去忙别的了,搬完了DMA会发个通知。这种“解放CPU”的能力,是提升系统整体性能的关键。

然而,理解DMA的概念是一回事,要真正用好它,尤其是在复杂的SoC(片上系统)中,又是另一回事。不同的DMA控制器在架构、编程模型和性能特性上差异巨大。本文将以飞思卡尔(现恩智浦)PXD10微控制器中的DMA引擎为具体案例,进行深度拆解。这个引擎的设计非常经典,它基于AMBA-AHB总线,并采用了高度灵活的传输控制描述符(TCD)编程模型。我们将不仅仅停留在手册的翻译层面,而是结合我多年在嵌入式底层驱动开发中的实际踩坑经验,从硬件架构、数据流、编程细节到性能调优,为你呈现一个立体、可操作的DMA应用全景图。无论你是正在评估芯片选型,还是正在为性能瓶颈绞尽脑汁,相信这篇深入解析都能给你带来直接的启发。

2. 架构深度解析:从总线到引擎

要驾驭一个DMA控制器,绝不能把它当作一个黑盒。你必须理解它的内部架构是如何与系统总线协同工作的,这决定了它的能力边界和性能上限。PXD10的DMA设计是一个理解现代嵌入式DMA控制器的绝佳范本。

2.1 AMBA-AHB总线:DMA的高速公路

首先,DMA控制器不是孤立存在的,它需要通过系统总线与内存、外设进行通信。PXD10采用了ARM的AMBA-AHB(Advanced High-performance Bus)总线。你可以把AHB想象成一条设计精良的高速公路,它有几个关键特征决定了DMA的性能:

  1. 流水线操作:AHB总线采用地址相位和数据相位分离的流水线设计。这意味着DMA控制器可以在当前数据传输(数据相位)尚未完成时,就发出下一个传输的地址(地址相位),从而隐藏部分访问延迟,提升总线利用率。PXD10的DMA引擎内部明确分为addr_path(地址路径)和data_path(数据路径)两个模块,正是为了完美匹配AHB的这种两阶段流水线。
  2. 突发传输支持:AHB支持突发(Burst)传输,允许在一次事务中连续传输多个数据。虽然从手册描述看,此DMA引擎的每次传输似乎基于TCD中定义的ssizedsize进行单次访问的串联,但其流水线设计本质上也是为了实现类似突发的高效连续访问。
  3. 总线主设备:DMA控制器在总线上作为主设备(Master)出现。这意味着它拥有总线的控制权,可以主动发起读写操作,这正是“直接”内存访问的硬件基础。

注意:理解总线协议是优化DMA性能的前提。例如,如果目标内存设备(如片外SDRAM)插入的等待周期(Wait-State)很多,那么即使DMA控制器本身再快,实际传输速率也会被拖慢。手册中的性能表格(后文会详细分析)正是基于不同的总线访问延迟假设计算得出的。

2.2 DMA引擎内部模块分工

根据手册中的框图描述,PXD10的DMA引擎主要由以下几个核心模块构成,理解它们的分工对调试至关重要:

  • addr_path(地址路径模块):这是流水线的第一阶段,负责地址相位。它的核心工作是生成并驱动AHB总线上的地址信号(haddr[31:0])。在传输开始时,它负责根据仲裁结果计算TCD内存的地址,读取描述符。在传输过程中,它根据TCD中的SADDRDADDRSOFFDOFF等字段,实时计算下一个待读取的源地址和待写入的目的地址。
  • data_path(数据路径模块):这是流水线的第二阶段,负责数据相位。它连接AHB总线的读写数据线(hrdata,hwdata)。在源读操作时,它从总线接收数据并暂存;在目的写操作时,它将暂存的数据驱动到总线上。当源和目的数据宽度不一致时(例如源为16位,目的为32位),data_path模块还负责进行必要的数据打包或拆解,手册中提到的“两次读操作,然后一次32位写”就是在此模块控制下完成的。
  • pmodel_charb(编程模型与通道仲裁模块):这是DMA的“大脑”之一。它实现了DMA的编程模型寄存器,CPU通过IPS总线(一种外设总线)来配置这些寄存器。更重要的是,它包含了通道仲裁逻辑。所有通道的硬件请求信号(ipd_req[n])和软件请求(通过TCD的START位)都汇聚到这里,根据配置的仲裁算法(固定优先级或轮询)决定下一个服务哪个通道。
  • control(控制模块):这是DMA的“心脏”和“调度中心”。它协调addr_pathdata_path的操作序列,控制一次“读-写”对的执行,管理次循环(Minor Loop)计数,并在次循环或主循环(Major Loop)结束时,触发TCD的更新、中断以及可选的通道链接(Channel Linking)或散聚(Scatter/Gather)操作。
  • TCD本地内存与控制器:这是一个双端口存储器,一端供DMA引擎快速读取描述符,另一端供CPU通过IPS总线进行配置。控制器负责仲裁这两者的访问,并明确赋予了DMA引擎更高的优先级(CPU访问会被阻塞)。这种设计确保了DMA响应的低延迟。

2.3 核心数据流全景

手册中的图15-28至15-30清晰地描绘了一次DMA传输的完整生命周期,我们可以将其提炼为三个核心阶段:

第一阶段:通道服务请求与仲裁(图15-28)

  1. 请求触发:外设通过拉高ipd_req[n]信号,或CPU写TCDn.START位,发起通道n的服务请求。
  2. 请求同步ipd_req信号在DMA内部被寄存一拍,以同步时钟域。
  3. 通道仲裁pmodel_charb模块根据当前配置的算法(固定优先级/轮询)在所有请求的通道中选择一个获胜者。
  4. 描述符获取:获胜通道的编号被送入addr_path,转换为TCD内存的地址。TCD内存宽度为64位,整个128位(32字节)的描述符可以在4个周期内读入DMA引擎的内部寄存器文件(channel_x,channel_y寄存器)。这是DMA启动的关键延迟所在。

第二阶段:数据传输执行(图15-29)

  1. 读-写循环control模块控制addr_pathdata_path,按照TCD中定义的SSIZEDSIZE,发起一系列的源地址读取和目的地址写入操作。
  2. 数据暂存:从源地址读出的数据,先暂存在data_path模块中。
  3. 次循环控制:上述“读-写”对不断重复,直到搬移的字节数达到TCD.NBYTES(次循环字节数)的规定。完成一次NBYTES的传输,称为完成一次“次循环”(或一次主循环迭代)。
  4. 完成信号:次循环完成时,dma_ipd_done[n]信号被置起,通知请求外设本次服务完成(对于外设请求模式)。

第三阶段:传输后处理与更新(图15-30)

  1. TCD更新addr_path逻辑更新通道TCD中的关键字段:源地址(SADDR)、目的地址(DADDR)和当前迭代计数(CITER)。SADDRDADDR会根据SOFFDOFF自动偏移,CITER会减1。
  2. 主循环结束��断:检查CITER是否已减至0。如果未减至0,说明主循环未完成,通道变为空闲,等待下一次请求(对于多次请求的传输)。如果CITER为0,则进入主循环结束处理。
  3. 主循环结束处理
    • 地址恢复:将SLASTDLAST_SGA的值加到SADDRDADDR上,通常用于将地址指针恢复到此轮传输开始前的值,或者为下一轮散聚传输做准备。
    • 迭代器重载:将起始迭代计数(BITER)重新加载到CITER中,为下一次可能的传输做准备。
    • 中断产生:如果使能了主循环完成中断(INT_MAJ),则产生中断。
    • 通道链接/散聚:如果使能了相应功能,则根据CITER.E_LINKMAJOR.E_LINK的配置,自动设置链接通道的START位,或者从DLAST_SGA指向的地址加载一个新的TCD。

实操心得:很多初学者在调试DMA时,只关注传输是否启动,却忽略了传输后TCD状态的更新。务必在每次传输完成后(特别是使用轮询方式时),检查CITERSADDRDADDR的值是否符合预期。这能帮你快速定位是地址偏移计算错误,还是循环次数设置有问题。例如,如果你希望连续传输,SLAST/DLAST_SGA应设置为0;如果你希望每次传输后地址回到起点,SLAST/DLAST_SGA应设置为-(NBYTES * (SSIZE/DSIZE对应的增量))

3. TCD编程模型:从配置到实践

传输控制描述符(TCD)是DMA控制器的灵魂。它是一组定义了单次DMA传输所有行为的寄存器集合。PXD10的每个通道都有一个独立的32字节TCD。理解每一个字段的含义,是进行高效、正确DMA编程的基础。

3.1 TCD字段详解与配置逻辑

下面这个表格整理了TCD的核心字段,并附上了配置逻辑和常见误区:

字段名位宽功能描述配置要点与常见坑点
SADDR32源起始地址。传输开始时源数据的起始内存或外设地址。必须对齐到SSIZE定义的数据宽度。例如SSIZE=2(32位)时,地址必须是4字节对齐。非对齐访问可能引发总线错误或性能下降。
SOFF16源地址偏移。每次次循环传输完成后,源地址增加的字节数。通常设置为源数据宽度对应的字节数(如8位宽设为1,16位宽设为2)。支持负数,用于处理环形缓冲区。
ATTR16传输属性。包含SSIZE(源数据宽度)和DSIZE(目的数据宽度)。SSIZEDSIZE可独立配置。当两者不等时,DMA会自动处理数据打包/解包(如2次16位读+1次32位写)。宽度编码:0=8位,1=16位,2=32位。
SLAST32主循环结束后的源地址调整值。当主循环(CITER减为0)完成后,该值会加到SADDR上。常用于将地址指针复位到缓冲区开头。例如,传输了N字节后,想将SADDR恢复初始值,则SLAST = - (NBYTES / SSIZE_BYTES) * SOFF
DADDR32目的起始地址。传输开始时目的地的起始地址。同样需要根据DSIZE对齐。
DOFF16目的地址偏移。每次次循环传输完成后,目的地址增加的字节数。配置逻辑同SOFF
CITER / BITER15+1当前/起始次循环迭代计数BITER是初始值,CITER是运行时递减的计数器。CITER.E_LINK位使能次循环链接。NBYTES*CITER= 主循环总传输字节数。CITERBITER必须相等。E_LINK位用于在每次次循环(即每次外设请求)后触发通道链接,非常适用于外设的连续数据流处理。
DLAST_SGA32主循环结束后的目的地址调整值,或散聚地址。功能同SLAST,但当使能散聚传输时,此字段被解释为下一个TCD描述符的地址指针。这是实现复杂数据传输(如分散-聚集)的关键。普通模式下配置同SLAST。散聚模式下,它指向内存中下一个TCD结构体的地址。
CSR16通道状态与控制寄存器。包含STARTINT_MAJINT_HALFD_REQE_LINKACTIVEDONE等关键控制位。START位软件置1发起请求,传输开始后硬件清0。INT_MAJ主循环完成中断使能。D_REQ禁止硬件请求。MAJOR.E_LINK使能主循环链接。务必最后写CSR(即TCD的Word 7),因为写START位会立即触发通道仲裁。
NBYTES32次循环字节数。每次通道被服务(一次请求)所传输的总字节数。这是配置的核心。总传输量 =NBYTES*CITER。对于外设请求模式,NBYTES通常设置为外设一次请求期望的数据量(如ADC转换完成一个样本的数据大小)。

3.2 典型传输场景配置实例

让我们通过手册中的两个例子,并加以扩展,来具体感受TCD的配置艺术。

场景一:单次软件触发传输(内存到内存)目标:将16字节数据从源地址0x1000(字节访问)搬移到目的地址0x2000(字访问,32位)。

// 假设使用C语言进行寄存器配置 TCD->SADDR = 0x1000; TCD->SOFF = 1; // 源为字节,每次+1 TCD->ATTR = (0 << 8) | (2 << 0); // SSIZE=0(8位), DSIZE=2(32位) TCD->NBYTES = 16; // 总共传输16字节 TCD->SLAST = -16; // 主循环后,SADDR恢复初始值 (16字节 / 1字节增量 * 1) TCD->DADDR = 0x2000; TCD->DOFF = 4; // 目的为字,每次+4 TCD->DLAST_SGA = -16; // 主循环后,DADDR恢复初始值 (16字节 / 4字节增量 * 4) TCD->CITER = 1; // 只执行1次主循环 TCD->BITER = 1; TCD->CSR = (1 << 7); // 使能主循环完成中断(INT_MAJ),其他位默认0 // 最后,启动传输 TCD->CSR |= (1 << 0); // 设置START位

执行流程解析:DMA会执行4次“读-写”对。每次从源读4个字节(因为目的为32位,需要凑齐4字节才写一次),然后写入目的地址。NBYTES=16,所以4次后次循环完成。CITER=1,所以主循环也完成,触发中断,地址被SLAST/DLAST_SGA恢复。

场景二:外设触发多次传输(如UART接收)目标:UART每收到一个字节产生一个DMA请求,DMA将其存入一个256字节的缓冲区,收满后产生中断。

TCD->SADDR = (uint32_t)&UART->DATA_REG; // 外设数据寄存器地址 TCD->SOFF = 0; // 源地址固定,总是读同一个寄存器 TCD->ATTR = (0 << 8) | (0 << 0); // 源和目的都是8位 TCD->NBYTES = 1; // 每次请求搬1个字节 TCD->SLAST = 0; // 源地址不需要调整 TCD->DADDR = (uint32_t)rx_buffer; // 接收缓冲区 TCD->DOFF = 1; // 目的地址每次+1 TCD->DLAST_SGA = -256; // 主循环后,DADDR指针回到缓冲区开头 TCD->CITER = 256; // 需要256次请求才能完成主循环 TCD->BITER = 256; TCD->CSR = (1 << 7) | (1 << 1); // 使能主循环完成中断,并使能通道链接(E_LINK)?不,这里应该用自动重载。 // 注意:此处不应使用E_LINK。我们只需要主循环完成中断。 // 最后,使能硬件请求 DMA->ERQ |= (1 << channel_num); // 使能该通道的硬件请求

关键点:这里NBYTES=1CITER=256。UART每收到一个字节,发出一个ipd_req,DMA服务一次,搬移1字节,CITER减1。当256个字节全部收完,CITER减为0,主循环完成,产生中断,同时DADDRDLAST_SGA(-256)调整回缓冲区起始地址,CITER被重载为BITER(256��,通道自动准备好接收下一批256字节的数据。这就是“乒乓缓冲区”或“循环缓冲区”的典型实现,全程无需CPU干预。

避坑指南:配置TCD时,最常见的错误是字段写入顺序。必须最后配置CSR寄存器(特别是START位)。���为一旦START位置1,DMA可能立即开始仲裁和执行。如果此时其他字段(如地址、字节数)还未配置正确,将导致不可预知的传输,甚至总线错误。安全的做法是,先将所有其他字段(SADDR, SOFF... BITER)配置好,最后再配置CSR寄存器。

4. 通道仲裁与性能调优

DMA控制器通常有多个通道,如何仲裁多个同时到来的请求,直接影响到高实时性外设的服务质量。PXD10的DMA提供了灵活的仲裁策略,同时也带来了性能计算的复杂性。

4.1 仲裁模式详解

仲裁分为两级:组仲裁组内通道仲裁。每组包含若干通道。两种仲裁算法(固定优先级和轮询)可以自由组合,形成四种模式:

  1. 固定组优先级,固定通道优先级(Fixed-Fixed)

    • 行为:永远服务最高优先级组中最高优先级的那个请求。
    • 优点:为最高优先级任务提供最低且确定的延迟。支持通道抢占(Preemption),即高优先级通道可以打断正在执行的低优先级通道的传输(在当前次循环完成后)。
    • 缺点:如果高优先级通道一直有请求,低优先级通道将永远得不到服务(“饿死”)。
    • 适用场景:对实时性要求极端苛刻的单一外设,如高速ADC采样。需要启用抢占功能。
  2. 轮询组优先级,固定通道优先级(Round-robin - Fixed)

    • 行为:组之间采用轮询调度。在组内,服务最高优先级的通道。
    • 优点:避免了单个组垄断带宽,保证了组间的公平性。
    • 缺点:组内高优先级通道仍可能“饿死”低优先级通道。最高优先级通道的延迟可能比Fixed-Fixed模式大。
    • 适用场景:多个外设组需要公平分享DMA带宽,但组内仍有明确的优先级区分。
  3. 轮询组优先级,轮询通道优先级(Round-robin - Round-robin)

    • 行为:组间轮询,组内通道也轮询。完全公平调度。
    • 优点:绝对公平,任何通道最终都能得到服务,不会“饿死”。
    • 缺点最差情况延迟最大,无法保证高实时性外设的响应时间。通道优先级设置在此模式下无效。
    • 适用场景:多个带宽需求类似、实时性要求不高的外设,如多个低速UART。
  4. 固定组优先级,轮询通道优先级(Fixed - Round-robin)

    • 行为:组间固定优先级,高优先级组优先。组内通道轮询。
    • 优点:保证了高优先级组的带宽,同时组内通道公平。
    • 缺点:高优先级组可能垄断带宽,导致低优先级组“饿死”。组内无法区分通道优先级。
    • 适用场景:一个高优先级组包含多个需要公平调度的同类外设(如多个相同的SPI从机),同时需要确保该组相对于其他组的绝对优先权。

配置心得:选择仲裁模式是系统架构设计的一部分。对于混合了高实时性和低优先级后台传输的系统,Fixed-Fixed模式配合抢占是最佳选择。但要注意,手册指出抢占仅在Fixed-Fixed模式下有效。在轮询模式下,由于优先级是动态变化的,“更高优先级”的概念变得模糊,抢占无法工作。

4.2 性能计算与瓶颈分析

手册中提供了两个关键性能指标:峰值传输速率峰值请求服务率。理解这些数字背后的含义,对于评估系统能否满足数据吞吐量要求至关重要。

峰值传输速率:指在理想情况下,DMA持续进行数据搬运能达到的最大带宽(MB/s)。如表15-29所示,它高度依赖于:

  • 平台频率和总线宽度:64位总线比32位总线理论带宽高一倍。
  • 源和目的存储器类型:访问零等待周期的SRAM速度最快。访问带有等待周期的外设(IPS总线)会显著降低速率。例如,在150MHz、64位总线条件下,SRAM到SRAM的速率可达600MB/s,而SRAM到IPS(假设IPS写有3个等待周期)则骤降至120MB/s。

峰值请求服务率:指DMA每秒能处理多少次外设请求(MReq/s)。这个指标在设备 paced 的单次数据传输场景(如每个UART字节触发一次DMA)中更为重要。计算公式如下:PEAKreq = 平台频率 / [通道启动周期(4) + (1 + 读等待周期) + (1 + 写等待周期) + 通道关闭周期(3)]

让我们手动算一个例子,假设平台150MHz,SRAM读有1个等待周期,IPS写有3个等待周期,进行SRAM到IPS的传输:

  • 通道启动:4周期
  • 读数据阶段:1(地址相位)+ 1(SRAM等待)= 2周期
  • 写数据阶段:1(地址相位)+ 3(IPS等待)= 4周期
  • 通道关闭:3周期
  • 总周期数 = 4 + 2 + 4 + 3 =13周期
  • PEAKreq= 150 MHz / 13 ≈11.54 MReq/s

这意味着,理论上DMA每秒最多能处理约1154万次这样的单次数据传输请求。如果你的外设(比如一个ADC)的采样率是1MHz,那么DMA的处理能力是绰绰有余的。但如果采样率达到10MHz,这个DMA控制器就可能成为瓶颈。

性能调优实战

  1. 减少等待周期:这是提升性能最有效的方法。尽可能让DMA访问零等待或低等待周期的存储器(如TCM、紧耦合内存)。如果外设速度慢,考虑在SRAM中设置缓冲区,让DMA在SRAM之间高速搬运,再由CPU或另一个DMA通道分批处理与外设的交互。
  2. 增大单次传输量:外设请求服务率有上限,但单次传输的带宽可以很高。如果外设支持突发请求或FIFO,尽量配置DMA的NBYTES为一次搬移多个数据单元(例如,ADC有16级FIFO,就设置NBYTES=16*样本大小),从而减少请求次数,降低仲裁和通道启动开销。
  3. 谨慎使用通道链接与散聚:这两个高级功能非常强大,但手册明确提到,当使能通道链接或散聚时,会在下一次通道选择和启动时引入2个周期的延迟。在极限性能要求的场景下,需要将这2个周期计入你的延迟预算。
  4. 监控总线竞争:DMA是AHB总线的主设备,CPU和其他主设备(如另一个DMA)也会竞争总线。频繁的总线竞争会导致实际性能远低于理论峰值。在复杂系统中,需要合理规划各主设备的内存访问区域和时段,或者利用总线矩阵的带宽控制特性。

5. 高级功能与实战陷阱

掌握了基础配置和性能估算后,我们来看看那些能让DMA玩出花样的高级功能,以及开发中真实遇到的“坑”。

5.1 通道链接与散聚传输

通道链接:允许一个通道在传输完成后,自动启动另一个通道。这通过设置CITER.E_LINK(次循环链接)或MAJOR.E_LINK(主循环链接)以及对应的LINKCH字段来实现。典型应用是创建一个处理流水线:通道A从外设搬数据到缓冲区A,完成后链接启动通道B,对缓冲区A的数据进行处理(如滤波、格式转换),同时通道A可以开始填充缓冲区B。

散聚传输:这是更强大的功能。当主循环完成时,如果使能了散聚(通过DLAST_SGA寄存器的高位或特定模式位),DMA会自动从DLAST_SGA寄存器指向的内存地址加载一个新的、完整的TCD到当前通道。这意味着你可以预先在内存中定义一个TCD数组(链表),DMA会自动按顺序执行这些描述符定义的传输,无需CPU干预。这非常适合处理非连续内存块的数据搬运,例如网络协议栈中处理分散的报文缓冲区。

避坑指南:使用散聚时,务必确保下一个TCD描述符在内存中的地址是64位对齐的(因为TCD内存总线是64位宽),并且其内容在DMA读取前已经由CPU正确初始化。否则会导致DMA加载到错误的配置,引发不可控的数据传输甚至系统崩溃。

5.2 错误��理与调试技巧

DMA错误往往比较隐蔽,因为它在后台运行。PXD10的DMA提供了相对完善的错误状态寄存器(DMAES)。

  1. 配置错误:最常见的错误。例如,源/目的地址未按数据宽度对齐,NBYTES不是SSIZE/DSIZE的整数倍等。这些错误通常会被DMA检测到,并记录在DMAES寄存器中,同时停止该通道的传输。
  2. 优先级错误:分为组优先级错误(GPE)和通道优先级错误(CPE)。当你在固定优先级模式下,为同一个组内的多个通道设置了相同的优先级,就会触发CPE。当任何组优先级设置不唯一时,会触发GPE。手册明确指出,发生优先级错误时,DMA仍会选择一个通道执行,但错误报告和中断可能会关联到被选择的通道,而不是触发错误的通道,这给调试带来了很大困扰。最好的做法是,在固定优先级模式下,确保所有通道和组的优先级都是唯一的。
  3. 调试技巧
    • 启用错误中断:初始化时,通过DMAEEI寄存器使能所有通道的错误中断。一旦发生错误,能立刻进入中断服务程序进行排查。
    • 检查TCD状态:在传输过程中或传输后,读取TCDn.CSR寄存器中的ACTIVEDONE位,以及CITERSADDRDADDR的当前值,可以判断传输进度和状态。
    • 使用“Active Channel TCD Reads”:手册提到,当通道正在执行时,读取其TCD,SADDRDADDRNBYTES(实际是递减的计数器)返回的是DMA引擎内部寄存器的实时值,而不是内存中的初始值。这为实时监控传输进度提供了可能。
    • 总线监控:如果条件允许,使用芯片的调试模块或外部逻辑分析仪抓取AHB总线信号,是定位DMA问题(如地址错误、响应超时)的终极手段。

5.3 初始化与启动流程 checklist

根据手册15.4.1节,一个稳健的DMA初始化流程如下:

  1. 全局配置:配置DMACR(如果需要非默认配置,如使能循环仲裁)。
  2. 通道优先级:配置DCHPRIn寄存器,为每个通道/组设置优先级(如果使用固定优先级)。
  3. 使能错误中断:配置DMAEEI寄存器,使能你关心的通道的错误中断。强烈建议开启
  4. 配置TCD:为你计划使用的每个通道,完整填写其32字节的TCD结构体。切记最后写CSR寄存器
  5. 使能硬件请求:如果通道需要响应外设请求,配置DMAERQ寄存器使能对应通道的硬件请求。
  6. 启动传输
    • 对于软件启动:置位对应通道TCD的START位。
    • 对于硬件启动:确保外设能正确产生ipd_req信号。

完成这些步骤后,DMA就会按照你设定的剧本,在系统的幕后高效地执行数据传输任务了。理解其内部的每一处细节,不仅能让你在出现问题时快速定位,更能让你在设计之初就做出最优的架构选择,充分发挥硬件潜力。

http://www.jsqmd.com/news/1018679/

相关文章:

  • 阳泉黄金回收避坑全解 2026多家实体门店综合测评 - 余生黄金回收
  • MySQL 8在Redhat上启动报错‘binlog.index not found‘?别急着重装,先试试这个初始化参数避坑指南
  • 日志采集与 ELK:从本地日志到集中检索分析
  • 2026年蚌埠本地靠谱的防水补漏公司推荐:本地老店资质齐全,报价透明、性价比高,全程售后无忧 - 资讯速览
  • 中山黄金回收六家正规门店横向评测 - 余生黄金回收
  • 夺冠2026佛山奢侈品回收!合扬高价变现口碑稳居前列 - 奢侈品交易观察员
  • ExDark:破解低光照计算机视觉难题的7363张图像数据集解决方案
  • 2026肇庆黄金回收实测多门店对比及避坑指南 - 余生黄金回收
  • 2026年零基础必看:6款AI微信推文编辑器,公众号排版效率翻10倍(终极指南) - 鹅鹅鹅ee
  • 2026上海包包回收行情解析,5家门店综合实力榜单参考 - 奢侈品回收测评
  • 2026年黄金麻外墙干挂避坑指南:合肥本地厂家怎么选才不踩雷 - 商业科技观察
  • 深度学习大语言模型的训练全流程 —— 一个 ChatGPT 是怎么炼成的(七十八)
  • 2026扬州黄金回收实测 - 余生黄金回收
  • 3步掌握流放之路离线构筑神器:Path of Building深度解析
  • 2026湛江黄金回收价格一览 靠谱商家与避坑攻略 - 余生黄金回收
  • 中山黄金回收市场实测 - 余生黄金回收
  • 如何高效配置GUI智能助手:视觉语言模型实战指南
  • 机器视觉从知道到做到的跨越关键
  • 2026阳泉黄金回收门店实测 - 余生黄金回收
  • Windows系统优化终极指南:Dism++的5个超实用维护方案
  • 物料过滤提质增效靠什么?不锈钢袋式过滤器厂家高性价比可定制 审核中 - 品牌推荐大师
  • 2026阳泉黄金回收行情解析 - 余生黄金回收
  • 关于我 | 嵌入式方向学习记录
  • 独立制表人腕表回收指南,上海热门门店横评,看清真实成交价格 - 禹竞
  • 鸿蒙 6.1 新特性-60fps流畅人物跳跃功能算法深度解析-鸿蒙PC端正弦值计算法
  • 怎样高效管理游戏模组:KKManager终极实战指南
  • 2026哪个公众号编辑器更适合实用创作与H5页面制作?主流微信排版工具盘点 - 一串葡萄
  • 扬州闲置黄金变现指南 - 余生黄金回收
  • 寄电瓶车同城当天能到吗 本地托运时效标准全解析?同城寄电瓶车当天能到吗?本地托运时效标准详解 - 快递物流资讯
  • PXD10 QuadSPI接口深度解析:双模式设计、内存映射与低功耗实战