文章目录
1 概述
对于不同型号的芯片,通道数如下:
1.1 总览
增强型直接内存访问(eDMA)控制器是第二代模块,能够执行复杂的数据传输,几乎无需主机处理器的干预。其硬件微架构包含以下组件:
- DMA 引擎,负责执行以下操作:
- 源地址与目标地址的计算
- 数据传输操作
- 本地内存,存储 16 个通道 各自的传输控制描述符(TCD)。
1.2 模块框图
1.3 模块部分
eDMA 模块由两个主要子模块构成:eDMA 引擎和传输控制描述符本地内存。详细信息参考用户手册 表18-2和18-3。
1.4 特性
eDMA 模块是一个高度可编程的数据传输引擎,经过优化以最大限度地减少主机处理器所需的干预。它适用于以下应用场景:事先静态地知道要传输的数据大小,并且数据大小并未定义在传输数据本身中。
- 所有数据移动均通过双地址传输完成:从源地址读取,写入目标地址。
• 可编程的源地址和目标地址以及传输大小
• 支持增强型寻址模式 - 16 通道实现以最小的主机处理器干预执行复杂的数据传输
• 内部数据缓冲区,用作临时存储以支持 16 字节和 32 字节的传输
• 连接到纵横开关(AXBS),用于总线主控数据移动 - TCD 支持两层深度的嵌套式传输操作
• 为每个通道在本地内存中存储的 32 字节 TCD
• 由较小字节传输计数定义的内部数据传输循环
• 由主要迭代计数定义的外部数据传输循环 - 通过以下三种方法之一激活通道:
• 显式软件启动
• 通过通道到通道的链接机制进行连续传输的启动
• 每个通道一个的外设驱动硬件请求 - 固定优先级和循环赛制通道仲裁
- 通过可编程中断请求进行通道完成通知
• 每个通道一个中断。当主要迭代计数完成时,eDMA 引擎可以产生一个中断
• 每个通道可编程的错误终止,并在逻辑上总和在一起,形成一个错误中断到中断控制器 - 对分散/聚集 DMA 处理的可编程支持
- 对复杂数据结构的支持
1.5 TCD结构
每个通道需要一个 32 字节的 TCD 来定义所需的数据移动操作。通道描述符按顺序存放在本地内存中:通道 0,通道 1,……通道 15。每个 TCDn 定义包括 11 个 16 位或 32 位的寄存器。在激活一个通道之前,必须使用适当的传输配置文件来初始化其 TCD。
2 功能描述
2.1 不同模式的操作
2.1.1 正常模式
在正常模式下,eDMA 将数据从源传输到目的地。源和目的地可以是能够与 eDMA 一起操作的内存块或 I/O 块。
一项服务请求会启动如 TCD 中所指定的特定字节数(NBYTES)的传输。
• 小循环是读取和写入操作的序列,用于为服务请求传输 NBYTES 的数据。
• 每个服务请求执行一次大循环的迭代,传输 NBYTES 的数据。
2.1.2 debug模式
DMA 操作在调试模式下可通过控制(CR)进行配置。
• 如果 CR[EDBG] = 0,当芯片处于调试模式时,eDMA 会继续正常运行。
• 如果 CR[EDBG] = 1,当芯片进入调试模式时,eDMA 会停止传输数据。如果当 eDMA 进入调试模式时某个通道处于活动状态,eDMA 会继续运行,直到该通道停止。
2.1.3 等待模式
在进入等待模式之前,eDMA 会尝试完成任何正在进行的传输。传输完成后,芯片进入等待模式。
2.2 DMA基本数据流
第1步:
此示例使用 eDMA 外设请求信号的置位来为通道 n 请求服务。通过软件和 TCDn_CSR[START] 位进行通道激活的过程与外设请求的基本流程相同。eDMA 请求输入信号在内部被寄存并路由到 eDMA 引擎:首先通过控制模块,然后进入程序模型和通道仲裁。在下一个周期中,通道仲裁执行,使用固定优先级或轮询算法。仲裁完成后,激活的通道号通过地址路径传送,并转换为访问本地内存以获取 TCDn 所需的地址。接下来,访问 TCD 内存,从本地内存中读取所需的描述符并加载到 eDMA 引擎的内部寄存器文件中。TCD 内存宽度为 64 位,以尽量减少获取激活通道描述符并将其加载到内部寄存器文件所需的时间。
第2部:
与数据传输相关的模块(地址路径、数据路径和控制)通过所需的源读取和目标写入操作顺序执行,以完成数据移动。源读取被启动,获取的数据会暂时存储在数据路径模块中,直到在目标写入期间被传送到内部总线。这种源读取/目标写入处理会持续进行,直到小循环字节计数传输完成。
在小循环字节计数传输完成后,基本数据流的最后一个阶段开始执行。在此阶段,地址路径逻辑会对相应 TCD 中的某些字段进行必要的更新,例如 SADDR(源地址)、DADDR(目标地址)和 CITER(当前迭代计数)。如果主循环迭代计数耗尽,则会执行额外的操作。这些操作包括最终的地址调整以及将 BITER(初始迭代计数)重新加载到 CITER 中。此时还可能会触发一个可选的中断请求,并且如果启用了分散/聚集模式,还会使用描述符中的分散/聚集地址指针从内存中获取新的 TCD。以下图表展示了对 TCD 内存的更新以及中断请求的触发过程。
2.3 错误报告与处理
通道错误会在错误状态寄存器(DMAx_ES)中报告,可能由以下原因引起:
- 配置错误,这是指传输控制描述符中的非法设置,或在固定仲裁模式下优先级寄存器的非法设置;或者
- 总线主控读或写周期发生终止错误。
当起始源地址或目标地址、源或目标偏移量、小循环字节计数或传输大小表示不一致的状态时,会报告配置错误。以下详细说明了每种可能的原因:
- 地址和偏移量必须对齐到 0 模传输大小的边界。
- 小循环字节计数必须是源和目标传输大小的倍数。
- 所有源读取和目标写入操作必须分别配置为所编程传输大小的自然对齐边界。
- 在固定仲裁模式下,任何两个通道优先级相等会引发配置错误。启用固定仲裁模式时,所有通道的优先级必须唯一。
注意:当两个通道具有相同优先级时,存在通道优先级错误,并在错误状态寄存器中进行报告。然而,错误状态寄存器中不会报告通道编号。当一个组内的所有通道优先级并非唯一时,通过仲裁选择的通道编号是不确定的。
为了协助进行通道优先级错误(CPE)调试,将 DMA 控制寄存器中的“错误时停止”位进行设置。如果一个组内的所有通道优先级并非唯一,在记录 CPE 错误后,DMA 会停止。DMA 保持停止状态,并且不会处理任何通道服务请求。在将所有通道优先级设置为唯一数字后,可以通过清除“停止”位来再次启用 DMA。
- 如果在通道完成时启用分散/聚集操作,若分散/聚集地址(DLAST_SGA)未在 32 字节边界上对齐,则会报告配置错误。
- 如果在通道完成时启用小循环通道链接,当尝试进行链接时,如果 TCDn_CITER[ELINK]位不等于 TCDn_BITER[ELINK]位,则会报告配置错误。
如果启用,除分散/聚集和小循环链接错误外的所有配置错误情况,都会在通道激活并断言错误中断请求时报告。当适当启用时,在主循环完成时开始分散/聚集操作时,会报告分散/聚集配置错误。在小循环完成时为链接操作提供服务时,会报告小循环通道链接配置错误。
如果系统总线读或写因错误而终止,则数据传输将停止,并设置相应的总线错误标志。在这种情况下,eDMA 引擎会使用故障点的当前源地址、目标地址和当前迭代计数来更新通道的传输控制描述符的状态。当发生系统总线错误时,通道会在下次传输后终止。由于流水线效应,当 eDMA 接收到总线错误时,下一次传输已经在进行中。如果在开始写序列之前的最后一次读操作中发生总线错误,则使用在总线错误期间捕获的数据执行写操作。如果在切换到下一个读序列之前的最后一次写操作中发生总线错误,则在读序列执行后,由于目标总线错误,通道才会终止。
通过软件将 CR[CX] 位设置,可以取消一次传输。当识别到取消传输请求时,DMA 引擎会停止处理该通道。当前的读写序列被允许完成。如果在主循环或小循环的最后一次读写序列中发生取消操作,该取消请求将被丢弃,并且该通道会正常退出。
错误取消传输与普通取消传输类似,但有以下区别:
- 错误状态寄存器(DMAx_ES)**会更新被取消的通道编号,并置位 ECX 标志位。
- 被取消通道的 传输控制描述符(TCD) 中会保存最后一次传输的源地址和目的地址。
- 注意:若需重新启动该通道,必须重新初始化 TCD,因为上述字段已不再代表原始参数。
- 当传输因错误取消机制终止时:
通道号会被写入 DMA_ES[ERRCHN] 字段。
ECX 和 VLD 标志位会被置位。 - 如果启用了错误中断,可能触发一次错误中断请求。
取消传输请求允许在不再需要完整数据传输时终止大规模数据传输。取消传输位不会中止通道,而是仅停止数据传输,随后通过其正常关闭流程退出通道。应用软件需负责管理取消操作后的上下文状态。若需要(或不需要)中断,应在发起取消请求前启用(或禁用)中断。由于传输未全部完成,应用软件必须清理传输控制描述符(TCD)。
当发生任何错误时,eDMA 引擎会立即停止对当前活动通道的正常处理(进入错误处理状态,且系统总线上的事务仍受流水线效应影响),并在 eDMA 错误寄存器中置位相应通道的错误标志位。同时,错误详情会被记录到 错误状态寄存器(DMAx_ES) 中。
2.4 通道抢占
启用方式:
通过设置 DCHPRIn[ECP] 寄存器位,可逐通道启用抢占功能。
工作原理:
抢占触发条件:
当高优先级通道请求服务时,当前执行通道的数据传输会被临时挂起,优先执行高优先级通道。
抢占流程:
高优先级通道执行:抢占通道完成其小循环数据传输。
恢复原通道:原被抢占的通道恢复执行。
再次抢占条件:恢复后的通道在完成一次读/写操作序列后,若仍有更高优先级通道请求服务,将再次被挂起。
限制与规则:
不支持嵌套抢占:
一旦抢占通道开始执行,其自身不可被更高优先级通道抢占。
仲裁模式依赖:
抢占功能仅在启用固定仲裁模式(Fixed Arbitration)时有效。
应用场景示例:
实时性优化:高优先级任务(如传感器数据采集)可抢占低优先级任务(如日志传输),确保关键数据实时性。
资源调度:通过优先级管理,平衡多通道数据传输的效率和响应速度。
开发者注意事项:
优先级配置:在固定仲裁模式下,需确保各通道优先级唯一且合理分配。
中断管理:抢占操作可能影响中断触发逻辑,需结合 TCDn_CSR[INT_MAJOR] 等中断配置位进行优化。
通过设置 DCHPRIn[DPA] 位,可以禁用某个通道抢占其他通道的能力。当某个通道的抢占能力被禁用时,无论较低优先级通道的 ECP(Enable Channel Preemption) 设置如何,该通道都无法挂起较低优先级通道的数据传输。