1. 项目概述在嵌入式系统开发尤其是涉及高速数据流处理的场景里直接内存访问DMA技术是解放CPU、提升系统整体性能的“王牌”。它让外设和内存之间能绕过CPU直接“对话”CPU只需发号施令后续的数据搬运工作就全权交给DMA控制器。而增强型DMAEDMA作为DMA的进化版本在灵活性和功能上更上一层楼尤其以其复杂的参数集PaRAM管理和多层次中断机制著称。今天我们就来深入拆解EDMA控制器中两个核心且容易让人困惑的高级特性QDMA通道到PaRAM的可编程映射以及基于区域Region的资源管理与中断机制。理解它们你就能真正驾驭EDMA设计出既高效又稳健的数据传输链路。对于从事TI C6000系列DSP、AM系列SoC或其他集成复杂EDMA控制器芯片开发的工程师来说配置DMA传输是家常便饭。但很多时候我们可能只是照着例程配置几个基础参数对于QDMA的触发机制、PaRAM的灵活映射以及如何利用区域机制实现不同任务或核心间的DMA资源安全隔离知其然不知其所以然。这会导致在实现复杂数据流、多任务协同或需要高可靠性的系统时遇到性能瓶颈或难以调试的诡异问题。本文将结合技术手册中的核心图表和寄存器描述用实际开发的视角为你厘清这些高级功能的原理、配置方法和避坑要点。2. EDMA核心架构与PaRAM机制回顾在深入主题之前我们有必要快速回顾一下EDMA的核心工作模型这有助于理解后续高级特性的设计初衷。2.1 EDMA传输的“任务清单”PaRAM SetEDMA的每一次传输都不是简单的一蹴而就。它可能涉及三维数据块ACNT, BCNT, CCNT的搬运、源地址和目的地址的复杂跳变通过IDX寄存器甚至是一次传输完成后自动加载下一个传输参数Linking功能。所有这些信息都被组织成一个结构化的“任务清单”即参数集Parameter Set PaRAM Set。一个完整的PaRAM Set包含多个字段手册中给出的结构通常是这样的偏移地址字段名描述0hOPT选项参数包含传输类型、中断使能、链接触发使能、传输完成码TCC等核心控制位。4hSRC源数据的起始地址。8hACNT / BCNT通常是一个32位寄存器低16位为ACNT第一维元素个数高16位为BCNT第二维数组个数。ChDST目的数据的起始地址。10hSRCIDX / DSTIDX源地址和目的地址的索引增量。在AB同步模式下分别用于A维和B维传输后的地址更新。14hBCNTRLD / LINK这是一个复用字段。在三维传输AB同步中低16位用作BCNTRLD用于在C维传输开始时重载BCNT值高16位用作LINK指向下一个PaRAM Set的地址或为空。18hCCNT / LINK这也是一个复用字段。在三维传输中低16位为CCNT第三维数组个数高16位用作LINK。在二维或一维传输中整个字段可能用作LINK。1ChReserved保留字段。注意不同型号的EDMA控制器其PaRAM Set的具体字段定义和偏移地址可能略有差异务必以你所使用芯片的参考手册为准。但核心思想是一致的PaRAM Set封装了一次复杂传输的所有上下文。2.2 DMA通道与QDMA通道的本质区别EDMA控制器通常提供两种类型的通道DMA通道和QDMA通道。理解它们的区别是理解映射机制的关键。DMA通道这是最经典的DMA通道。每个DMA通道例如64个通常与一个特定的事件Event输入硬件绑定。比如串口接收缓冲区满、定时器溢出等硬件事件会直接触发对应编号的DMA通道启动传输。它的触发是事件驱动的由外设硬件信号发起。QDMA通道数量较少例如8个它没有固定的硬件事件输入。QDMA的触发方式是软件写触发。具体来说你需要通过向一个特定的寄存器即我们后面要详细讲的QCHMAPN_j寄存器所指向的PaRAM Set中的某个“触发字”执行一次写操作来手动“点火”一次QDMA传输。这使得QDMA非常灵活可以由任何软件流程在任意时刻发起DMA请求。你可以把DMA通道想象成公司里各个部门外设的专用秘书DMA通道部门有事硬件事件就直接叫自己的秘书去办。而QDMA通道则是几个公共的、谁都可以临时借用的“机动秘书”任何员工软件任务需要搬东西时去填一张特定的申请表写触发字就能调用一个机动秘书来干活。3. QDMA通道到PaRAM的可编程映射机制这是EDMA灵活性的一大体现。对于DMA通道其通道编号0-63通常固定映射到PaRAM Set的编号0-63。但QDMA通道打破了这种固定关系。3.1 映射寄存器EDMA_TPCC_QCHMAPN_j手册中的图13-11和13-12清晰地展示了这种映射关系。每个QDMA通道j都对应一个独立的映射寄存器EDMA_TPCC_QCHMAPN_j。这个寄存器的两个关键字段决定了该QDMA通道的行为PAENTRY (位 13:5)这是参数集入口索引。它指定了这个QDMA通道关联到哪一个PaRAM Set。理论上它可以指向512个PaRAM Set中的任意一个假设PaRAM总共有512组。这就意味着多个QDMA通道可以共享同一个PaRAM Set或者一个QDMA通道可以在不同时刻通过修改此字段来关联不同的PaRAM Set实现动态任务切换。TRWORD (位 4:2)这是触发字选择。它指定了在关联的PaRAM Set中哪一个32位字Word作为“触发字”。一个PaRAM Set有8个32位字从OPT到Reserved。向这个特定的“触发字”地址执行写操作就会触发该QDMA通道启动传输。为什么需要TRWORD这提供了极大的灵活性。假设一个PaRAM Set已经配置好了一次从内存A到内存B的传输参数。你可以将TRWORD设置为指向SRC字段。那么当你需要触发这次传输时你只需要向这个SRC地址实际上它是PaRAM Set中的一个参数并非真正的源数据地址写任意值即可。更妙的是你可以在触发前先修改PaRAM Set中的其他参数比如DST地址然后通过写TRWORD来触发从而实现参数可变的重复传输。3.2 默认映射与重映射警告手册中特别强调了一个重要注意事项默认情况下所有QDMA通道都映射到PaRAM Set 0。这意味着如果你在使用QDMA通道前没有重新配置QCHMAPN_j寄存器那么所有QDMA触发都会去执行PaRAM Set 0所定义的任务。这极有可能不是你想要的并且如果PaRAM Set 0被用于其他目的比如某个DMA通道会造成混乱。实操心得在系统初始化阶段配置完所有需要的PaRAM Set后必须为每个计划使用的QDMA通道显式配置其QCHMAPN_j寄存器将其指向一个专有的、已正确初始化的PaRAM Set。这是一个常见的初始化遗漏点会导致难以排查的传输错误。3.3 配置流程与示例假设我们要使用QDMA通道2j2让它关联到PaRAM Set 100并希望向PaRAM Set的DST字段偏移Ch即第4个32位字TRWORD编号通常从0开始计数OPT是0SRC是1ACNT/BCNT是2DST是3写入来触发传输。准备PaRAM Set 100在内存中初始化好PaRAM Set 100的各个字段OPT, SRC, ACNT/BCNT, DST等。计算QCHMAPN_2寄存器值PAENTRY 100(二进制001100100)TRWORD 3(二进制011 应DST字段)寄存器其他位通常保留为0。假设寄存器模型是PAENTRY在[13:5]TRWORD在[4:2]则计算出的值可能是(100 5) | (3 2)。具体位域需查手册。写入寄存器将计算出的值写入EDMA_TPCC_QCHMAPN_2寄存器的地址例如EDMA Base Address 4040h根据手册图13-12。触发传输在软件中当你需要启动这次DMA传输时执行一条向PaRAM Set 100的DST字段地址的写操作。即使写入的数据无意义通常写0这个写动作本身就会触发QDMA通道2开始工作。// 伪代码示例 volatile uint32_t *parambase (uint32_t*)(EDMA_PARAM_BASE); volatile uint32_t *qchmap2 (uint32_t*)(EDMA_TPCC_BASE 0x4040); // 1. 初始化 PaRAM Set 100 parambase[100*8 0] opt; // OPT parambase[100*8 1] src_addr; // SRC parambase[100*8 2] (bcnt 16) | acnt; // BCNT | ACNT parambase[100*8 3] dst_addr; // DST // ... 设置其他IDX, LINK等字段 // 2. 配置QDMA通道2映射 *qchmap2 (100 5) | (3 2); // 假设位域如上所述 // 3. 稍后在需要触发传输时 parambase[100*8 3] 0; // 向DST字段地址写任意值触发QDMA传输4. EDMA通道控制器的区域Region管理在多核、多任务或复杂安全等级要求的系统中让所有软件模块都能随意访问和修改所有64个DMA通道、8个QDMA通道及其中断资源是危险且低效的。EDMA的区域管理机制就是为了解决资源隔离和权限控制问题。4.1 区域的概念与视图如手册13.2.7节所述EDMA通道控制器TPCC将其地址空间划分为一个全局区域Global Region和八个影子区域Shadow Region。全局区域这是“上帝视角”。在这里你可以看到和控制所有的EDMA资源所有通道寄存器、中断寄存器等。地址是固定的例如EDMA Base Address 1000h开始的区域。影子区域这是“部门视角”。每个影子区域0-7都提供了一套映射视图指向同一套物理寄存器。但是通过配置你可以控制在这个视图下哪些资源是“可见”和“可操作”的。每个影子区域有自己独立的地址范围例如Region 0在EDMA Base Address 2000hRegion 1在EDMA Base Address 2200h以此类推。关键点影子区域不是复制了一套新的物理寄存器而是通过硬件过滤逻辑对同一套物理寄存器的访问施加了限制。这类似于操作系统中不同进程的虚拟地址空间映射到同一物理内存的不同部分。4.2 区域访问使能寄存器DRAE/QRAE控制“部门视角”能看到哪些资源的钥匙就是DMA区域访问使能寄存器EDMA_TPCC_DRAEM_k/EDMA_TPCC_DRAEHM_k和QDMA区域访问使能寄存器EDMA_TPCC_QRAEN_k。其中k代表区域编号0-7。DRAEM_k/DRAEHM_k这是一个寄存器对总共64位对应64个DMA通道。每一位控制一个DMA通道及其关联的传输完成码TCC在该影子区域k中是否可访问。位[n] 1表示DMA通道n以及TCC码为n的中断在该区域中可读可写。位[n] 0表示对该通道/TCC相关寄存器的访问将被静默忽略。写操作被丢弃读操作返回0。这实现了硬件级的访问隔离。QRAEN_k一个寄存器位数对应QDMA通道数例如8位。每一位控制一个QDMA通道在该影子区域k中是否可访问。功能同DRAE。手册中的图13-13和表13-6清晰地展示了这一过滤机制。除了IEVAL中断评估寄存器外所有通过影子区域地址空间对通道/中断寄存器的访问都要经过DRAE/QRAE的过滤。4.3 区域划分的实际意义与配置示例为什么需要这个安全与稳定在一个运行RTOS的系统中你可以将摄像头数据采集DMA通道0-15分配给Region 0只让摄像头驱动任务有权限访问通过MPU配置该任务只能访问Region 0的地址空间。将网络发包DMA通道16-31分配给Region 1只让网络协议栈任务访问。这样一个崩溃的驱动任务不会错误地篡改另一个任务的DMA配置导致系统级故障。多核系统资源分配在双核DSP中你可以将一部分DMA通道划给Core 0Region 0另一部分划给Core 1Region 1。两个核的软件独立配置和使用各自的DMA资源无需复杂的互斥锁简化了软件设计。特权级隔离结合内存保护单元MPU可以设置某些Region只能由特权模式Supervisor访问而用户模式User任务无法触碰关键的DMA配置提升系统安全性。配置示例 假设系统有两个主要模块模块A如视频处理需要独占DMA通道0-15和QDMA通道0模块B如音频处理需要独占DMA通道16-31和QDMA通道1-2。我们希望将它们隔离到两个区域。为Region 0模块A配置DRAEM_0 0x0000FFFF (使能通道0-15)DRAEHM_0 0x00000000 (高32位通道32-63不使能)QRAEN_0 0x00000001 (使能QDMA通道0)为Region 1模块B配置DRAEM_1 0xFFFF0000 (使能通道16-31注意DRAEM是低32位寄存器对应通道0-31。通道16-31在DRAEM的位16-31。实际上对于通道16-31需要设置DRAEM的高16位和DRAEHM的低16位具体取决于手册对64位的划分方式。手册示例13-1给出了更准确的说明。)根据手册示例13-1更通用的方法是DRAEHM_1和DRAEM_1的64位组合其第n位对应通道n。要使能通道16-31即设置位16到位31为1。QRAEN_1 0x00000006 (使能QDMA通道1和2二进制00000110)注意事项DRAE/QRAE寄存器通常在系统初始化时由高级别、可信的软件如Bootloader或特权级内核一次性配置并在运行期间保持静态。动态修改这些寄存器需要非常小心因为可能影响正在进行的DMA传输。5. EDMA的中断机制详解EDMA的中断系统是其与CPU协同工作的关键。它不仅要通知CPU传输完成还要在复杂的区域管理下确保中断能被正确的处理单元接收。5.1 中断类型与来源EDMA中断主要分为两大类如表13-8和13-9所示传输完成中断EDMA_TPCC_INT0-INT7及全局中断当一次DMA传输或一个中间阶段完成并且该通道的PaRAM Set中配置了产生中断TCINTEN或ITCINTEN位使能EDMA就会产生一个完成中断。每个影子区域0-7都有一个独立的中断输出线INT0-INT7此外还有一个全局中断线。错误中断EDMA_TPCC_ERRINTTPCC级别的错误包括DMA/QDMA事件丢失、队列阈值超限、TCC错误等。EDMA_TPCC_MPINT内存保护错误中断。EDMA_TCx_ERRINT传输控制器TC级别的错误。5.2 传输完成中断的生成逻辑这是最复杂的部分手册图13-14的示意图和13.2.9.1.1节的公式是理解的关键。中断的产生需要经过三层“与门”过滤第一层中断挂起IPR当传输完成时EDMA会根据该通道PaRAM Set中OPT字段的传输完成码TCC 位[17:12]将EDMA_TPCC_IPR/IPRH寄存器中对应的位置1。TCC值0-63直接对应IPR/IPRH的位0-63。这是中断的“源头”。第二层全局中断使能IEREDMA_TPCC_IER/IERH寄存器是全局中断使能开关。只有IER中对应位为1的挂起中断才有资格继续传递。第三层区域访问使能DRAE这是区域机制在中断上的体现。对于影子区域k的中断INTk除了需要IER使能还需要该中断对应的TCC码所关联的DMA通道位在EDMA_TPCC_DRAEM_k/DRAEHM_k寄存器中被使能设为1。公式解读以INT0为例INT0 (IPR[0] IER[0] DRAEM_0[0]) | (IPR[1] IER[1] DRAEM_0[1]) | ... | (IPRH[31] IERH[31] DRAEHM_0[31])这意味着Region 0的中断线INT0是否有效取决于所有64个可能的中断源TCC 0-63中是否有任何一个同时满足1) 挂起了IPR位12) 全局使能了IER位13) 在Region 0中被允许访问DRAE_0对应位1。一个至关重要的推论中断的归属不由触发该中断的DMA/QDMA通道的编号决定而是由该通道PaRAM Set中配置的TCC码决定并且该TCC码必须在目标区域的DRAE寄存器中被使能。避坑指南这是最容易出错的地方假设DMA通道0配置了TCC63并希望它的完成中断在Region 0中触发。那么你不仅需要在DRAEM_0/DRAEHM_0中使能位0对应通道0的访问权限还必须使能位63对应TCC63的中断生成权限。手册13.2.9.1.1节的NOTE部分特别强调了这一点。许多工程师只设置了通道权限忘了设置TCC权限导致中断永远无法产生。5.3 中断服务与清除流程当中断产生并进入CPU的ISR后标准的服务流程如下识别中断源读取EDMA_TPCC_IPR/IPRH寄存器判断是哪个TCC码导致的中断即哪个位被置1。执行服务操作根据TCC码执行相应的操作例如处理接收到的数据、准备下一批发送数据等。清除中断标志向EDMA_TPCC_ICR/ICRH寄存器的对应位写1以清除IPR/IPRH中的挂起位。注意必须通过写ICR来清除直接写IPR是无效的。处理潜在的重入中断这是一个精细活。手册提供了两种伪代码示例例13-2和13-3。方法一例13-2在清除当前中断位后再次读取IPR。如果不为0说明在ISR执行期间又有新的传输完成并设置了IPR位则需要循环处理。这确保了所有挂起中断都被服务但可能增加ISR延迟。方法二例13-3在ISR退出前读取IPR。如果为0直接退出。如果不为0说明还有未处理的中断可能是低优先级的此时写EDMA_TPCC_IEVAL寄存器的EVAL位为1。这个操作会强制EDMA重新评估所有已使能且仍处于挂起状态IPR1的中断并再次产生一个中断脉冲。这样CPU退出当前ISR后会立即再次进入ISR处理剩余的中断。这种方法延迟较低但需要正确使用IEVAL。5.4 中断评估寄存器IEVAL的作用EDMA_TPCC_IEVAL寄存器每个区域都有一个是处理上述“重入”场景和确保不丢失中断的关键。它的核心功能是当向IEVAL.EVAL位写1时如果此时IPR寄存器中仍有被IER使能的中断位为1则EDMA会立即产生一个该区域对应的中断脉冲。这在以下情况非常有用在ISR中采用上述方法二时用于触发处理剩余的中断。在软件中手动置位IPR来模拟一个中断事件时需要写IEVAL来真正触发中断信号。在某些调试或同步场景下需要强制产生中断。重要提醒操作影子区域的中断时务必使用该影子区域地址映射下的IEVAL寄存器例如Region 0 Base IEVAL offset而不是全局区域的IEVAL。因为影子区域的IEVAL是独立的且不受DRAE寄存器过滤影响。5.5 错误中断处理错误中断EDMA_TPCC_ERRINT的处理相对直接。当发生DMA/QDMA事件丢失、队列满等错误时相应的错误状态寄存器EMRQEMRCCERR的位会被置1并立即触发错误中断。错误中断没有像完成中断那样的多层次使能过滤。一旦错误发生中断即产生。因此良好的实践是始终使能错误中断并为其编写ISR。在错误ISR中你需要读取错误状态寄存器EMRQEMRCCERR确定错误类型。根据错误类型进行恢复操作例如重新使能丢失的事件检查队列配置等。关键一步在清除错误状态位后必须向EDMA_TPCC_EEVAL寄存器的EVAL位写1。这是为了复位错误中断的内部触发逻辑确保后续新的错误能再次触发中断。如果不写EEVAL即使清除了状态位也可能无法收到下一个错误中断。6. 通道链Chaining机制解析通道链Chaining是EDMA另一个强大的功能它允许一个通道的传输完成事件自动触发另一个通道开始传输。这与参数链接Linking不同链接是重新加载当前通道的参数而链是触发一个完全独立的通道。6.1 链触发原理在源通道假设为通道m的PaRAM Set的OPT字段中有两个关键位和一组字段用于控制链TCCHEN(位 22)最终传输完成链使能。当该通道最后一次传输请求提交或完成时触发链事件。ITCCHEN(位 23)中间传输完成链使能。当该通道**每一次除了最后一次**传输请求提交或完成时触发链事件。TCC(位 [17:12])这里存放的是目标通道号n。当链触发条件满足时EDMA会产生一个指向通道n的同步事件就像是一个硬件事件或软件写触发。6.2 链与中断的对比链和中断都发生在传输完成时但目的不同中断通知CPU传输已完成CPU可以介入处理。链通知另一个EDMA通道让它开始工作。这是纯硬件行为不涉及CPU延迟极低用于构建高效的、无CPU干预的数据处理流水线。例如你可以设置通道0完成数据采集后链式触发通道1进行数据预处理通道1完成后再链式触发通道2进行数据发送形成一个完整的、由硬件自动调度的数据处理链。6.3 配置示例与注意事项假设我们希望通道31三维传输ACNT3 BCNT4 CCNT5在每次中间传输完成即每个AB块传输完成时都触发通道30启动。配置通道31源通道的PaRAMOPT.TCC 30 (目标通道号)OPT.ITCCHEN 1 (使能中间传输完成链)OPT.TCCHEN 0 (禁用最终传输完成链也可都使能)设置好SRC DST ACNT3 BCNT4 CCNT5。配置通道30目标通道的PaRAM像配置普通DMA通道一样设置好通道30自己的传输参数。使能通道30的事件确保通道30的对应事件如果是DMA通道在事件使能寄存器EER中被使能或者如果通道30被配置为QDMA则其触发机制已就绪。根据手册表13-7在AB同步模式下通道31会产生BCNT * CCNT 4 * 5 20次传输请求TR。如果只使能ITCCHEN则前19次TR除最后一次都会触发链事件即触发19次通道30。如果同时使能TCCHEN则会触发20次。注意事项链触发本质上是在EDMA内部产生了一个事件。要确保目标通道此例中通道30没有被其他更高优先级的事件持续占用否则链触发的事件可能会被丢失。同时合理规划TCC码的使用避免链触发和中断使用的TCC码冲突。7. 常见问题与实战调试技巧在实际开发中围绕QDMA映射、区域和中断的问题层出不穷。下面是一些典型问题及排查思路。7.1 QDMA传输无法启动症状向触发字地址写数据后QDMA没有反应。排查清单检查PaRAM Set首先确认QCHMAPN_j寄存器指向的PaRAM Set是否已正确初始化OPT字段中的传输类型、地址等参数是否有效检查映射寄存器确认QCHMAPN_j寄存器的PAENTRY和TRWORD字段是否配置正确特别是TRWORD是否指向了一个有效的、可写的PaRAM字段如DSTSRC 而非OPT或保留字段检查触发操作你的“写触发”操作是否正确是向PaRAM Set基地址 PAENTRY*32 TRWORD*4的地址进行写操作吗写入的数据值本身不重要但写操作必须发生。检查区域访问如果你的软件运行在某个影子区域视图下确认QRAEN_k寄存器中是否使能了该QDMA通道在该区域下对QCHMAPN_j和PaRAM的写操作是否真的生效可以通过回读验证。检查事件队列QDMA触发的事件是否因为对应的事件队列满而被丢弃检查队列状态寄存器。7.2 区域隔离后中断不产生症状配置了区域DMA传输正常完成但预期区域的中断线没有触发。排查清单三重使能检查这是最高频的原因。务必按顺序检查IPR (源头)传输通道的PaRAM中OPT.TCINTEN或OPT.ITCINTEN是否使能OPT.TCC设置的值是多少假设为tcc_valIER (全局开关)全局中断使能寄存器IER/IERH的第tcc_val位是否置1DRAE (区域权限)目标影子区域k的DRAEM_k/DRAEHM_k寄存器中第tcc_val位是否置1记住这里使能的是TCC码对应的位不一定是通道号对应的位如果通道0使用TCC63则需要使能DRAE的位63。检查IPR状态在传输完成后直接读取全局的IPR/IPRH寄存器看第tcc_val位是否被置1。如果没置1问题出在传输配置或完成条件上。如果置1了但中断没来问题就是上述使能或区域过滤的问题。检查中断控制器EDMA的中断输出是否连接到了CPU的中断控制器INTC在INTC中对应的中断输入是否被使能和映射7.3 链触发不工作症状配置了通道链但源通道完成后目标通道没有启动。排查清单检查源通道配置源通道PaRAM的OPT.TCCHEN/ITCCHEN是否使能OPT.TCC字段设置的是否是目标通道号例如30检查目标通道状态目标通道是否已正确配置并使能对于DMA通道需在EER中使能对应事件对于QDMA需配置好映射目标通道是否正处于忙碌或禁用状态检查事件丢失链触发产生的是一个内部事件。如果目标通道的事件队列已满或者有更高优先级的事件持续占用该链事件可能会被丢弃。检查事件丢失寄存器EMR。理解同步类型链触发发生在“传输请求提交或完成”时具体取决于“提前完成”或“正常完成”模式。确认你的应用场景和理解一致。7.4 使用调试工具寄存器查看在调试器如CCS中实时监控关键寄存器是必须的。重点关注IPR/IER/ICREMR/QEMR/CCERR 以及你正在使用的通道和区域的DRAE/QRAE。事件跟踪一些高端的仿真器或芯片支持EDMA事件跟踪功能可以图形化看到事件产生、排队、处理的流水线对分析复杂链和性能瓶颈至关重要。内存查看直接查看PaRAM Set内存区域的内容确认其是否被正确初始化以及在传输过程中是否被意外修改例如被链接功能修改。深入理解EDMA的QDMA映射、区域管理和中断机制是从“能用”到“用好”EDMA的关键飞跃。这些特性为构建高效、可靠、安全的复杂嵌入式数据传输系统提供了坚实的基础。希望这篇结合手册原理与实战经验的解析能帮助你在下次面对EDMA挑战时更加游刃有余。记住多查手册勤看寄存器善用调试工具就没有调不通的DMA。