TMS320F28P65x DMA 功能详细总结

一、概述

F28P65是TI C2000™实时微控制器家族中的一款高性能双核器件,集成了两个6通道DMA(直接存储器访问)控制器,每个CPU子系统各配备一个。

DMA作为总线主设备,通过专用总线直接在存储器与外设之间传输数据,无需CPU干预,从而有效释放CPU带宽以处理控制算法等关键任务。通过使用DMA移动数据,CPU可以节省大量指令周期用于其他关键任务。

F28P65x在辅助C28x CPU中还添加了锁步双CPU比较器选项以及ePIE和DMA,用于检测永久性和瞬态故障。

二、DMA 架构

2.1 基本拓扑

F28P65x的DMA子系统架构如下:

  • DMA 1 控制器:6通道,专属于CPU1子系统
  • DMA 2 控制器:6通道,专属于CPU2子系统

每个DMA控制器均包含完整的寄存器组和独立的通道控制机制,支持多通道并行配置,在诸如UART通信等应用中可以同时使用6个DMA通道。

查看具体参数:

特性 F28P65x
DMA控制器数量 每个CPU一个(共2个)
每控制器通道数 6
总通道数 12
数据类型 16位/32位

2.2 总线架构

DMA作为总线主设备集成在C28x总线架构中。根据外设分配的不同,可对各外设和配置寄存器进行独立访问配置。外设可单独分配给CPU1或CPU2子系统,例如ePWM可分配给CPU1,eQEP可分配给CPU2。DMA传输通过专用总线完成,不会干扰CPU的正常指令执行。

三、关键功能特性

3.1 数据位宽

  • 支持16位和32位两种数据位宽
  • 32位传输的数据吞吐量是16位传输的2倍
  • 当设置为32位时,以下参数值的意义按32位字长考虑:Burst Size、Source Burst Step、Source Transfer Step、Destination Burst Step、Destination Transfer Step、Source Wrap Step、Destination Wrap Step
  • 为McBSP等特定外设提供DMA服务时,数据位宽须设置为16位

3.2 地址指针与寻址

  • 支持针对源地址和目标地址独立配置的起始地址、步进和回绕参数
  • 源和目标地址指针可按配置值在传输过程中实现增量、减量或固定不变
  • 支持通过BURST步进和TRANSFER步进参数控制地址指针在每帧内和每帧后的滑动
  • 错误检测机制:当SRC_WRAP_SIZE、DST_WRAP_SIZE ≥ BURST_SIZE时,可独立触发SRC_WRAP_ERROR或DST_WRAP_ERROR错误。软件必须确保SRC_WRAP_SIZE(步进数 - 1)和DST_WRAP_SIZE均为BURST_SIZE的整数倍

3.3 一维与二维传输

C2000 DMA支持二维数据传输,适合矩阵运算和数据块重组:

  • 每个BURST(子帧)可配置BURST_SIZE个16位字(1 – 32),每帧内可编程TRANSFER_SIZE个BURST(1 – 65,536)
  • 每BURST传输后按BURST步进滑动源/目标地址;完成一次完整Transfer后可选自动回绕到起始地址
  • 灵活配置BURST_SIZE、TRANSFER_SIZE、SRC_BEG_ADDR、DST_BEG_ADDR和通道链(CHAIN)可实现数据块重排

四、触发与中断

4.1 触发源

DMA传输通过外设中断事件触发。可与各种外设中断事件联动,实现全自动数据搬运。常见触发源包括:

  • ePWM事件
  • ADC转换完成中断
  • SPI中断(CPU中断信号)
  • 定时器中断(需手动配置)
  • 外部中断(通过GPIO)
  • eCAP模块DMA事件

NMA中断触发源可由PERINTSEL位(MODE寄存器的位4–0)选择,支持多种中断触发选项。对于外部中断通过GPIO触发的情况,需在External Interrupt选项卡中进行配置。

4.2 传输流程

DMA一次完整传输由以下组成:

  1. 发送源地址
  2. 读取源数据
  3. 发送目标地址
  4. 写入目标数据

传输完成后可选产生中断通知CPU。当CPU访问与DMA传输产生冲突时,CPU会暂停等待当前DMA访问完成,而无需等待整个DMA传输周期结束,显著降低通信延迟。

五、配置参数详解

DMA通道的主要配置参数如下:

参数 说明 取值范围
Data Size 数据位宽 16位 或 32位
Interrupt Source 外设中断触发源选择 视MCU型号而定
Burst Size 每BURST包含的字数 1–32(16位字)
Transfer Size 每次传输包含的BURST数 1–65536
Source Begin Address 源起始地址 22位
Destination Begin Address 目标起始地址 22位
Source Burst Step 源地址每BURST步进 -4096 至 +4095
Source Transfer Step 源地址每Transfer步进 -4096 至 +4095
Destination Burst Step 目标地址每BURST步进 -4096 至 +4095
Destination Transfer Step 目标地址每Transfer步进 -4096 至 +4095
Source Wrap Size 源地址回绕大小 可编程
Destination Wrap Size 目标地址回绕大小 可编程

六、应用示例与工作流

6.1 ADC-PWM协同采集

以下以ADC定期采样并通过DMA搬移数据为例,展示F28P65x中DMA的典型应用:

  1. 触发生成:ePWM模块以选定采样率生成PWM波形,ADC对波形进行采样
  2. 自动触发:每次ADC转换完成后自动触发DMA
  3. 乒乓缓冲:DMA将ADC样本搬移到自定义的Ping-Pong双缓冲中

实现Ping-Pong缓冲方案的优势在于,CPU总是在DMA填满一个缓冲区时处理另一个,实现无数据丢失的连续数据流处理。

6.2 UART多通道通信

F28P65x支持使用DMA实现UART多通道通信,最多可同时使用6个DMA通道。这允许系统在完全不依赖CPU干预的情况下实现高速串行数据流处理。

6.3 EtherCAT PDI访问

在F28P65x的EtherCAT功能开发中,DMA触发源不包含EtherCAT ISR,但可通过ESC SYNC信号触发DMA,实现无需CPU参与的EtherCAT PDI数据搬运。

七、典型配置流程

F28P65x中DMA通道的典型初始化与配置流程如下:

第1步:使能DMA时钟,将外设分配给对应CPU子系统

第2步:配置MODE寄存器,设置DATASIZE位(位14)和PERINTSEL触发源(位4-0)

第3步:配置BURST_SIZE寄存器(位4-0),取值范围1–32

第4步:配置TRANSFER_SIZE寄存器(位15-0),取值范围1–65536

第5步:设置源和目标地址——SRC_BEG_ADDR和DST_BEG_ADDR(均为22位地址)

第6步:配置BURST步进和TRANSFER步进参数

第7步:在CONTROL寄存器中清除错误和外设标志

第8步:使能DMA通道(置位需要的控制位)

第9步:配置外设对应触发源,在CHAIN寄存器完成通道链设置(如需)

第10步:使能DMA中断(可选,用于通知CPU传输完成)

八、常见问题与注意事项

常见问题 说明与建议
无法触发 检查触发源是否已正确选择到外设中断信号引脚
地址递增异常 确认BURST步进与TRANSFER步进是否正确配置
数据不完整 确认Transfer Size和Burst Size设定是否满足每次传输的数据需求
竞争条件 若CPU和DMA同时访问同一外设或内存区,需使用适当的标志或互斥机制
与SCI不可用 F28P65x的DMA不访问SCI寄存器,应改用UART实例;可参考TI的UART DMA例程
EtherCAT ISR缺失的DMA触发 EtherCAT ISR本身不能作为DMA触发源;解决方案是使用ESC SYNC信号来触发DMA

九、功能安全支持

F28P65x具备工业领先的实时安全特性,支持:

  • 锁步CPU(CPU2子系统),用于检测永久和瞬态硬件故障
  • DMA信息冗余技术:包括SECDED码(ECC)、奇偶校验码、CRC等,确保数据完整性
  • 设计目标满足ASIL D和SIL 3功能安全等级要求
  • 硬件ADC结果自动校验,HW BIST(硬件内置自检)

这些特性使F28P65x特别适用于需要高可靠性实时控制的应用场景,如汽车动力总成、工业电机驱动和可再生能源系统。

十、总结

TMS320F28P65x的DMA子系统以每CPU独立的6通道控制器为骨架,提供灵活的16/32位数据传输能力,支持从简单的一维外设到内存搬移到复杂的二维矩阵重组等多种传输模式,并可通过ePWM、ADC、定时器、SPI、eCAP等多种外设中断事件触发全自动数据搬运。结合Ping-Pong双缓冲、通道链(CHAIN)、功能安全冗余(锁步DMA、ECC、CRC)和实时固件更新(LFU)等高级特性,该DMA为高性能伺服驱动、机器人关节控制、电动汽车牵引逆变器、工业以太网通信等高实时性应用场景提供了强大的硬件支撑。


由于纯文本环境无法真正渲染图片,我用 ASCII 字符画 来展示。
这些图会围绕你文档中提到的 Burst SizeTransfer Size,帮你直观理解一次完整的 DMA 传输是如何组织的。


关于这Burst Size和Transfer Size的意义能不能画几张图给我说明一下

1. 基础定义(回顾)

  • Burst:DMA 收到一次触发后,连续搬运的一组数据。
  • Burst Size (BURST_SIZE):一个 Burst 里包含的 字数(16位或32位)。
  • Transfer:由多个 Burst 组成的完整搬运任务。
  • Transfer Size (TRANSFER_SIZE):Transfer 中包含的 Burst 个数

👉 总搬运字数 = BURST_SIZE × TRANSFER_SIZE


2. 图一:一次完整 DMA 传输的结构

假设:
BURST_SIZE = 4(每触发1次搬4个字)
TRANSFER_SIZE = 3(总共触发3次,即3个Burst)

      Burst 0                Burst 1                Burst 2
+-----+-----+-----+-----+  +-----+-----+-----+-----+  +-----+-----+-----+-----+
| W0  | W1  | W2  | W3  |  | W4  | W5  | W6  | W7  |  | W8  | W9  | W10 | W11 |
+-----+-----+-----+-----+  +-----+-----+-----+-----+  +-----+-----+-----+-----+
|        4 words        |  |        4 words        |  |        4 words        |
|<---- Burst Size=4 --->|  |<---- Burst Size=4 --->|  |<---- Burst Size=4 --->|

|<----------------- Transfer Size = 3 Bursts ------------------------------->|
                          总搬运 12 字
  • 每一次外设触发(如 ADC EOC)到来,DMA 就会搬完一个 Burst(W0~W3)。
  • 搬完一个 Burst 后,地址按 SRC_BURST_STEP / DST_BURST_STEP 更新。
  • 搬满 3 个 Burst 后,整个 Transfer 结束,可产生中断。

3. 图二:固定源地址 → 线性缓冲区的搬运(ADC 典型应用)

场景:ADC 结果寄存器地址不变,DMA 把采样值顺序搬到内存数组 AdcBuf[12]

配置:

  • 源地址 = &AdcResultReg (固定)
  • 目标地址 = &AdcBuf[0] (初始)
  • BURST_SIZE = 4TRANSFER_SIZE = 3
  • SRC_BURST_STEP = 0 (源地址不变)
  • DST_BURST_STEP = 1 (目标地址每搬完一个字 +1)

DMA 搬运过程(地址视图)
(每格代表一个 16/32 位字)

目标内存 (AdcBuf)                源(ADC 结果寄存器,始终保持同一地址)
+----+----+----+----+----+----+----+----+----+----+----+----+
| W0 | W1 | W2 | W3 | W4 | W5 | W6 | W7 | W8 | W9 | W10| W11|   <-- 数据
+----+----+----+----+----+----+----+----+----+----+----+----+
  ^    ^    ^    ^    ^    ^    ^    ^    ^    ^    ^    ^
  |    |    |    |    |    |    |    |    |    |    |    |
  Burst0 addr 递增1       Burst1 addr 递增1       Burst2 addr 递增1

源地址(固定):  [ ADC_RESULT ]  ← 每次触发都从同一个寄存器读
  • 第 1 次触发(Burst0):目标地址从 &AdcBuf[0] 走到 &AdcBuf[3]
  • 第 2 次触发(Burst1):接着从 &AdcBuf[4] 走到 &AdcBuf[7]
  • 第 3 次触发(Burst2):接着从 &AdcBuf[8] 走到 &AdcBuf[11]

结果:CPU 看到的就是一个完整的、按时间顺序排列的采样数组。


4. 图三:二维数据重组(比如 ADC 多通道扫描)

核心难点:如何让源地址“跑回去”?

在 ADC 多通道扫描中,物理硬件通常只有一个数据寄存器(或者一组固定的结果寄存器)。

  • 第 1 次触发:数据在地址 0x1000 (Ch0), 0x1002 (Ch1)…
  • 第 2 次触发:数据依然在地址 0x1000, 0x1002

DMA 搬完第 1 次后,源地址指针已经跑到了 0x1008。如果不加干预,第 2 次搬运就会从 0x1008 开始读,那就读错了!

解决方案:必须配置**回绕(Wrap)**功能。


详细参数配置与原理(修正版)

假设场景
  • ADC 结果寄存器:假设 Ch0~Ch3 对应 4 个连续的寄存器地址(或者一个FIFO),起始地址 SRC = 0x1000
  • 内存目标AdcBuf[12],起始地址 DST = 0x2000
  • 目标结构:3 行(3次触发)× 4 列(4个通道)。
关键参数配置表
参数 设定值 详细解释(为什么要这么配?)
BURST_SIZE 4 一次触发产生 4 个数据,所以一次突发搬运 4 个字。
TRANSFER_SIZE 3 总共要采 3 轮,所以总共触发 3 次 Burst。
SRC_BURST_STEP 1 在同一个 Burst 内,读完 Ch0 读 Ch1,地址 +1(假设寄存器是连续的)。
DST_BURST_STEP 1 在内存里,Ch0~Ch3 也是挨着存的,地址 +1。
DST_TRANSFER_STEP 0 重点:因为 BURST 已经把一行填满了,地址自动停在行尾。通常不需要额外的 Transfer Step,或者设为 0 靠 Burst 自动衔接(取决于具体 DMA 架构,通常 Burst 结束后地址就是下一个 Burst 的起点)。
SRC_TRANSFER_STEP 0 重点:我们不希望源地址在 Burst 之间增加,我们希望它回绕!所以这里设为 0(或者不使能)。
SRC_WRAP_SIZE 4 回绕的核心! 告诉 DMA:“每搬运 4 个字(2^4 = 16字节,假设字宽匹配),就把源地址强制拉回到该区域的起始地址。”

图解过程:回绕是如何发生的?

我们用您喜欢的字符图来演示这个**“读取-回绕-写入”**的过程。

设定

  • SRC_START = 0x1000 (ADC基地址)
  • DST_START = 0x2000 (内存基地址)
  • SRC_WRAP_SIZE = 4 (意味着每 4 个字,源地址回绕到 0x1000)
      Burst 0                Burst 1                Burst 2
+-----+-----+-----+-----+  +-----+-----+-----+-----+  +-----+-----+-----+-----+
| Ch0 | Ch1 | Ch2 | Ch3 |  | Ch0 | Ch1 | Ch2 | Ch3 |  | Ch0 | Ch1 | Ch2 | Ch3 |
+-----+-----+-----+-----+  +-----+-----+-----+-----+  +-----+-----+-----+-----+
|<---- SRC_WRAP=4 ---->|  |<---- SRC_WRAP=4 ---->|  |<---- SRC_WRAP=4 ---->|
|   (地址回绕复位)      |  |   (地址回绕复位)      |  |   (地址回绕复位)      |

      Burst 0                Burst 1                Burst 2
+-----+-----+-----+-----+  +-----+-----+-----+-----+  +-----+-----+-----+-----+
| W0  | W1  | W2  | W3  |  | W0  | W1  | W2  | W3  |  | W0  | W1  | W2  | W3  |
+-----+-----+-----+-----+  +-----+-----+-----+-----+  +-----+-----+-----+-----+
|<---- DST_WRAP=4 ---->|  |<---- DST_WRAP=4 ---->|  |<---- DST_WRAP=4 ---->|
|   (地址回绕覆盖)      |  |   (地址回绕覆盖)      |  |   (地址回绕覆盖)      |

|<----------------- Transfer Size = 3 Bursts ------------------------------->|
                          总搬运 12 字(循环覆盖)

总结:两个关键参数的作用

  1. SRC_WRAP_SIZE (源地址回绕大小)
    • 作用:它是**“橡皮筋”**。它定义了一个边界(这里是 4 个字)。一旦源地址在这个边界内走完了(Burst 结束),它就立刻被弹回起始点。
    • 结果:保证了每一次新的触发(Burst 1, Burst 2…),DMA 都是从 ADC 的第一个通道寄存器开始读,而不是接着上次的地址读。
  2. SRC_TRANSFER_STEP (源地址传输步长)
    • 作用:它是**“额外偏移”**。在有些复杂的 DMA 中,Transfer Step 是在 Wrap 之后额外加的偏移。
    • 本例配置:设为 0。因为我们希望完全回绕到起点,不需要额外的偏移。如果设为 1,回绕后还会再加 1,导致数据错位。

一句话概括: 通过配置 SRC_WRAP_SIZE,我们让源地址在每次 Burst 结束后“瞬移”回起点;而目标地址没有配置 Wrap,所以它会老老实实地一直往后写,从而实现了将“重复的源数据”展开成“线性的目标矩阵”。

总结:
这个例子的精髓在于 BURST_SIZE 定义了一行的宽度,而 TRANSFER_SIZE 定义了有多少行。DMA 只需要负责“一行一行”地线性铺展,就天然形成了二维矩阵。


5. 关键参数作用总结

参数 控制范围 作用时机
BURST_SIZE 1 ~ 32 决定一个 Burst 搬运的字数
TRANSFER_SIZE 1 ~ 65536 决定一个 Transfer 包含多少个 Burst
SRC/DST BURST STEP -4096 ~ +4095 每个 Burst 结束后,源/目标地址的增量
SRC/DST TRANSFER STEP -4096 ~ +4095 每个 Transfer 结束后,地址的增量(常配合回绕)
SRC/DST WRAP SIZE 可编程 当计数器达到该值时,地址回绕到起始地址

通过组合这些参数,你就能实现一维缓冲二维矩阵重组环形缓冲区等各种数据搬运模式,完全脱离 CPU 干预。


如果还想看 Ping‑Pong 双缓冲、或环形缓冲区的地址回绕图,我可以再补几张 ASCII 图。

参考资料

  • TMS320F28P65x Real-Time Microcontrollers Technical Reference Manual (SPRUIZ1B)
  • TMS320F28P65x Real-Time Microcontrollers Data Sheet (SPRSP69)
  • TMS320F28P65x Functional Safety Manual(SFFS700)
  • C2000™ F28P65x Real-Time Microcontrollers Errata (SPRT766)
  • TI E2E支持论坛
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐