深入解析TMS320DM6431 EDMA3:通道同步事件与寄存器配置实战

发布时间:2026/7/26 11:23:31

深入解析TMS320DM6431 EDMA3:通道同步事件与寄存器配置实战 1. 项目概述与EDMA3核心价值如果你在嵌入式系统尤其是TI的C6000系列DSP平台上做过开发肯定对数据搬移的“痛”深有体会。CPU吭哧吭哧地处理核心算法还得时不时被外设数据收发这种“体力活”打断效率大打折扣实时性也难以保证。这时候一个强大且灵活的DMA控制器就成了提升系统性能的“胜负手”。在TMS320DM6431这款经典的数字媒体处理器上这个重任就落在了增强型直接内存访问EDMA3控制器的肩上。简单来说EDMA3就是一个高度专业化的“数据搬运工”。它的核心价值在于能够完全独立于CPU在外设如McASP、McBSP、UART与内存如片内L1/L2、外部DDR2之间或者内存与内存之间高效地搬运数据块。CPU只需要在初始化时告诉EDMA3“从A地址搬N个数据到B地址搬完告诉我一声”就可以潇洒地去处理其他任务了。这不仅极大减轻了CPU的中断负载更重要的是它通过并行化操作实现了计算与传输的重叠是挖掘DSP芯片并行处理能力、实现高吞吐量实时系统的关键技术。DM6431的EDMA3控制器功能相当强悍它支持多达64个可编程通道和8个QDMA快速DMA通道每个通道可以与一个特定的硬件同步事件比如McASP收到一帧数据、UART发送缓冲区空绑定。控制器内部还有复杂的参数RAMPaRAM、传输控制器TC和队列管理机制允许实现复杂的数据传输模式如乒乓缓冲、链式传输、三维传输等。今天我们就抛开枯燥的数据手册结合我这些年调试DM6431的实际经验深入它的“五脏六腑”把通道同步事件和寄存器配置这两大核心机制彻底讲透让你在项目中能真正用起来、用得好。2. EDMA3架构与通道同步事件深度解析2.1 EDMA3整体架构与工作流程在深入寄存器之前我们必须先建立起对EDMA3控制器整体架构的认知。你可以把它想象成一个高度组织化的物流中心。这个中心有三大核心部门通道控制器Channel Controller, CC这是物流中心的“调度前台”。它负责接收来自64个通道的“搬运请求”即同步事件并对这些请求进行优先级排序和队列管理。它维护着所有通道的使能、状态、中断等全局信息是我们通过软件进行配置和交互的主要接口。CC内部有事件寄存器ER、事件使能寄存器EER、中断寄存器等我们后面会详细拆解。参数RAMParameter RAM, PaRAM这是物流中心的“任务单仓库”。每一个EDMA通道或QDMA都对应一个参数集Parameter Set总共128组。每个参数集包含8个32位字详细定义了单次传输的所有细节源地址、目的地址、传输数量三维的A/B/C计数、地址索引步长、链接地址用于链式传输等。当通道事件被触发时CC并不是直接执行而是根据通道号找到对应的参数集将其内容提交给传输控制器。这种设计将传输的“控制信息”与“执行逻辑”分离使得在传输过程中可以动态修改或链接到新的参数集实现极其灵活的数据流控制。传输控制器Transfer Controller, TC这是物流中心的“装卸搬运工”。DM6431通常有多个TC例如TC0, TC1, TC2它们从CC的队列中领取“任务单”参数集并实际执行内存的读写操作。TC负责与内存控制器、外设总线接口完成具体的数据搬移。多个TC可以并行工作处理不同队列的任务这是实现高带宽的关键。工作流程简化版外设产生一个事件如McASP接收数据就绪→ 该事件触发对应的EDMA通道 → CC检查该通道是否使能若使能则将该通道号放入指定的硬件队列 → TC空闲时从队列中取出任务根据该通道对应的PaRAM参数集执行数据传输 → 传输完成后可选地触发完成中断或链接触发另一个通道。2.2 通道同步事件硬件触发的奥秘EDMA传输的启动方式主要有两种手动触发CPU写ESR寄存器和事件触发。在实时流处理系统中事件触发是绝对的主流因为它实现了数据流与DMA操作的硬同步。根据你提供的资料DM6431的64个EDMA通道中很多都与特定的外设事件固定绑定。这份映射表是硬件设计时确定的软件无法更改。理解这张表是配置EDMA的第一步。我们挑几个最常用的来重点解读通道2 (XEVT0) / 通道3 (REVT0)分别对应McBSP0的发送事件和接收事件。当McBSP的发送移位寄存器空或DXR到XSR的拷贝完成时会触发XEVT0EDMA可以借此将下一批待发送的数据从内存搬移到McBSP的数据发送寄存器DXR。反之当McBSP接收到一个完整的数据并存入接收缓冲寄存器RBR时触发REVT0通知EDMA将数据从DRR搬走。这是实现音频编解码器连续数据流的基础。通道10-15 (AXEVTE0, AXEVTO0, AXEVT0, AREVTE0, AREVTO0, AREVT0)这一组都与McASP0相关。McASP是TI为音频应用设计的多通道音频串口功能比McBSP更强大。它的触发事件分为发送偶数槽AXEVTE0、发送奇数槽AXEVTO0、发送所有槽AXEVT0接收同理。这种设计允许针对立体声的左右声道进行更精细的DMA控制。在实际配置多声道、TDM格式音频时必须清楚你使用的是哪个事件。通道22 (URXEVT0) / 通道23 (UTXEVT0)对应UART0的接收和发送事件。用于实现串口数据的DMA收发避免每个字节都产生CPU中断。通道32-39 (GPINT0-GPINT7)GPIO中断事件。可以将外部引脚的电平变化或边沿作为DMA触发源。我曾用它来触发从外部ADC读取数据块实现了精确的硬件定时采样。通道52-54 (PWM0-PWM2)PWM事件。可以用PWM的周期匹配或占空比匹配事件来触发DMA实现波形表播放等应用。重要提示表中大量的“Reserved”通道并非无用。手册脚注(1)明确指出“除了表中所示事件64个通道中的每一个还可以与传输完成事件或交替传输完成事件同步。” 这意味着链式传输Chaining是EDMA3的高级玩法。你可以配置一个通道例如通道2由McBSP发送触发在传输完成后自动触发另一个通道例如一个保留通道开始下一次传输。通过精心设计参数集和链接地址可以实现复杂的、无需CPU干预的多段数据传输流水线。2.3 事件处理机制与寄存器初窥一个事件产生后是如何被EDMA3识别并处理的呢这涉及到几个核心的状态寄存器我们提前了解一下事件寄存器ER, ERH这是一个64位的只读寄存器ER是低32位ERH是高32位。每一位对应一个EDMA通道。当某个通道的硬件同步事件发生时无论该通道是否被使能对应的位都会被硬件置为1。你可以把它看作一个“事件发生记录本”。事件使能寄存器EER, EERH这是一个64位的读写寄存器。只有某一位被软件设置为1对应通道的事件才会被EDMA控制器“认领”并进入后续处理流程排队、传输。如果事件使能位为0即使ER中记录了事件也不会触发DMA。这给了软件一个“开关”。事件清除寄存器ECR, ECRH向该寄存器的某位写1可以清除ER中对应的位。通常在一次事件被成功处理即放入队列后由硬件自动清除但软件也可以手动干预。流程是这样的外设事件发生 → ER对应位置1 → 若EER对应位为1则事件有效CC根据通道的队列映射将该通道号放入对应的传输队列Queue→ 硬件或软件清除ER中的该事件标志。3. 核心寄存器详解与实战配置指南手册里的寄存器列表看起来令人望而生畏但实际开发中我们并不需要记住每一个。关键在于理解其分类和核心功能。我将它们分为几大类并结合代码片段讲解如何配置。3.1 全局控制与状态寄存器这类寄存器负责整个EDMA3控制器的全局设置和状态查看。CCCFG (0x01C0 0004) - EDMA3CC配置寄存器通常使用默认值即可它包含一些全局性配置如传输地址对齐模式等。DMAQNUM0-DMAQNUM7 (0x01C0 0240-0x01C0 025C)这是关键配置之一这8个寄存器决定了64个EDMA通道分别被分配到哪个传输队列Queue 0, 1, 2。DM6431的EDMA3通常有3个传输队列Q0, Q1, Q2每个队列由一个独立的TC服务。你可以根据通道的实时性要求将它们分配到不同优先级的队列。例如将音频McASP的接收通道高实时性分配到高优先级队列将后台内存拷贝通道分配到低优先级队列。每个寄存器控制8个通道例如DMAQNUM0的[2:0]位定义通道0的队列号[5:3]位定义通道1的队列号以此类推。QUEPRI (0x01C0 0284) - 队列优先级寄存器设置各个传输队列之间的优先级。优先级高的队列中的传输请求会被TC优先处理。EMR/EMRH, EMCR/EMCRH (0x01C0 0300-0x01C0 030C)事件丢失寄存器及其清除寄存器。如果一个通道的事件发生时该通道之前的事件还未被处理例如队列满则会发生事件丢失对应位会被置1。在调试DMA不触发的问题时一定要检查这个寄存器看是不是因为事件产生太快导致丢失。CCSTAT (0x01C0 0640) - EDMA3CC状态寄存器可以查看各个传输队列的当前状态如是否有待处理任务。3.2 通道控制寄存器组影子区域这是配置每个通道行为的核心区域。手册中列出了“Global Channel Registers”和“Shadow Region 0/1 Channel Registers”。这是什么意思这是一种硬件上下文保存/恢复机制主要用于支持操作系统的任务切换。不同优先级的中断服务程序ISR或不同的任务可能需要对同一组EDMA控制寄存器如EER、IER进行不同的配置。通过切换“影子区域”可以快速地将一整组寄存器值换入换出而无需逐个保存恢复。Global Region (0x01C0 1000 开始)这是默认生效的寄存器组。Shadow Region 0/1 (0x01C0 2000 / 0x01C0 2200 开始)这是两个影子区域它们的寄存器布局与Global Region完全一样。通过配置DRAE/DRAEH区域访问使能寄存器你可以控制当前CPU访问的是哪个区域。在简单的单任务嵌入式系统中我们通常只使用Global Region就足够了。我们聚焦Global Region的几个最关键寄存器EER/EERH (0x01C0 1020/0x01C0 1024) - 事件使能寄存器使能某个通道的事件触发功能必须设置。// 例如使能通道2 (McBSP0发送) 和通道3 (McBSP0接收) // 假设寄存器地址已宏定义 volatile unsigned int *EER (unsigned int *)0x01C01020; volatile unsigned int *EERH (unsigned int *)0x01C01024; *EER | (1 2); // 使能通道2 *EER | (1 3); // 使能通道3 // 注意通道32-63的使能位在EERH中需要类似操作IER/IERH (0x01C0 1050/0x01C0 1054) - 中断使能寄存器使能某个通道传输完成时产生中断。当一次传输可能是三维传输的一个一维数组完成后如果IER中对应位被置1则会向CPU发出中断。这对于需要CPU进行后续处理如处理完一批数据后重新提交参数集的场景至关重要。// 使能通道2的传输完成中断 volatile unsigned int *IER (unsigned int *)0x01C01050; *IER | (1 2);IPR/IPRH (0x01C0 1068/0x01C0 106C) - 中断挂起寄存器只读当某个通道的传输完成中断发生时对应位被硬件置1。CPU在中断服务程序ISR中需要读取此寄存器来判断是哪个通道产生的中断。ICR/ICRH (0x01C0 1070/0x01C0 1074) - 中断清除寄存器在中断服务程序ISR中必须向该寄存器的对应位写1以清除IPR中的中断标志位。否则中断会持续触发。// 在通道2的中断服务程序中 void EDMA_ISR(void) { if (*IPR (1 2)) { // 判断是否是通道2中断 // ... 处理传输完成后的工作例如重新填充缓冲区 ... *ICR (1 2); // 关键清除中断标志 } }3.3 参数RAMPaRAM配置详解这是EDMA3的精华所在也是配置中最复杂的一环。每个参数集有8个32位字位于0x01C0 4000开始的地址空间。每个字的功能如下表所示偏移地址 (相对)缩写参数名称功能描述与配置要点0x00OPT选项参数这是最重要的寄存器它定义了传输的“根本大法”•传输类型是A同步每触发一次搬一个A计数单元还是AB同步每触发一次搬一个二维数组•寻址模式源和目的是递增、递减还是固定地址DM6431通常只支持递增模式。•中断使能本次传输完成后是否产生中断与IER配合。•链接触发本次传输完成后是否触发另一个通道通过TCC代码指定。•其他如优先级、状态更新等。0x04SRC源地址数据传输的起始地址。可以是内存地址也可以是外设数据寄存器的地址如McBSP的DRR。0x08A_B_CNTA计数 B计数这是一个32位组合值。•低16位 (ACNT)一维传输单元的大小字节数。例如一次传输一个16位的音频样本ACNT2传输一个32位整数ACNT4。•高16位 (BCNT)二维数组中一维传输单元的个数。例如你要传输一个100个样本的音频帧每个样本16位则ACNT2BCNT100。0x0CDST目的地址数据传输的目标地址。0x10SRC_DST_BIDX源B索引 目的B索引这也是一个组合值。•低16位 (SRC_BIDX)当完成一个ACNT单元的传输后源地址的跳跃步长字节。通常用于二维数组的行间跳跃。•高16位 (DST_BIDX)当完成一个ACNT单元的传输后目的地址的跳跃步长字节。0x14LINK_BCNTRLD链接地址 B计数重载实现链式传输和循环缓冲的关键•低16位 (BCNTRLD)当BCNT减到0时即完成一个二维数组BCNT重新装载的值。通常等于初始的BCNT用于实现循环。•高16位 (LINK)链接地址。当本次传输全部完成即CCNT也减到0见下文后EDMA3会自动从这个地址加载一个新的参数集到当前通道。这可以实现无限长的数据传输链。如果设为0xFFFF则表示不链接。0x18SRC_DST_CIDX源C索引 目的C索引用于三维传输。•低16位 (SRC_CIDX)当完成一个BCNT循环即一个二维数组后源地址的跳跃步长。•高16位 (DST_CIDX)当完成一个BCNT循环后目的地址的跳跃步长。0x1CCCNTC计数三维传输中二维数组的个数。当CCNT减到0才算一次完整的传输完成才会触发中断或链接触发。配置实例实现McBSP0接收数据的双缓冲Ping-Pong Buffer这是音频处理中最经典的场景。我们需要在后台用DMA将McBSP接收的数据交替存放到两个缓冲区中当其中一个缓冲区满时通知CPU处理同时DMA继续向另一个缓冲区填充数据。定义缓冲区#define BUFFER_SIZE 256 // 每个缓冲区256个16位样本 short pingBuffer[BUFFER_SIZE]; short pongBuffer[BUFFER_SIZE];准备两个参数集假设使用通道3对应REVT0参数集索引为3和4// 计算参数集基地址0x01C04000 参数集索引 * 0x20 (32字节) volatile unsigned int *paramSet3 (unsigned int *)0x01C04060; // 索引3 volatile unsigned int *paramSet4 (unsigned int *)0x01C04080; // 索引4 // 参数集 3: 从 McBSP0 DRR 搬到 pingBuffer paramSet3[0] 0x00000000; // OPT: 基本配置A同步递增寻址完成后中断 // 实际需要根据手册详细设置OPT的每一位例如TCC代码中断通道号 paramSet3[1] (unsigned int)0x01C20000; // SRC: McBSP0数据接收寄存器地址假设 paramSet3[2] (2 16) | BUFFER_SIZE; // A_B_CNT: ACNT2字节(16位), BCNTBUFFER_SIZE paramSet3[3] (unsigned int)pingBuffer; // DST: pingBuffer地址 paramSet3[4] (0 16) | 0; // SRC_DST_BIDX: 源地址固定外设寄存器目的地址连续递增 paramSet3[5] (0x01C04080 16) | BUFFER_SIZE; // LINK_BCNTRLD: 链接到参数集4 BCNTRLDBUFFER_SIZE paramSet3[6] 0; // SRC_DST_CIDX: 不使用三维 paramSet3[7] 1; // CCNT: 只传输1个二维数组即一帧 // 参数集 4: 从 McBSP0 DRR 搬到 pongBuffer (与参数集3对称) paramSet4[0] 0x00000000; // OPT: 注意TCC代码要设置正确以区分中断 paramSet4[1] (unsigned int)0x01C20000; // SRC paramSet4[2] (2 16) | BUFFER_SIZE; // A_B_CNT paramSet4[3] (unsigned int)pongBuffer; // DST paramSet4[4] (0 16) | 0; // SRC_DST_BIDX paramSet4[5] (0x01C04060 16) | BUFFER_SIZE; // LINK_BCNTRLD: 链接回参数集3 paramSet4[6] 0; paramSet4[7] 1;初始化EDMA通道// 1. 将通道3映射到某个传输队列例如队列0 volatile unsigned int *DMAQNUM0 (unsigned int *)0x01C00240; // 通道3对应DMAQNUM0寄存器的[11:9]位设为0表示队列0 *DMAQNUM0 ~(0x7 9); // 先清零 *DMAQNUM0 | (0x0 9); // 设为队列0 // 2. 将通道3的参数集指针指向参数集3 // 对于EDMA通道参数集索引通常等于通道号但可以通过QCHMAP寄存器配置QDMA。 // 这里假设通道3固定使用参数集3。 // 3. 使能通道3的事件和中断 volatile unsigned int *EER (unsigned int *)0x01C01020; volatile unsigned int *IER (unsigned int *)0x01C01050; *EER | (1 3); *IER | (1 3); // 使能通道3完成中断 // 4. 可选手动触发一次启动链式循环。也可以等待第一个硬件事件触发。 volatile unsigned int *ESR (unsigned int *)0x01C01010; *ESR (1 3);中断服务程序void EDMA_ISR(void) { volatile unsigned int *IPR (unsigned int *)0x01C01068; volatile unsigned int *ICR (unsigned int *)0x01C01070; if (*IPR (1 3)) { // 检查通道3中断 // 判断当前是pingBuffer满还是pongBuffer满 // 可以通过检查参数集当前链接状态或者设置一个软件标志位来跟踪。 // 假设我们用一个变量currentBuffer来跟踪 if (currentBuffer PING) { processAudioData(pingBuffer, BUFFER_SIZE); currentBuffer PONG; } else { processAudioData(pongBuffer, BUFFER_SIZE); currentBuffer PING; } *ICR (1 3); // 清除中断标志 } }通过这样的配置一旦McBSP0开始接收数据EDMA3就会自动在ping和pong缓冲区之间切换搬运数据并在每次搬满一个缓冲区后产生中断通知CPU。CPU处理数据的同时EDMA继续向另一个缓冲区填充实现了高效的无缝数据处理。4. 传输控制器TC寄存器与高级功能TC寄存器地址从0x01C1 0000开始通常不需要开发者直接配置它们由EDMA3的CC模块在内部管理。但在进行深度性能优化或调试复杂传输错误时了解它们很有帮助。TCSTAT (0x01C1 0100 等)传输控制器状态寄存器可以查看TC当前是否忙碌正在处理哪个通道的请求。SAOPT/SASRC/SACNT/SADST (0x01C1 0240 开始)源活动寄存器组。当TC从队列中取出一个传输请求并开始执行时它会将对应的PaRAM参数集加载到这一组“活动寄存器”中。你可以通过读取这些寄存器来了解TC当前正在执行的具体传输细节对于调试动态数据传输问题非常有用。DFOPT0-3/DFSRC0-3... (0x01C1 0300 开始)目的FIFO寄存器组。EDMA3 TC内部有一个FIFO用于缓存从源地址读取的数据然后再写入目的地址。这组寄存器反映了FIFO中当前挂起的传输请求状态。在配置多个连续的小规模传输时TC可能会将它们聚合在FIFO中以提高效率。高级功能提示QDMA除了标准的64个事件触发的EDMA通道DM6431的EDMA3还提供了8个QDMA通道。QDMA的触发方式不同它不是由硬件事件触发而是由CPU对特定触发字的写操作来触发。这为需要软件灵活发起DMA传输的场景提供了便利而且QDMA的启动延迟通常比写ESR寄存器手动触发EDMA更小。它的参数集映射通过QCHMAP0-7寄存器来配置。5. 实战避坑指南与常见问题排查纸上得来终觉浅绝知此事要躬行。下面是我在多年项目中总结的几个关键陷阱和排查方法。5.1 配置顺序陷阱问题配置完PaRAM和通道寄存器后DMA就是不触发。根因与解决EDMA3的初始化需要遵循一个严格的顺序否则配置可能不生效。先禁止后配置在修改任何通道参数尤其是PaRAM之前务必先清除EER中对应通道的使能位。在活跃状态下修改PaRAM可能导致不可预知的行为。配置PaRAM填写完整的参数集包括OPT、地址、计数、索引和链接地址。配置通道关联对于QDMA设置QCHMAP对于EDMA确认通道到队列的映射DMAQNUMx。清除残留事件/中断在使能前先向ECR和ICR的对应位写1清除任何可能遗留的旧事件或中断标志。最后使能设置EER和IER使能事件和中断。触发启动如果是手动启动写ESR如果是事件触发确保外设已开始产生事件。5.2 内存对齐与地址错误问题DMA传输导致数据错误或系统进入异常。根因与解决地址对齐确保源地址和目的地址符合EDMA3和总线架构的对齐要求。例如许多DSP的EDMA要求地址按字4字节或至少按半字2字节对齐。访问未对齐的地址可能引发总线错误。地址有效性确保你配置的源/目的地址是物理上可访问的。试图从保留的或未映射的内存区域进行DMA会导致错误。使用CCERR寄存器可以帮助诊断此类错误。使用正确的地址外设数据寄存器的地址一定要查数据手册。例如McBSP的数据接收寄存器DRR和数据发送寄存器DXR地址是不同的且可能有多个如DRR1, DRR2。配置错了地址DMA就会读写到错误的地方。5.3 中断丢失与事件覆盖问题数据流不稳定偶尔丢失数据包。根因与解决检查EMR事件丢失寄存器这是第一站。如果EMR中对应通道位被置1说明有事件在CC处理之前就发生了上一个事件还没入队新事件就来了。这通常是因为CPU处理中断太慢或者DMA传输本身太耗时导致队列堵塞。解决方法优化中断服务程序减少处理时间或者检查PaRAM中的传输数据量ACNTBCNTCCNT是否过大导致单次传输时间过长可以考虑拆分成多次小传输并用链式连接。中断服务程序ISR未及时清除中断标志这是最常见的原因之一。必须在ISR中尽早读取IPR判断中断源并立即向ICR写1清除对应位。如果清除操作太晚或者遗漏了会导致中断持续触发CPU可能陷入中断风暴无法处理后续的数据。中断使能IER与事件使能EER混淆EER1是允许硬件事件触发DMA传输。IER1是允许该通道传输完成时产生中断。如果你需要传输完成通知两者都需要开启。5.4 链式传输与参数重载的微妙之处问题链式传输工作了几次后就停止了。根因与解决链接地址错误LINK字段必须是参数集在PaRAM中的地址如0x01C04060而不是你想要链接的数据缓冲区地址。这是一个非常容易犯的低级错误。OPT中的TCC代码在链式传输中OPT寄存器中的TCC传输完成代码字段有双重作用。在正常完成中断模式下它指定中断号通常等于通道号。在链式触发模式下它指定要触发的目标通道号。你需要根据OPT中的TCCHEN链式使能等位来正确设置TCC值。务必仔细阅读手册中关于OPT寄存器每一位的定义。BCNTRLD的作用在三维传输A/B/C同步中BCNTRLD用于在每次C索引跳跃后重新加载BCNT的值。如果你只进行二维传输AB同步但希望实现循环缓冲也需要正确设置BCNTRLD使其等于初始的BCNT值这样在每次二维数组传输完成后BCNT会自动恢复为下一次传输做好准备。5.5 调试技巧寄存器查看与状态跟踪当DMA行为异常时不要盲目猜测要学会使用调试器或通过内存映射查看关键寄存器查看ER/EER确认事件是否真的发生了ER1以及通道是否使能EER1。查看IPR确认传输完成中断是否产生。查看CCSTAT和TCSTAT查看传输队列和传输控制器是否忙碌是否有待处理请求。查看PaRAM内容在调试器中直接查看你配置的参数集内存区域确认所有字段的值是否符合预期特别是链接地址和计数。使用EDMA3的仿真模式一些高端的仿真器支持EDMA3活动跟踪可以图形化地看到事件触发、队列状态、传输过程是解决复杂问题的终极利器。最后再强调一个心得理解EDMA3的“三维传输”模型ACNT, BCNT, CCNT是掌握其强大功能的关键。不要只把它看作一个简单的一维搬运工。通过灵活组合A/B/C计数和SRC/DST BIDX/CIDX你可以轻松地实现图像的行列传输、矩阵的转置、复杂数据结构的重组等高级操作这才是EDMA3真正发挥威力、让CPU从繁琐数据搬运中彻底解放出来的地方。

相关新闻