深入解析TI EDMA控制器:中断与PaRAM寄存器配置实战
1. 项目概述从CPU的“搬运工”到智能数据调度器在嵌入式系统开发尤其是涉及高速数据流处理的领域比如图像传感器数据采集、音频编解码或网络包转发我们常常会遇到一个核心矛盾CPU需要处理复杂的业务逻辑和算法但同时又被大量简单但耗时的数据搬运任务所拖累。想象一下你是一位忙碌的仓库管理员CPU既要规划库存、处理订单执行算法又要亲自把一箱箱货物从A区搬到B区数据搬运。后者虽然简单但极其消耗时间和体力导致你无法专注于更有价值的规划工作。直接内存访问DMA技术就是为了解决这个问题而生的它相当于为你雇佣了一位专职的“搬运工”。而德州仪器TI的增强型直接内存访问EDMA控制器则是一位高度专业化、可编程且极其高效的“智能搬运工”。它不仅仅是简单地搬运数据更能理解复杂的搬运指令集参数集PaRAM可以自主完成多维数据块的搬运例如搬运一个二维图像中的特定矩形区域并在任务完成后通过“举手”中断通知管理员。其核心的“大脑”和“指令手册”就是一系列精密的寄存器。理解这些寄存器就如同掌握了指挥这位智能搬运工的全部密码。本次我们将深入解析EDMA控制器中最为关键的两类寄存器中断控制寄存器与数据传输参数配置寄存器PaRAM通过实际配置案例让你彻底搞懂如何让EDMA精准、高效地为你工作。2. EDMA架构与寄存器地图总览在深入细节之前我们需要对EDMA的整体架构有一个俯瞰式的理解。TI的EDMA3控制器是一个高度模块化、可扩展的子系统其核心通常包含两个主要部分EDMA通道控制器EDMA_TPCC和EDMA传输控制器EDMA_TPTC。TPCC负责“调度”它管理着大量的传输请求由事件或手动触发维护着参数表PaRAM Set并将具体的传输描述符提交给TPTC。TPTC则负责“执行”它直接与系统总线交互执行实际的数据读写操作。我们本次聚焦的寄存器主要位于EDMA_TPCC模块中。这些寄存器可以大致分为三类全局控制与状态寄存器如PID外设识别、中断使能/状态寄存器等用于控制器的整体配置和状态监控。通道/事件相关寄存器如事件寄存器ER、事件使能寄存器EER、中断使能寄存器IER、中断挂起寄存器IPR等用于管理特定通道的事件触发和中断响应。参数集PaRAM寄存器这是EDMA的灵魂所在。每个通道或QDMA通道都关联着一组PaRAM寄存器共8个32位字构成一个PaRAM Set它完整地定义了一次传输的所有属性包括源/目标地址、数据维度、地址索引、链接地址等。我们输入材料中详细列出的OPT、SRC、DST、ABCNT、BIDX、LNK、CIDX、CCNT寄存器正是一个完整PaRAM Set的组成部分。寄存器寻址通常采用“基地址偏移量”的方式。例如对于一个PaRAM Set其起始地址可能是0x4000即PARAMSET的偏移量那么OPT寄存器就在0x4000SRC在0x4004DST在0x400C依此类推。理解这个映射关系对于编程配置至关重要。3. 中断控制机制深度解析中断是EDMA与CPU通信、实现异步操作的关键。EDMA的中断系统设计得非常精细允许开发者对每一次传输的完成或中间完成进行精确的通知和控制。3.1 中断的生命周期从触发到清除一个完整的中断流程通常涉及以下几个寄存器我们结合输入材料中的EDMA_TPCC_ICRH_RN和EDMA_TPCC_IEVAL_RN来理解中断触发与挂起当一次传输完成并且该通道的传输完成码TCC在OPT寄存器中被设置同时对应的中断使能位在IER寄存器中被置位EDMA控制器就会将中断挂起寄存器IPR中对应的TCC位例如TCC #32-#63对应IPRH置为1。这表示“有一个中断事件发生了正在等待处理”。中断评估与信号产生CPU会定期或通过轮询/中断方式检查IPR寄存器。当CPU检测到IPR中的某个位为1时就知道对应的传输已完成。此时EDMA控制器会向CPU发出一个硬件中断信号tpcc_intN。中断服务与清除CPU进入中断服务程序ISR后必须手动清除这个挂起的中断标志以防止同一中断被重复处理。这就是EDMA_TPCC_ICRH_RN中断清除寄存器-高部分的作用。如手册所述“CPU write of 1 to the ICRH.In bit causes the IPRH.In bit to be cleared.” 也就是说向ICRH寄存器的特定位写1会清除IPRH中对应的位。这里有一个关键细节手册强调“All IPRH.In bits must be cleared before additional interrupts will be asserted by CC.” 这意味着在IPRH中所有挂起的中断位被清除之前即使有新的传输完成控制器也不会为相同的TCC产生新的中断脉冲。这防止了中断丢失或混淆但要求ISR必须及时、正确地清除中断标志。强制中断评估EDMA_TPCC_IEVAL_RN中断评估寄存器提供了两种特殊操作SET位向SET位写1会强制产生一个tpcc_intN中断脉冲无论对应的中断是否使能IER或是否挂起IPR。这通常用于测试或软件触发中断场景。EVAL位向EVAL位写1会评估当前状态。如果有任何已使能IER置位且处于挂起状态IPR置位的中断则产生一个中断脉冲。这可以用于在特定时刻“刷新”或重新评估中断状态。3.2 中断控制寄存器实战配置假设我们使用TCC50对应中断#50来标志一次DMA传输完成并希望启用其中断。使能中断首先需要找到并设置中断使能寄存器高部分IERH的第18位I50因为50-3218对应IERH的bit 18。向该位写1使能TCC 50的中断。// 假设 IERH 寄存器地址为 0x01C0 0000 0x2044 volatile uint32_t *IERH (uint32_t*)(0x01C02044); *IERH | (1 18); // 使能 TCC 50 中断配置PaRAM中的TCC在对应通道的PaRAM Set的OPT寄存器中设置TCC字段为50二进制110010。// 假设 PaRAM Set 0 的 OPT 寄存器地址为 0x01C0 0000 0x4000 volatile uint32_t *OPT (uint32_t*)(0x01C04000); // 先清除原来的TCC位bit 17-12然后设置新的TCC值同时使能传输完成中断 *OPT (*OPT ~(0x3F 12)) | (50 12) | (1 20); // (120) 即设置 TCINTEN1编写中断服务程序ISR在ISR中首要任务是判断中断源并清除中断标志。void EDMA_ISR(void) { // 1. 读取中断挂起寄存器高部分IPRH判断是哪个TCC触发的中断 volatile uint32_t *IPRH (uint32_t*)(0x01C0203C); uint32_t pending *IPRH; if (pending (1 18)) { // 检查是否是TCC 50 // 2. 处理传输完成后的业务逻辑例如设置标志、处理数据等 g_transfer_complete true; // 3. 清除中断挂起标志这是关键步骤防止中断重入。 volatile uint32_t *ICRH (uint32_t*)(0x01C02074); // ICRH 偏移 0x2074 *ICRH (1 18); // 向 ICRH.I50 位写1清除 IPRH.I50 } // ... 处理其他TCC中断 } 注意清除断标志的操作是向ICRH的对应位写1而不是读-修改-写。直接写入一个仅在该位为1的值即可硬件会自动清除IPRH的对应位。同时确保在清除标志前已经完成了必要的状态读取或业务处理。3.3 中断相关常见问题与排查问题一中断始终无法触发。排查思路检查IER确认对应TCC的中断使能位是否已置1。检查OPT寄存器确认TCINTEN传输完成中断使能或ITCINTEN中间传输完成中断使能是否已使能且TCC字段设置正确。检查传输是否真正完成通过查询传输状态或相关事件标志确认DMA传输已成功执行完毕。检查全局中断使能确认CPU的全局中断以及EDMA控制器级的中断输出是否已使能。检查IPR状态在预期中断触发的时间点读取IPRH寄存器看对应位是否被置1。如果置1了但没进ISR问题可能在CPU中断控制器配置或中断向量表连接上。问题二中断只触发一次后续传输完成不再触发。根本原因这几乎都是因为没有在ISR中正确清除中断挂起标志IPR位。如前所述未清除的IPR位会阻塞新中断的生成。解决方案务必在ISR中在处理完必要逻辑后立即向对应的ICRH位写1以清除IPRH标志。同时检查是否有其他TCC共享同一中断线其IPR位未被清除导致整个中断线被阻塞。问题三中断处理函数中清除标志后立即又进入了中断。可能原因传输配置为“连续”或“Ping-Pong”模式且链接Linking或重载Reload机制设置不当导致前一次传输刚结束、标志刚清除链接的下一个参数集立即又启动了传输并迅速完成再次触发了中断。这需要检查PaRAM中的LINK字段和BCNTRLD/CCNT的更新逻辑。4. 数据传输参数集PaRAM全解与配置实战PaRAM是EDMA灵活性和强大功能的基石。它将一次复杂的数据传输抽象为一系列参数EDMA控制器根据这些参数自动计算地址、管理数据块。一个PaRAM Set包含8个32位寄存器我们逐一拆解。4.1 核心维度概念ACNT, BCNT, CCNTEDMA将一次传输组织成三个维度这使其能够高效处理多维数据如图像的行列、音频的帧采样。ACNT第一个维度数组内字节数ABCNT[15:0]。它定义了一个数组Array中有多少个连续字节。例如搬运一行图像像素每个像素2字节RGB565一行320像素则ACNT 320 * 2 640。关键点ACNT必须大于等于1才能提交传输请求TR。若为0则被视为空/伪传输但仍可能产生完成码取决于OPT设置。在WIMODE向后兼容模式下ACNT被解释为字Word数硬件会将其左移2位乘以4转换为字节数。BCNT第二个维度数组个数ABCNT[31:16]。它定义了一个帧Frame中包含多少个这样的数组。继续图像的例子一帧图像有240行那么BCNT 240。每次完成一个数组一行的传输源和目标地址会根据SBIDX和DBIDX进行偏移以指向下一行。BCNT的有效值是1-65535。BCNTRLD用于在A同步传输模式下当一帧传输完成后重载BCNT的值。CCNT第三个维度帧个数CCNT[15:0]。它定义了一个块Block中包含多少帧。例如要传输10张连续的图像则CCNT 10。当一帧传输完成即BCNT个数组都搬完地址会根据SCIDX和DCIDX进行偏移以指向下一帧的起始地址。CCNT的有效值也是1-65535。传输总量计算总传输字节数 ACNT * BCNT * CCNT。通过这三个参数EDMA可以轻松描述一个三维数据块。4.2 地址管理与索引SRC, DST, BIDX, CIDX地址管理决定了数据在内存中如何被读取和存放。SRC源起始地址和DST目标起始地址分别是32位的起始字节地址。SBIDX/DBIDX数组间索引BIDX[15:0]和BIDX[31:16]。它们是有符号16位整数。当一个数组ACNT个字节传输完成后EDMA会更新源和目标地址为下一个数组的传输做准备。SBIDX定义了从当前数组起始地址到下一个数组起始地址的字节偏移量。对于图像行传输SBIDX可能为0如果源数据是连续的而DBIDX则等于一行图像的字节宽度例如640以便将每一行数据连续存放。SCIDX/DCIDX帧间索引CIDX[15:0]和CIDX[31:16]。同样是有符号16位整数。当一帧BCNT个数组传输完成后EDMA会应用帧间索引。SCIDX定义了从当前帧的第一个数组的起始地址到下一帧的第一个数组的起始地址的字节偏移量。对于非连续存储的多帧数据这个值非常有用。地址更新示例假设传输一个240行BCNT、每行640字节ACNT的图像目标地址连续存放。初始DST 0x8000_0000。传输第1行后DST 0x8000_0000 640。这是由硬件自动完成的INCR模式。传输第1行后同时应用DBIDX。如果我们设置DBIDX 0因为目标连续则地址更新为0x8000_0000 640 0 0x8000_0280准备传输第2行。传输完整个一帧240行后应用DCIDX。如果下一帧紧挨着DCIDX 240 * 640 153600 (0x25800)。则新的DST用于下一帧的第一行变为0x8000_0000 0x25800。4.3 同步模式与地址模式SYNCDIM, SAM, DAM这两个设置决定了传输如何被触发以及地址在数组内如何变化。SYNCDIM传输同步维度位于OPT寄存器bit 2。0 (A-Sync)每次触发事件Event传输一个数组ACNT个字节。这是最常见的模式。控制器每收到一个事件如外设产生一个数据就绪信号就搬运ACNT个字节然后更新地址根据BIDX并递减BCNT。当BCNT减到0时表示一帧完成再递减CCNT并应用CIDX。适用于需要精细控制每个数据块的场景如ADC的逐个采样点传输。1 (AB-Sync)每次触发事件传输一整帧BCNT个数组即ACNT*BCNT字节。一个事件触发后EDMA控制器会一次性将整个帧所有行的数据搬运完毕。在这种模式下BCNT的值会直接提交给传输控制器TC由TC内部管理数组的循环。适用于需要批量传输、减少事件触发次数的场景如一次性搬运一整张图像。SAM/DAM源/目标地址模式位于OPT寄存器bit 0和bit 1。0 (INCR - 递增模式)在传输一个数组ACNT字节的过程中每传输一个元素如一个字节或字源或目标地址线性递增。这是最通用的模式。1 (FIFO模式)在传输一个数组的过程中地址在达到FWIDFIFO宽度OPT[10:8]指定的边界后回绕。这用于模拟或连接硬件FIFO。例如设置FWID2表示4字节即32位FIFOACNT16。那么传输时地址会在4字节边界内循环0, 4, 8, 12, 0, 4... 直到完成16字节传输。使用时必须确保SRC或DST地址按FWID对齐。4.4 接与重载LNK, BCNTRLD这是实现复杂、连续或循环传输的关键。LNK链接地址LNK[15:0]。当当前PaRAM Set定义的传输一个Block自然终止即ACNT, BCNT, CCNT均耗尽后EDMA控制器可以自动从LNK指定的地址加载一个新PaRAM Set到当前通道的参数集中从而实现传输链的自动接续。LINK值是一个字节地址偏移相对于PaRAM基地址。硬件会忽略其低5位强制对齐到32字节边界一个PaRAM Set的大小。如果LINK设置为0xFFFF则表示空链接NULL Link传输链终止并且当前PaRAM Set的所有内容除LINK字段被写为0xFFFF外会被清零。BCNTRLDBCNT重载值LNK[31:16]。这个字段仅用于A-Sync模式。在A-Sync模式下CC通道控制器内部维护着BCNT计数器每传输一个数组就减1。当BCNT减到0一帧完成时CC会递减CCNT并用BCNTRLD的值重新初始化BCNT计数器为传输下一帧做准备。这省去了在每帧传输完成后软件重新配置BCNT的麻烦。在AB-Sync模式下BCNT直接提交给TC因此BCNTRLD无效。4.5 OPT寄存器其他关键位TCINTEN / ITCINTEN传输完成/中间传输完成中断使能。置1后当传输完成或中间完成且TCC码匹配时才会在IPR中置位进而可能触发中断。TCCHEN / ITCCHEN传输完成/中间传输完成链接使能。置1后当传输完成或中间完成时会自动触发一次链接操作从LINK地址加载新参数无需等待整个Block自然结束。这可以实现“乒乓缓冲Ping-Pong Buffer”等高级操作。TCC传输完成码OPT[17:12]。一个6位的代码用于标识本次传输。当中断或链接发生时这个代码决定了影响IER/IPR或CER链接使能寄存器中的哪一位。它是连接传输事件与中断/链接响应的桥梁。STATIC静态条目。置1后该PaRAM Set在传输过程中不会被更新即使使能了链接。用于需要重复使用同一组参数的场景。5. 完整配置案例实现图像数据搬运与乒乓缓冲让我们通过一个实际案例将上述所有知识点串联起来。目标将摄像头采集的连续图像数据每帧240行x320列x2字节通过EDMA搬运到两个后备缓冲区Ping和Pong中每装满一个缓冲区就触发中断通知CPU处理同时EDMA自动切换到另一个缓冲区继续搬运实现无缝连续采集。5.1 硬件与参数定义摄像头接口产生VSYNC帧同步和HSYNC行同步信号。我们将HSYNC信号连接到EDMA的某个事件输入例如事件#10配置为A-Sync模式每行触发一次传输。图像参数分辨率320x240RGB565格式2字节/像素。ACNT 320 * 2 640(一行字节数)BCNT240(行数)CCNT1(我们先配置单帧通过链接实现多帧)内存布局源地址摄像头数据寄存器SRC 0x4800_0000目标缓冲区1 (Ping)DST_PING 0x8000_0000目标缓冲区2 (Pong)DST_PONG 0x8002_5800(偏移 240*640 0x25800)EDMA通道使用通道10对应事件#10。TCC与中断使用TCC50标志Ping缓冲区满TCC51标志Pong缓冲区满。分别使能其中断。5.2 PaRAM Set配置以Ping缓冲区参数集为例我们需要配置两个PaRAM SetSet_A对应Ping缓冲和Set_B对应Pong缓冲。它们通过LINK字段相互链接。假设Set_A位于PaRAM偏移0x1000Set_B位于0x1020。Set_A 配置 (Ping Buffer):// 偏移量基于 PaRAM 基地址 (例如 0x01C0 0000) #define PARAM_BASE 0x01C00000 #define PARAM_SET_A (PARAM_BASE 0x1000) #define PARAM_SET_B (PARAM_BASE 0x1020) volatile uint32_t *PaRAM_A (uint32_t*)PARAM_SET_A; // 1. OPT Register (Offset 0x0) // TCC50, 使能传输完成中断(TCINTEN)A-Sync模式目标地址递增 // 计算: (5012) | (120) | (02) | (01) | (00) // TCINTEN1, SYNCDIM0 (A-Sync), DAM0 (INCR), SAM0 (INCR) PaRAM_A[0] (50 12) | (1 20); // 2. SRC Register (Offset 0x4) - 摄像头数据寄存器地址 PaRAM_A[1] 0x48000000; // 3. ABCNT Register (Offset 0x8) // BCNT240 (0xF0) 在高16位 ACNT640 (0x280) 在低16位 PaRAM_A[2] (240 16) | 640; // 4. DST Register (Offset 0xC) - Ping缓冲区起始地址 PaRAM_A[3] 0x80000000; // 5. BIDX Register (Offset 0x10) // DBIDX: 目标行间偏移。由于目标连续存放偏移量为一行字节数 640 (0x280) // SBIDX: 源行间偏移。假设摄像头数据寄存器地址固定每行数据都从同一寄存器读取偏移为0。 PaRAM_A[4] (640 16) | 0; // 6. LINK Register (Offset 0x14) // BCNTRLD: 重载值下一帧还是240行。 // LINK: 链接到Set_B的地址偏移。Set_B相对于PaRAM基地址的偏移是0x1020。 // 注意硬件会忽略LINK的低5位所以写入0x1020或0x102F效果一样都会对齐到0x1020。 PaRAM_A[5] (240 16) | 0x1020; // BCNTRLD240, LINK0x1020 // 7. CIDX Register (Offset 0x18) // 帧间索引。由于我们使用链接切换缓冲区而不是用CCNT循环这里可以设为0。 // 但为了清晰可以设置DCIDX为两个缓冲区的间距虽然在本链接模式下CCNT1不会用到。 // SCIDX: 源地址帧间偏移为0。 // DCIDX: 目标地址帧间偏移 2 * 240 * 640 0x4B000 (仅作示意实际由链接实现切换) PaRAM_A[6] (0x4B000 16) | 0; // 高16位是DCIDX低16位是SCIDX // 8. CCNT Register (Offset 0x1C) // 我们配置为单帧触发一次链接/中断。CCNT1。 PaRAM_A[7] 1; // 高16位保留低16位CCNT1Set_B 配置 (Pong Buffer):Set_B的配置与Set_A几乎完全相同只有两个关键区别DST寄存器指向Pong缓冲区地址 (0x8002_5800)。LINK寄存器指回Set_A的地址偏移 (0x1000)形成环状链接。OPT寄存器中的TCC字段设置为51以便在Pong缓冲区满时触发不同的中断。volatile uint32_t *PaRAM_B (uint32_t*)PARAM_SET_B; memcpy((void*)PaRAM_B, (void*)PaRAM_A, 32); // 先复制Set_A的配置 PaRAM_B[3] 0x80025800; // 修改DST PaRAM_B[5] (240 16) | 0x1000; // 修改LINK指回Set_A PaRAM_B[0] (PaRAM_B[0] ~(0x3F 12)) | (51 12); // 修改TCC为515.3 初始化与启动流程初始化PaRAM如上所述配置好Set_A和Set_B。配置事件映射将硬件事件#10HSYNC映射到EDMA通道10。这通常通过事件寄存器ER和事件使能寄存器EER完成。// 假设 ER 和 EER 的地址 volatile uint32_t *ER (uint32_t*)(0x01C01000); volatile uint32_t *EER (uint32_t*)(0x01C01020); // 将事件10映射到通道10 (通常有专门的映射寄存器这里简化表示) // 并使能通道10的事件捕获 EER | (1 10);配置中断使能TCC 50和TCC 51对应的中断使能位在IERH或IERL中。在CPU的中断控制器中使能EDMA控制器的中断线。注册中断服务程序ISR。启动传输将Set_A的地址写入通道10的参数指针寄存器或者直接通过设置通道的PaRAM基地址寄存器来关联。然后使能通道如果通道默认是禁用的。当第一个HSYNC事件到来时传输自动开始。5.4 中断服务程序ISR实现volatile bool ping_buffer_ready false; volatile bool pong_buffer_ready false; void *current_buffer NULL; void EDMA_Completion_ISR(void) { volatile uint32_t *IPRH (uint32_t*)(0x01C0203C); volatile uint32_t *ICRH (uint32_t*)(0x01C02074); uint32_t pending *IPRH; if (pending (1 18)) { // TCC 50 (Ping Buffer Full) // 1. 处理Ping缓冲区数据 current_buffer (void*)0x80000000; ping_buffer_ready true; // 2. 清除中断标志 *ICRH (1 18); // 3. 可以通知任务或设置信号量来处理current_buffer } if (pending (1 19)) { // TCC 51 (Pong Buffer Full) // 1. 处理Pong缓冲区数据 current_buffer (void*)0x80025800; pong_buffer_ready true; // 2. 清除中断标志 *ICRH (1 19); // 3. 可以通知任务或设置信号量来处理current_buffer } // ... 其他必要的ISR收尾工作 }在这个流程中EDMA会在Ping和Pong缓冲区之间自动切换。CPU的ISR只需根据不同的TCC判断哪个缓冲区已满并进行处理实现了数据传输与处理的并行。6. QDMA队列DMA机制浅析除了基于事件的通道DMA输入材料中还提到了QDMA的相关寄存器QER,QEER,QEECR,QEESR,QSER,QSECR。QDMA提供了一种通过软件写特定内存地址来触发DMA传输的机制非常适合不规则或由软件逻辑发起的传输。工作原理每个QDMA通道关联一个特定的触发地址由QCHMAPn寄存器定义。当CPU向这个地址执行写操作时无论写入什么数据都会触发一次QDMA传输请求。相关寄存器QEER(QDMA Event Enable Register)使能或禁用特定QDMA通道的地址比较器。QER(QDMA Event Register)当向触发地址写入时对应通道的QER.En位被置位表示有一个QDMA事件待处理。QSER(QDMA Secondary Event Register)指示事件是否已在事件队列中。QEESR/QEECR用于设置和清除QEER的使能位。QSECR用于清除QER和QSER的状态位。使用场景当需要搬运的数据没有规律的外部硬件事件对应时例如将计算好的结果从内部SRAM搬移到外部存储器软件只需执行一条存储指令到特定地址即可触发传输极大简化了软件流程。7. 调试技巧与性能优化建议寄存器查看与验证在初始化EDMA后务必通过调试器或内存查看工具读取配置好的PaRAM Set内存区域逐字段核对OPT、SRC、DST、ABCNT、BIDX、LNK、CIDX、CCNT的值是否符合预期。一个常见的错误是字节序或位域设置错误。使用传输完成中断进行调试在初步调试时为每个重要的传输阶段如一个Block完成都启用中断并在ISR中设置断点或打印日志。这可以帮助你确认传输是否按预期的步骤执行以及链接是否正确跳转。性能优化点合理选择SYNCDIM对于大批量、连续的数据使用AB-Sync可以减少事件触发开销。对于小数据块或需要与慢速外设同步的场景使用A-Sync更合适。利用链接实现循环缓冲如上例的乒乓缓冲可以避免软件重新配置参数的开销实现零延迟的连续传输。对齐与突发传输确保源和目标地址与总线宽度对齐如32位、64位以便EDMA/TPTC能使用高效的突发Burst传输模式。FWID在FIFO模式下的正确设置也关乎性能。避免频繁启停对于连续数据流尽量配置好整个传输链使用CCNT和LINK让EDMA自动运行而不是由CPU频繁地启动单个传输。错误排查关注TPTC模块中的错误状态寄存器ERRSTAT。常见的错误包括地址对齐错误、总线错误、权限错误等。在ISR中也可以加入错误中断的处理逻辑以便及时发现问题。配置EDMA时务必清楚所访问内存区域的总线属性和权限设置。