简介:本文面向嵌入式 DSP 开发者,围绕 C2000 系列 DMA 在数据搬运中的核心概念展开,重点厘清触发源、源地址、目的地址以及 Burst 与 Transfer 的层级关系。通过配置流程拆解与实践建议,帮助读者避免“触发源等于数据源”的常见误区,掌握 SysConfig 下稳定、可维护的 DMA 配置方法。
在 C2000 系列处理器的外设数据采集中,DMA 是降低 CPU 负载、提升实时性的关键模块。无论是 ADC 连续采样、ePWM 同步触发,还是 SPI、FSI 等高速接口的数据收发,DMA 都能在后台完成数据搬运,让 CPU 将更多时间用于算法执行与系统控制。
然而,DMA 配置中真正容易出错的往往不是寄存器本身,而是对“触发源、源地址、目的地址以及搬运粒度”这几个概念的理解。一旦理解偏差,就会出现数据错位、覆盖、漏采或中断不触发等问题。本文将围绕这些核心概念,结合 SysConfig 的参数结构,对 DMA 配置流程进行说明与扩展。
在 C2000 平台中,DMA 的核心任务是:在某个事件发生时,将一块数据从源地址搬运到目的地址。这个任务可以用三个问题来描述:
这三个问题分别对应 DMA 配置中的 Trigger Source、Source Address 与 Destination Address。它们彼此独立,不能混为一谈。
一个常见误区是:选择了某个外设事件作为触发源,就认为 DMA 会自动读取该外设的数据寄存器。例如,当触发源设置为 ADCA1 时,它只表示“ADCA1 转换完成事件可以启动 DMA 搬运”。真正读取的数据源仍需要通过 Source Address 显式指定,例如将地址指向 ADC 的结果寄存器 ADCRESULT0。
如果触发源配置为 ADC,但源地址仍然指向一个无关的 RAM 数组或上一个外设地址,DMA 依然会从该地址读取数据。这种错误在初始调试阶段可能表现为“数据永远是相同的值”或“数据与采样值明显不一致”。
因此,在配置 DMA 时,建议始终将触发源、源地址、目的地址三项分开确认,避免因习惯性联想导致配置错误。
DMA 的搬运结构可以拆解为三个层级。理解这三个层级,有助于准确计算总数据量并规划地址步进方式。
Word 是 DMA 每次在总线上操作的最小数据单元。其位宽在不同 C2000 型号中可能是 16 位或 32 位,具体取决于器件配置与寄存器定义。配置时应明确当前 Word 是寄存器宽度还是数据元素宽度,因为它直接影响地址偏移和突发长度。
一个 Burst 由多个 Word 组成,表示 DMA 在一次连续操作中搬运的多个最小单元。Burst Size 可以为 1、2、4、8 或更多,具体受硬件限制。例如,Burst Size 为 4 时,DMA 一次触发后连续搬运 4 个 Word。
在 ADC 多通道采样场景中,Burst Size 可以对应一次采样序列中的多个结果寄存器,从而实现多通道数据的连续搬出。
Transfer 是 DMA 的上层任务单位,由一个或多个 Burst 组成。Transfer Size 表示任务中包含多少个 Burst。一个完整传输的总搬运量可以通过下式计算:
总搬运量 = Burst Size × Transfer Size
例如,Burst Size = 4,Transfer Size = 1,表示一次 Transfer 包含 1 个 Burst,每个 Burst 搬运 4 个 Word,总搬运量为 4 个 Word。
如果 Transfer Size = 3,Burst Size = 4,则总搬运量为 12 个 Word。此时地址步进方式的选择将变得重要,尤其当源地址或目的地址是外设 FIFO、结果寄存器数组或循环缓冲区时,需要确认地址是否递增、递增步长是多少。
将搬运结构分层的意义在于,它可以灵活适配不同的外设数据格式。例如:
在实际工程中,应根据外设数据产生方式和缓冲区结构,合理设置 Burst 与 Transfer,而不是仅依赖默认值。
SysConfig 提供了一套结构化的 DMA 配置界面,参数顺序本质上对应了从“任务识别”到“触发条件”再到“中断处理”的完整流程。下面以常见的 DMA 配置项为顺序,逐项说明其作用与注意事项。
Name 用于在工程中标识一个 DMA 实例,例如命名为 myDMA0。它不直接影响硬件行为,但清晰的命名有助于在多个 DMA 通道同时使用时快速区分通道功能。建议将数据方向、外设名称或功能写入命名中,例如 adcDmaCh1、spiTxDma 等。
DMA Channel 决定该实例使用哪个硬件通道。不同通道可能具有不同的优先级或资源限制。对于 ADC 这类实时性要求较高的搬运任务,通常将其放置在高优先级通道,例如 CH1。这样可以降低其他低优先级通道对采样数据的扰动风险。
需要注意的是,高优先级并不一定等于“更快完成”,而是指在多个通道同时申请总线时,高优先级通道更有可能先获得服务。对于连续采样场景,这种优先保障非常关键。
该选项用于决定是否允许外部事件触发 DMA。勾选后,Trigger Source 选择的事件可以启动传输;不勾选时,即使事件发生,DMA 也不会启动搬运。
在某些调试阶段,可以暂时关闭触发开关,使用软件触发方式验证地址配置是否正确。确认无误后再打开硬件触发,以缩小问题排查范围。
Trigger Source 回答“什么时候开始搬运”。C2000 平台中常见的触发源包括:
选择触发源时,应确认其产生时机与数据可读取时机是否一致。例如,ADC 转换完成事件发生后,其结果寄存器才有效,此时触发 DMA 读取才是安全的。如果触发源早于数据就绪,则可能读到旧值或无效数据。
勾选 Use Interrupt 后,可以配置 DMA 中断相关参数。对于普通数据采集任务,建议开启 DMA 中断,并选择 Transfer End 作为中断条件。这样 CPU 可以在整块数据搬运完成后统一处理,而不是每搬一个 Word 就响应一次,从而提高效率。
该选项决定是否由 SysConfig 自动生成或绑定 DMA 中断服务函数。如果工程已经有统一的中断入口管理方式,或需要手动编写 ISR,可以不勾选此选项,避免自动生成代码与手写逻辑冲突。
Enable Interrupts 控制 DMA 是否真正将中断请求发送到 CPU。只有该选项使能后,DMA 满足中断条件时才会产生 CPU 中断。在调试初期,如果只希望观察数据是否被正确搬运,可以暂时关闭该选项,通过轮询状态位或查看缓冲区内容进行验证。
Overrun 中断用于检测 DMA 事件到达过快、前一次搬运尚未完成时又有新事件到来的异常情况。使能该中断可以帮助发现触发频率配置不合理、Burst Size 设置过小或 CPU 处理不及时等问题。
对于普通 ADC 搬运任务,在功能验证阶段可以先不使能该中断,待主流程稳定后再打开,用于捕获偶发异常。如果使能后发现频繁触发,应检查触发源频率与 DMA 执行时间是否匹配。
建议在调试 DMA 时遵循“先地址、后触发、再中断”的顺序。首先使用软件触发方式验证源地址与目的地址是否配置正确,再启用外部触发,最后打开中断处理。这样可以有效隔离问题来源,提高调试效率。
源地址必须指向一个可读、且数据在触发时刻已就绪的地址。对于部分外设,其数据寄存器在读取后会自动清除或推进,对于另一些外设,数据寄存器保持不变。DMA 地址递增策略需要与外设特性匹配,否则会出现数据重复或丢失。
当 Burst Size 大于 1 时,应确认源地址和目的地址是否自动递增。对于连续的寄存器数组、RAM 缓冲区,通常使用递增模式;对于固定端口的外设寄存器,可能需要保持地址不变。部分 DMA 还支持循环模式,可用于环形缓冲区持续采集。
DMA 中断服务函数应尽量简短,只完成标志清除、缓冲区切换或数据就绪通知等轻量操作。耗时处理应放在主循环或低优先级任务中执行,避免阻塞后续 DMA 中断。
C2000 的 DMA 配置并不复杂,但它要求开发者对触发模型与数据流有清晰的认知。将触发源、源地址、目的地址分开理解,并正确设置 Word、Burst 与 Transfer 的层级关系,可以显著降低调试难度,提高数据采集任务的稳定性。结合 SysConfig 的参数框架逐项确认,可以在工程化开发中形成一套清晰、可复用的 DMA 配置流程。