1. 项目概述与核心价值
在嵌入式系统开发,尤其是涉及高速数据流处理的应用中,CPU被频繁的数据搬运任务所拖累是一个老大难问题。想象一下,一个音频处理芯片需要将麦克风采集的连续数据搬入内存,再搬出到DAC进行播放,如果每个字节的移动都需要CPU发出指令,那CPU基本就干不了别的了。这时候,直接内存访问(DMA)技术就像一位不知疲倦的专职搬运工,接管了这项繁重且重复的工作。它允许外设与内存、内存与内存之间直接交换数据,CPU只需在开始时下达指令,结束时接收通知,期间可以解放出来处理更复杂的算法和逻辑。
德州仪器的增强型直接内存访问控制器(EDMA3)是这一领域的佼佼者,广泛应用于其DSP和异构多核处理器中。它不仅仅是简单的“搬运工”,更是一个高度可编程、支持复杂传输序列的智能数据调度引擎。理解EDMA3的触发与完成机制,是驾驭这颗“数据引擎”的关键。这决定了你能否精准地控制数据传输的时机,高效地串联多个传输任务,以及及时获知传输状态,从而构建出响应迅速、吞吐量高的嵌入式系统。无论是实现摄像头传感器的帧数据无缝搬运,还是完成多通道音频的乒乓缓冲,其底层都离不开对EDMA3这些核心机制的透彻掌握。
2. EDMA3架构与核心概念解析
在深入触发与完成机制之前,我们需要先搭建起对EDMA3控制器整体架构的认知框架。EDMA3并非一个单一模块,而是一个由通道控制器(EDMA3CC)和传输控制器(EDMA3TC)组成的协同系统。你可以把EDMA3CC看作是一个智能的“调度中心”,而EDMA3TC则是负责实际“搬运货物”的“执行车队”。
2.1 核心组件:CC与TC的分工
通道控制器(EDMA3CC)是大脑和指挥中心。它的核心职责包括:
- 事件管理:接收并处理来自外设、软件或链式触发的传输请求(事件)。
- 参数管理:维护一个称为参数RAM(PaRAM)的内存区域。每个传输任务(通道)都对应PaRAM中的一个参数集(PaRAM Set),里面详细定义了传输的源地址、目标地址、数据量(ACNT, BCNT, CCNT)、传输模式等所有信息。
- 请求排队与提交:将有效的传输请求打包成传输请求包(TRP),并按照优先级提交给对应的传输控制器。
- 完成处理:接收来自TC的传输完成通知,并根据配置触发中断或链式事件。
传输控制器(EDMA3TC)是肌肉和执行单元。它接收来自CC的TRP,负责具体的数据搬运工作,包括生成内存访问地址、执行实际的读/写操作,并在传输完成后向CC回送完成码。
2.2 数据传输的维度:ACNT, BCNT, CCNT与同步类型
EDMA3的数据传输不是简单的一维线性搬运,它支持复杂的三维传输,通过三个计数器和两种同步模式来定义。
- ACNT(Array Count):定义最基本的数据单元(称为“数组”)的字节数。例如,一次传输一个32位整数,ACNT就是4。
- BCNT(Block Count):定义在一个“帧”中包含多少个这样的“数组”。
- CCNT(Frame Count):定义包含多少个这样的“帧”。
传输的总字节数 = ACNT × BCNT × CCNT。
两种同步模式决定了传输请求(TR)产生的粒度:
- A-同步传输:每个数组(ACNT字节)的传输都需要一个独立的同步事件来触发。这意味着,要完成整个BCNT×CCNT的传输,需要BCNT×CCNT个事件。这种模式适用于需要精细控制每个数据块传输的场景。
- AB-同步传输:每个帧(ACNT×BCNT字节)的传输需要一个同步事件来触发。要完成整个传输,只需要CCNT个事件。这是更常用的模式,例如搬运一帧图像数据,一个帧同步信号就可以触发一整行(或一整帧)数据的搬运。
理解这些基础概念后,我们就能明白,所谓“触发”,就是告诉EDMA3CC:“现在可以开始处理一个ACNT(A-同步)或一个ACNT×BCNT(AB-同步)的数据块了”。而“完成”,则是EDMA3TC告诉EDMA3CC:“你刚才交给我的那个数据块,我已经搬完了”。
3. DMA通道传输触发机制深度剖析
DMA通道是EDMA3中最经典、最常用的传输单元。每个DMA通道通常与一个特定的硬件外设事件(如UART接收完成、ADC转换结束)绑定,但同时也支持灵活的软件控制。其触发方式主要有三种,它们共同构成了DMA传输的发起入口。
3.1 事件触发传输:与外设的硬件握手
这是DMA最典型的工作模式,实现了与外设的自动协同。整个过程就像一个精心设计的流水线:
- 事件发生:当外设(如SPI接收完一个数据字)或外部引脚产生一个特定事件时,该事件信号被送入EDMA3CC。
- 事件锁存:EDMA3CC内部的事件寄存器(ER)中,对应于该通道的位(ER.En)被硬件自动置1。这里有个关键细节:无论该通道的事件是否被使能(EER.En),ER中的位都会被置1。如果此时事件未被使能,这个事件就会“挂起”,等待被使能后再处理。
- 事件使能与排队:只有当事件使能寄存器(EER)中对应位也为1时,这个被锁存的事件才会被EDMA3CC“认领”。CC会根据自己的优先级逻辑,将该事件放入相应优先级的事件队列中等待处理。
- 参数校验与请求提交:当该事件在队列中排到队首时,CC会检查其对应的PaRAM参数集。如果这是一个有效集(非NULL集),CC会生成一个传输请求包(TRP)提交给EDMA3TC,并自动清除ER中的对应位,表示事件已被消费,可以接收下一个事件。如果对应的是一个NULL集,CC不会提交任何传输请求,但同样会清除ER位,并在事件丢失寄存器(EMR)中设置对应位,记录一次事件丢失错误。良好的编程习惯要求,在重新触发该DMA通道前,必须清除EMR中的这个错误标志位。
- 事件丢失处理:如果某个通道的事件正在被处理(已在队列中),而此时又来了一个相同通道的事件(ER.En尚未被清除),那么第二个事件就会被视为“错过”,并在EMR中记录。这通常意味着事件产生速率超过了DMA的处理能力,需要调整系统设计。
实操心得:在调试基于事件触发的DMA时,如果发现数据传输不完整或丢失,第一个要检查的就是ER和EER寄存器,确认事件是否成功产生并被使能。第二个要查的就是EMR,看是否有事件因为队列满或NULL参数集而被丢弃。初始化时,先清除ER、EER、EMR是个好习惯。
3.2 手动触发传输:CPU的直接指挥
当没有合适的硬件事件,或者需要由软件主动发起一次传输时,就需要用到手动触发。CPU(或其他可编程主机)通过向事件设置寄存器(ESR)的特定位写1,来模拟一个硬件事件。
其流程与事件触发类似,但有一个重要区别:手动触发不受EER(事件使能寄存器)的控制。即使EER.En=0(事件被禁用),向ESR写1依然会强制产生一个事件并被CC排队处理。这为软件提供了最高优先级的直接控制权。
同样,在手动触发时,如果对应PaRAM集是NULL,也会导致事件被丢弃并在EMR中记录错误。如果对一个已经在处理中的通道再次手动触发(ESR对应位仍为1),也会产生事件丢失。
注意事项:手动触发是一种“覆盖”行为。它通常用于启动一次性的传输,或在链式传输中启动第一个环节。在���繁使用手动触发的场景中,要特别注意与可能发生的硬件事件之间的冲突,避免误触发。
3.3 链式触发传输:构建传输流水线
链式触发是EDMA3高级功能的核心,它允许一个传输的完成自动触发另一个传输的开始,从而将多个独立的传输任务串联成一个自动化的工作流,无需CPU干预。
其工作原理如下:
- 完成码产生:在通道的PaRAM参数集的OPT字段中,有一个6位的传输完成码(TCC)。同时,OPT中还有
TCCHEN(最终传输链使能)和ITCCHEN(中间传输链使能)位,用于控制何时产生链式事件。 - 链式事件注册:当一次传输(或子传输)完成,并且链使能位被设置,EDMA3TC(或CC,取决于完成模式)会根据TCC值,在链式事件寄存器(CER)中设置对应的位(CER.E[TCC] = 1)。
- 触发下游通道:CER中位的设置,其效果等同于一个事件发生。EDMA3CC会像处理普通事件一样,对该事件进行排队、校验PaRAM集(此时PaRAM集是TCC所指向的另一个通道的参数集),并提交传输请求。
链式(Chaining)与链接(Linking)的本质区别: 这是一个至关重要的概念。链接发生在同一个通道内,当一次传输完成后,EDMA3CC会自动用LINK地址指向的另一个PaRAM集来更新(重载)当前通道的参数,然后等待下一个事件来触发同一个通道的下一次传输。链式则是跨通道的,它不修改任何通道的参数,只是简单地给另一个通道发送一个触发事件。链接用于循环或交替缓冲区(如乒乓缓冲),而链式用于构建顺序执行的任务流水线。
例如,你可以配置:
- 通道0:从ADC搬运数据到缓冲区A,完成后通过链式触发通道1。
- 通道1:将缓冲区A的数据进行某种处理(如位反转)后存到缓冲区B,完成后触发中断通知CPU。 这样,ADC每完成一次采集,数据会自动经过处理并准备好,CPU只需处理最终结果。
4. QDMA通道传输触发机制解析
QDMA(Quick DMA)是EDMA3中一种特殊的通道,它没有固定绑定的事件源,其触发与PaRAM参数的写入操作直接绑定,非常适合由软件发起的一次性、小批量数据传输。
4.1 自动触发:写入即触发
这是QDMA最常用的模式。其核心思想是:对QDMA通道映射的PaRAM参数集中的“触发字”进行一次写操作,本身就是触发事件。
- 映射配置:通过QDMA通道映射寄存器(QCHMAPn),将一个QDMA通道映射到任意一个PaRAM集,并指定该参数集中的哪一个字(如OPT、SRC、DST等)作为“触发字”。
- 使能与触发:当QDMA事件使能寄存器(QEER)中对应通道使能后,CPU(或任何主机)对映射的PaRAM集中触发字进行一次32位写访问。
- 事件产生:这次写操作会立即在QDMA事件寄存器(QER)中置位对应通道位,从而产生一个QDMA事件,进入CC的事件队列等待处理。
关键优势:对于CPU来说,启动一次QDMA传输极其高效。通常,你需要先设置好PaRAM参数(SRC, DST, CNT等),最后写入触发字(如OPT),这一次写入就同时完成了参数设置和传输触发两个动作,节省了额外操作ESR的步骤。
4.2 链接触发:链接更新的副作用
链接触发是QDMA与链接功能结合时产生的特性。当EDMA3CC执行一次链接操作(即用一个链接参数集更新当前通道的PaRAM)时,如果被更新的PaRAM集恰好被映射为了一个QDMA通道,那么这次更新操作本身就会被视为一次对触发字的写操作,从而触发该QDMA通道。
这为实现链式QDMA传输提供了可能:你可以设置一个初始的QDMA参数集,并将其链接地址指向另一个参数集。当第一次QDMA传输被(自动)触发并完成后,CC执行链接,用新参数集覆盖原QDMA通道参数,而这次链接操作又会自动触发新参数集定义的第二次QDMA传输,如此往复。
4.3 DMA与QDMA通道的对比与应用选型
为了更清晰地指导实践,我们将DMA与QDMA的核心区别和应用场景总结如下:
| 特性 | DMA通道 | QDMA通道 |
|---|---|---|
| 触发源 | 外设事件、手动写ESR、链式事件 | 写PaRAM触发字、链接更新 |
| 事件绑定 | 与特定硬件事件固定或灵活绑定 | 与PaRAM集的写入操作绑定 |
| 参数重载 | 通常需要链接(Linking)来更新参数 | 每次触发前通常需要重新编程PaRAM(或依靠链接) |
| 典型应用 | 周期性的、由外设事件驱动的数据流(如ADC、McASP) | 软件发起的、非周期性的单次或少量数据传输 |
| 使用建议 | 用于稳定的、连续的数据流传输。 | 用于“即用即发”的传输任务。通常配置为BCNT=CCNT=1(A-同步)或CCNT=1(AB-同步),因为一次触发期望完成整个传输。 |
选型心得:简单来说,如果你的数据传输是由某个硬件信号(如帧同步、数据就绪)规律性发起的,就用DMA通道。如果你的传输是由软件在不确定时刻发起的,比如搬移一个计算好的数据块到显示缓冲区,那么QDMA更合适,它的编程模型对软件更友好。
5. 传输完成机制与状态反馈
触发机制解决了“何时开始搬”的问题,而完成机制则解决了“何时搬完”以及“搬完后做什么”的问题。EDMA3提供了灵活的完成通知机制,以适应不同的应用场景对实时性和效率的需求。
5.1 完成检测的三种模式
EDMA3CC通过三种模式来获知一次传输请求(TR)的完成状态,这由PaRAM中OPT字段的TCCMODE位决定。
正常完成(TCCMODE = 0)这是最严格、最准确的完成模式。EDMA3CC认为一次传输完成,只有当它收到来自EDMA3TC的完成码。而TC发送完成码的前提是,它已经收到了目的端的回馈确认。这意味着数据不仅被TC发出,而且已经被目的地(如外设FIFO、内存控制器)成功接收。这种模式保证了数据交付的可靠性,通常用于生成传输完成中断,通知CPU数据已经安全就绪,可以进行后续处理(如算法处理、转发)。
早期完成(TCCMODE = 1)这是一种以吞吐量为优先的优化模式。EDMA3CC认为一次传输完成,是在它将传输请求包(TRP)提交给EDMA3TC的瞬间。也就是说,CC一旦把任务派发给TC,就立刻认为这个任务“完成”了,并可以立即进行后续操作(如触发链式事件、产生中断)。此时,TC可能还在忙碌地搬运数据。这种模式的巨大优势在于允许流水线操作。前一个传输还在TC中执行时,CC已经可以开始准备和处理下一个传输的触发或链接,极大提升了整体数据传输的吞吐量。它非常适用于通道链式(Chaining),让多个传输任务能够无缝衔接。
空完成(Dummy/Null Completion)这是早期完成的一个特例,专门用于NULL或DUMMY参数集。当CC遇到一个NULL集(全0或特定值)或DUMMY集时,它根本不会向TC提交任何实际的传输请求。但是,如果这个NULL/DUMMY集的OPT中配置了要返回完成码(用于中断或链式),CC会在内部模拟一个早期完成路径,直接设置相应的中断挂起寄存器(IPR)或链式事件寄存器(CER)位。这常用于实现复杂的传输序列控制,比如在链式中插入一个“空操作”来制造延迟,或者作为任务链的结束标志。
5.2 中断生成机制详解
中断是CPU感知DMA传输完成的主要方式。EDMA3的中断机制设计精巧,兼顾了灵活性与效率。
中断的产生逻辑
- 完成码映射:每个通道的PaRAM集中都定义了一个6位的传输完成码(TCC)。这个TCC值直接对应到64位中断挂起寄存器(IPR)中的某一位。例如,TCC=5,则完成时IPR[5]会被置1。
- 中断使能层级:IPR位被置1,并不直接产生CPU中断。它需要经过两级使能过滤:
- 第一级:全局中断使能。通过中断使能寄存器(IER)控制。IER的每一位对应IPR的一位。只有IER[n]=1时,IPR[n]的置位才会被考虑用于产生中断。
- 第二级:区域访问使能。通过DMA区域访问使能寄存器(DRAE)控制。这是为了支持多核/异构系统而设计的。每个“影子区域”(Shadow Region)都有自己的DRAE寄存器,用于控制该区域内的CPU只能看到和触发分配给它的那些通道的中断。这避免了不同核之间的资源冲突。
- 中断信号输出:只有当
(IPR[n] == 1) && (IER[n] == 1) && (DRAE_for_region[n] == 1)条件满足时,对应于该影子区域的中断输出信号(如EDMA3_0_CC0_INT0)才会被置为有效。
最终中断与中间中断与链式事件类似,中断也可以在传输的不同阶段产生,由OPT中的TCINTEN(最终传输中断使能)和ITCINTEN(中间传输中断使能)控制。
- 仅最终中断(TCINTEN=1, ITCINTEN=0):在整个参数集定义的最后一次传输请求完成时产生一次中断。适用于通知CPU“一整批数据已就绪”。
- 仅中间中断(TCINTEN=0, ITCINTEN=1):在每次非最终的传输请求完成时产生中断。适用于需要CPU在传输过程中进行干预的场景,例如处理流水线中的数据。
- 全部中断(TCINTEN=1, ITCINTEN=1):每一次传输请求完成都产生中断。这会产生大量中断,通常用于精细调试或特殊控制流程。
5.3 链式与中断的配置实例分析
让我们通过一个具体例子,将链式、中断、同步模式、完成模式结合起来看。假设我们需要完成一个图像处理流水线:
- 通道0(DMA):从摄像头接口(A-同步)搬运一帧图像(假设为320x240 RGB565,则ACNT=2字节,BCNT=320,CCNT=240)到缓冲区A。配置为早期完成,
TCC=1,并启用最终链式(TCCHEN=1)和最终中断(TCINTEN=1)。 - 通道1(DMA):将缓冲区A的数据进行色彩空间转换后存入缓冲区B。配置为正常完成,
TCC=2,仅启用最终中断(TCINTEN=1)。
流程推演:
- 摄像头产生行同步事件(A-同步),触发通道0搬运一行(320个像素,即320次ACNT传输)。
- 通道0每提交一行数据的最后一个TR(早期完成),不会立即触发链式,因为
TCCHEN只对最终TR有效。 - 当通道0提交完第240行(即整个帧的最后一个TR)时,由于是早期完成,CC在提交TR后立即认为通道0“完成”。它根据TCC=1,在CER[1]置位。
- CER[1]的置位作为一个链式事件,触发通道1开始工作(此时通道0的TC可能还在搬运最后一行数据)。
- 通道1开始搬运并处理缓冲区A的数据。由于是正常完成,只有当TC将处理后的数据全部写入缓冲区B后,CC才收到完成码。
- CC根据通道1的TCC=2,设置IPR[2]。由于IER[2]和DRAE相应位已使能,最终产生一个中断给CPU。
- CPU进入中断服务程序,此时缓冲区B中的图像数据已经过转换并完全就绪,CPU可以将其送显或进行下一步分析。
这个例子展示了如何利用早期完成实现通道间的流水线(搬运与处理重叠),以及用正常完成保证CPU在数据完全准备好后再被通知。
6. 高级主题:影子区域与资源分区
在复杂的多核嵌入式系统中,多个处理器核心或主设备(如协处理器)可能都需要使用EDMA3资源。为了避免冲突,EDMA3引入了影子区域(Shadow Region)的概念。
6.1 影子区域的工作原理
可以将EDMA3CC的寄存器视图想象成一份“总资源表”。影子区域为不同的“用户”(CPU核)提供了这份总表的受限制的副本视图。每个影子区域都有自己的一套地址空间,映射到EDMA3CC的部分寄存器。
关键的控制寄存器是DRAEm和QRAEm(m为区域号)。它们的每一位对应一个DMA或QDMA通道(或TCC码)。
- 如果DRAE0[5] = 1,那么通过“影子区域0”的地址空间访问DMA通道5的相关寄存器(如EER, ESR)是有效的。
- 如果DRAE0[5] = 0,那么通过“影子区域0”的地址空间对通道5的寄存器进行写操作会被忽略,读操作则返回0。但这并不影响通过“全局区域”或其他使能了该通道的影子区域对其进行访问。
6.2 资源分区实践
假设一个双核系统:
- 核0负责音频处理,需要使用DMA通道0-3(对应McASP收发)和TCC 0-3。
- 核1负责图像处理,需要使用DMA通道16-19(对应摄像头)和TCC 16-19。
系统初始化时,由某个主核(或Bootloader)进行资源配置:
- 配置DRAE0 = 0x0000000F(二进制...00001111),将通道0-3分配给影子区域0。
- 配置DRAE1 = 0x000F0000(二进制...00001111 0000 0000 0000 0000),将通道16-19分配给影子区域1。
- 将影子区域0的寄存器地址空间映射到核0的私有地址段,影子区域1的映射到核1。
这样,核0只能看到和操作通道0-3,核1只能看到和操作通道16-19。它们各自编写驱动程序时,都像是在独占一部分EDMA3资源,无需担心彼此干扰,极大地简化了多核软件设计的复杂性。
7. 常见问题排查与实战技巧
理论最终要服务于实践。下面是一些在开发和调试EDMA3时常见的问题和应对策略。
7.1 传输未启动或数据不完整
这是最常见的问题,排查思路可以遵循以下路径:
| 现象 | 可能原因 | 排查步骤与解决方法 |
|---|---|---|
| DMA传输完全没启动 | 1. 事件未使能(EER)。 2. PaRAM集为NULL或未正确配置。 3. 通道被分配给其他影子区域,当前CPU无访问权限。 | 1. 检查EER寄存器对应位是否为1。 2. 检查PaRAM集中SRC, DST, CNT, OPT是否已正确写入,特别是OPT中的 TCINTEN等位是否误设为0?确认LINK地址是否为有效值或0xFFFF(NULL)。3. 检查当前操作地址是全局区域还是影子区域,并核对DRAE/QRAE配置。 |
| QDMA传输未启动 | 1. QDMA通道未使能(QEER)。 2. 写入的地址不是QCHMAPn中定义的触发字。 3. 对触发字的写入不是32位访问。 | 1. 检查QEER寄存器。 2. 确认写入的PaRAM地址偏移量是否与QCHMAPn中 PAENTRY和TR WORD字段匹配。3. 确保使用 *(volatile uint32_t *)方式进行32位写操作。 |
| 数据传输不完整(少了几字节或几次) | 1. 同步模式(OPT.SYNC)与事件触发模式不匹配。 2. 事件丢失(EMR置位)。 3. BCNT/CCNT计算错误。 | 1. 确认是A-同步还是AB-同步,并与实际产生的事件类型核对。AB-同步需要帧同步事件,A-同步需要数组同步事件。 2. 读取EMR寄存器,看是否有位被置1。如有,清除EMR并检查事件产生速率是否超过DMA处理能力,或检查PaRAM是否为NULL集。 3. 重新计算三维传输参数,总传输量=ACNTBCNTCCNT。 |
| 链式传输未按预期触发 | 1. 上游通道的TCC值与下游通道号不对应。 2. 上游通道未正确使能链式(TCCHEN/ITCCHEN)。 3. 下游通道的事件未使能(EER)。 | 1. 上游通道OPT中的TCC值,���定了设置CER中的哪一位。下游通道需要被配置为由该CER位触发(即下游通道的事件号需与TCC值匹配?不,链式事件是独立事件源,下游通道需使能对应的事件,并确保该事件映射到了CER的对应位。通常通过事件映射寄存器实现,需查具体手册)。关键点:链式触发是通过CER产生一个“事件”,这个事件需要像硬件事件一样,被映射到某个DMA通道才能触发它。 |
7.2 中断无法产生或产生异常中断
中断问题通常与配置的层层使能有关。
中断完全不产生:遵循“从内到外”的检查顺序。
- 第一步:确认传输确实已完成。检查IPR寄存器,看预期的那一位是否被置1。如果IPR位没置1,问题出在传输完成或TCC配置上(检查OPT中的TCINTEN/ITCINTEN和TCC值)。
- 第二步:如果IPR位已置1,检查IER寄存器对应位是否使能。
- 第三步:如果IER已使能,检查DRAE寄存器(如果使用影子区域)对应位是否使能。
- 第四步:以上都正确,检查设备级的中断控制器(如ARM的GIC、DSP的INTC)配置,确保EDMA3的中断输出线已映射到CPU中断,并且在该中断控制器中已使能。
产生非预期的中断(串扰):
- 最常见原因:多个通道使用了相同的TCC值,但它们的中断服务例程(ISR)本应不同。当IPR[n]因任意通道完成而置位时,所有使用TCC=n的通道完成都会触发同一个中断。在ISR中需要读取IPR和相应的通道状态寄存器来确定是哪个通道实际完成了。
- 解决方法:为需要独立中断的通道分配唯一的TCC值。或者,在ISR中实现更精细的状态查询和分发逻辑。
7.3 性能优化技巧
合理使用早期完成进行流水线:对于连续的、多阶段的处理链,将前序通道设置为早期完成(TCCMODE=1)并启用链式,可以让后序通道尽早启动,实现CC与TC之间、以及不同TC之间的并行工作,最大化总线带宽利用率。
利用链接实现乒乓缓冲:这是EDMA3的经典用法。为同一个DMA通道准备两个PaRAM集(Set A和Set B),分别指向缓冲区A和B。在Set A的LINK字段填入Set B的地址,Set B的LINK字段填入Set A的地址。通道配置为自动链接(OPT.STATIC=0)。当通道使用Set A完成一次传输后,CC会自动用Set B的参数重载该通道,并等待下一个事件。这样,在外设持续产生事件的情况下,数据会在缓冲区A和B之间自动交替写入,CPU可以安全地处理另一个缓冲区中的数据,实现了零拷贝的高效数据流。
QDMA用于单次突发传输:对于CPU发起的、非周期性的内存到内存拷贝,使用QDMA比配置和触发一个DMA通道更高效。只需填充PaRAM(通常映射到一个固定Set),然后一次32位写操作即可启动传输。
避免事件丢失:对于高速数据流,确保EDMA3CC的事件队列深度足够,并且服务这些事件的优先级设置合理。监控EMR寄存器,如果频繁出现事件丢失,可能需要优化传输参数(如增大ACNT以减少事件频率),或者使用AB-同步替代A-同步来减少事件数量。
理解EDMA3的触发与完成机制,是从“能用”到“用好”DMA的关键一步。它不再是黑盒,而是一个你可以精确编程和调度的数据搬运引擎。掌握这些细节,意味着你能设计出更高效、更可靠、更实时的嵌入式系统数据通路。