news 2026/5/29 23:00:07

C2000 DMA 笔记

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C2000 DMA 笔记

DMA 在外设、RAM、寄存器之间自动搬数据,CPU 只负责配置规则。常见场景:ADCRESULT → RAMSPI RX/TX ↔ RAMRAM → DAC/EPWMRAM → RAM

DMA 不执行 CPU 指令,但会占用总线。大块或高频搬运仍可能影响 CPU 访问速度。


1. DMA 基本原理

配置 DMA 前先抓住三个问题:

Trigger Source :什么时候搬 Source Address :从哪里搬 Dest Address :搬到哪里

例如Trigger Source = ADCA1只表示ADCA1 事件触发 DMA,不代表 DMA 自动读取 ADC 结果;真正的数据源还要配置Source Address = ADCRESULT0。所以要记住:触发源 ≠ 数据源

DMA 的搬运分三层:

Word :最小搬运单位 Burst :一次突发,包含多个 Word Transfer :一次完整传输,包含多个 Burst 总搬运量 = Burst Size × Transfer Size

例如Burst Size = 4,Transfer Size = 1,表示一个 Transfer 里有 1 个 Burst,这个 Burst 搬 4 个 Word,总共搬 4 个 Word。


2. SysConfig 基础参数

本文以 SysConfig 的 DMA 参数顺序为框架理解配置。

Name:DMA 实例名,只是工程中的标识,例如myDMA0

DMA Channel:选择 DMA 通道,例如DMA CH1。ADC 这类实时性较高的搬运,常放在 CH1,因为 CH1 可以设置高优先级。

Enable Triggers:是否允许触发源启动 DMA。勾选后,外设事件可以触发 DMA;不勾选,触发事件来了也不会搬。

Trigger Source:选择 DMA 触发源,也就是“什么时候搬”。常见触发源有ADCA1EPWM SOCA/SOCBSPI RX/TXFSI RX/TXTimerSoftware Trigger

Use Interrupt:是否使用 DMA 中断。勾选后,会展开下面几个中断相关参数;普通数据采集一般建议使用 DMA 中断,并选择Transfer End

Register Interrupt Handler:是否让 SysConfig 自动注册 DMA 中断函数。勾选后一般会生成或绑定对应 ISR;如果自己手写中断入口,可以不勾。 Enable Interrupts:是否真正使能 DMA 中断。勾选后,DMA 满足中断条件时才会进入 CPU 中断。 Enable Overrun Interrupt:是否使能溢出/覆盖类中断。用于检测 DMA 事件来得太快、上一次还没处理完又来了的异常情况。普通 ADC 搬运初期可以先不勾。

Interrupt Mode:选择 DMA 中断产生的时机。
DMA interrupt is generated at the beginning of a transfer表示 Transfer 开始时中断;DMA interrupt is generated at the end of a transfer表示 Transfer 完成时中断,普通搬运推荐这一项。

Emulation Mode:调试暂停时 DMA 怎么办。
Transmission stops after current read-write access is completed表示 CPU 断点暂停时,DMA 完成当前读写后停止,调试推荐;
Continue DMA operation regardless of emulation suspend表示 CPU 暂停后 DMA 仍继续运行,特殊调试场景才用。

One-Shot Configuration:控制一次触发后搬多少。
Only one burst transfer performed per trigger表示每次触发只搬 1 个 Burst;
Burst transfers occur without additional event triggers after the first表示第一次触发后连续搬完整个 Transfer。

Continuous Mode Configuration:控制一个 Transfer 搬完后 DMA 怎么办。
DMA channel will be disabled at the end of a transfer表示搬完一次 Transfer 后通道关闭;
DMA reinitializes when the transfer count is zero and waits for a trigger表示搬完后重新初始化,等待下一次触发。注意:Continuous 不是立刻再搬,而是重新备好,等下次触发

Databus Width:DMA 每次搬运的数据宽度。16-bit常用于 ADC、uint16_t buffer32-bit吞吐更高,但对齐和步进更麻烦。ADC 采样一般选16-bit

Burst Size:一个 Burst 搬多少个 Word。例如Burst Size = 4表示一个 Burst 搬 4 个 Word。

Transfer Size:一个 Transfer 包含多少个 Burst。例如Burst Size = 4,Transfer Size = 1表示一个 Transfer 只有 1 个 Burst,总共搬 4 个 Word。

Number of words to be transferred:一次 Transfer 总搬运数量,通常等于Burst Size × Transfer Size,这个一般自动计算。

Enable Channel 1 Priority:是否开启 CH1 高优先级。关闭时 CH1~CH6 轮询服务;开启后 CH1 可以优先于其他通道。ADC 实时性要求高时,可以让 ADC DMA 使用 CH1 并开启优先级。

Start Channel:是否启动 DMA 通道。配置好 DMA 后,需要启动通道;触发源使能 + 通道启动后,DMA 才会真正搬运。


3. Source Address Setup

源地址设置决定:从哪里读,以及源地址怎么变化

Source Address Input Type:源地址填写方式。
Manual表示手动填地址;
Variable/Function Name表示用变量名、宏名、符号名;
Linked to Peripheral表示链接到外设。
如果Linked to Peripheral报错,通常说明当前 DMA 不是从该外设子模块里创建的,直接用手动地址或宏名更稳。

Source Address:DMA 读数据的起始地址。
ADC 搬运常用ADCRESULT0,SPI 接收常用SPI_RXBUF,RAM 搬运就是源数组首地址。

Source Address Burst Step:一个 Burst 内,每搬完 1 个 Word 后,源地址怎么变。
连续读用1,固定读同一寄存器用0。例如src[0] → src[1] → src[2]Step = 1SPI_RXBUF → SPI_RXBUF → SPI_RXBUFStep = 0

Source Address Transfer Step:每完成 1 个 Burst 后,源地址额外跳多少。
普通连续搬运用0
例如Burst Size = 4,Transfer Size = 3,Source Burst Step = 1,Source Transfer Step = 0,会依次读src[0~3]src[4~7]src[8~11];如果Source Transfer Step = 4,则每个 Burst 后额外跳过 4 个 Word。

Source Wrap Size:完成多少个 Burst 后触发源地址回绕。普通搬运设最大值或默认值;环形访问时按循环范围配置。

Source Address Wrap Step:源地址回绕时如何调整。普通搬运设0。Wrap 用于 Transfer 内部地址回绕,不等于Continuous Mode Configuration


4. Destination Address Setup

目标地址设置决定:写到哪里,以及目标地址怎么变化

Destination Address Input Type:目标地址填写方式。
Manual表示手动填地址;
Variable/Function Name表示用变量名、数组名、宏名;
Linked to Peripheral表示链接到外设。

Destination Address:DMA 写数据的起始地址。
ADC 到 RAM 时是adc_buf[0];RAM 到 SPI 时是SPI_TXBUF;RAM 到 RAM 时是目标数组首地址。

Destination Address Burst Step:一个 Burst 内,每搬完 1 个 Word 后,目标地址怎么变。
连续写数组用1,固定写同一寄存器用0。例如dst[0] → dst[1] → dst[2]Step = 1SPI_TXBUF → SPI_TXBUF → SPI_TXBUFStep = 0

Destination Address Transfer Step:每完成 1 个 Burst 后,目标地址额外跳多少。普通连续写数组用0;需要隔块写、跳行写时才设置非 0。

Destination Wrap Size:完成多少个 Burst 后触发目标地址回绕。普通搬运设最大值或默认值;环形缓冲区按 buffer 大小配置。

Destination Address Wrap Step:目标地址回绕时如何调整。普通搬运设0


5. One-Shot / Continuous / Wrap 区别

One-Shot :管“一次触发后,是只搬 1 个 Burst,还是连续搬完整个 Transfer 里的所有 Burst” Continuous :管“一个 Transfer 搬完后,是停止,还是重新初始化并等待下一次触发” Wrap :管“一个 Transfer 内部,源地址/目标地址是否按规则回绕” Burst Step :管“一个 Burst 内,每搬完 1 个 Word 后地址怎么变化” Transfer Step:管“每完成 1 个 Burst 后,地址额外跳多少”

6. ADC DMA 推荐配置

目标:

ADCRESULT0~3 → adc_buf[0~3]

推荐配置:

DMA Channel = DMA CH1 Trigger Source = ADCA1 Databus Width = 16-bit Burst Size = 4 Transfer Size = 1 One-Shot = Disable Continuous = Enable Interrupt = Transfer End

源地址:

Source Address = ADCRESULT0 Source Burst Step = 1 Source Transfer Step = 0 Source Wrap Size = 0xFFFF Source Wrap Step = 0

目标地址:

Destination Address = adc_buf[0] Destination Burst Step = 1 Destination Transfer Step = 0 Destination Wrap Size = 0xFFFF Destination Wrap Step = 0

触发时机建议:

SOC0 → ADCRESULT0 SOC1 → ADCRESULT1 SOC2 → ADCRESULT2 SOC3 → ADCRESULT3 EOC3 → ADCINT1 → DMA Trigger

这样可以确保 4 个 ADC 结果都准备好后,再触发 DMA。


7. 配置思路

配置 DMA 前依次问:

① 谁触发? ② 从哪搬? ③ 搬到哪? ④ 一次触发搬多少? ⑤ 地址递增、固定、还是跳步? ⑥ 搬完停止还是等下次触发? ⑦ CPU 什么时候处理数据?

核心参数对应关系:

Trigger Source :什么时候搬 Source Address :从哪里搬 Dest Address :搬到哪里 Burst Size / Transfer Size :搬多少 Burst Step :Burst 内部地址怎么走 Transfer Step :Burst 之间地址怎么走 Wrap :地址是否回绕 One-Shot :一次触发搬多少 Continuous :一轮搬完后怎么办 Interrupt :什么时候通知 CPU
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/29 22:59:03

40%的Agent项目会失败——多Agent协作与可靠性工程

Gartner 预测:到 2027 年,超过 40% 的 Agentic AI 项目会被废弃。不是因为模型不够强,而是因为系统不够可靠。 你可能觉得,上一期讲完了 Agent 的核心架构(Loop 推理 记忆 工具),Agent 的故…

作者头像 李华
网站建设 2026/5/29 22:43:50

如何高效解决电脑散热难题:FanControl终极风扇控制方案

如何高效解决电脑散热难题:FanControl终极风扇控制方案 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/f…

作者头像 李华
网站建设 2026/5/29 22:43:36

2007-2024年中国250M分辨率生态系统质量指数TIF数据集

生态系统质量如何变化,是衡量区域可持续发展与生态保护成效的关键。 中国科学院地理科学与资源研究所发布了一款重磅地理数据产品“中国生态系统质量指数年度250-m分辨率数据集(2007-2024)”。 该数据集时间跨度长达18年,空间分…

作者头像 李华
网站建设 2026/5/29 22:42:38

告别手写病历:实测4款门诊录音转录工具,只有这款能进生产流

关于医疗门诊录音转病历记录用什么工具最好,这里直接给出我的结论:如果你身处纯英文的海外医疗环境,Otter.ai 依然是首选;但如果你在国内看诊,面临复杂的方言、中英文夹杂的医学术语以及需要结构化病历的诉求&#xff…

作者头像 李华