硬汉嵌入式论坛

 找回密码
 立即注册
查看: 268|回复: 6
收起左侧

[DMA] STM32H7 MDMA的一些使用疑惑

[复制链接]

3

主题

10

回帖

19

积分

新手上路

积分
19
发表于 2025-10-13 21:45:44 来自手机 | 显示全部楼层 |阅读模式
最近在用stm32 MDMA,用的过程中遇到并想到一些问题,放在这里想大家一起思考讨论一下。

一、MDMA的缓冲区传输的终止问题。
在手册里说

“通道被禁止,以后不从停止点重新开始。在这种情况下,只需将 MDMA_CxCR 寄存器 中的 EN 位清零来禁止通道,除此之外不需要任何其他操作。禁止数据流可能要花费一 些时间(需要首先完成正在进行的缓冲区传输)。”

我的理解是,MDMA总是会尝试传输一个完整的缓冲区,除非它知道自己不能传输一个完整的缓冲区了(比如说块大小不是缓冲区长度的倍数)。那假如外设的输出确实没有办法满足一次缓冲区传输大小(例如JPEG编码),而此时外设已经停止工作,这个时候按道理来说应该在ISR调用abort了,MDMA又会怎么工作呢(传输一个不完整的缓冲区吗?)

二、MDMA的突发传输与缓冲区大小不匹配的问题。
手册原文:
位 24:18 TLEN[6:0]:
缓冲区传输长度 (buffer Transfer Length)(字节数 - 1)
这些位将由软件置 1 和清零。
TLEN+1 值表示要在单次传输过程中传输的字节数。
传输长度必须为(源和目标)数据大小的倍数 注: 源/目标大小不同且使用填充/截断时,TLEN+1 指的是源数据数组大小。
这些位受到保护,只有 EN 为 0 时才可以写入
必须对 DBURST 值进行编程,以确保突发大小小于传输大小。

这里明确说了“突发大小”小于“传输大小”。但是实际使用的时候,我见过把缓冲区大小设置为32,但是突发长度为16,传输宽度为word。很明显16x4>32。这个应该怎么解释呢?

三、突发过程中的传输终止问题
在问题一的基础上,如果突发拍数x传输宽度≥缓冲区长度的话,那么终止的时刻就应该还在一次突发传输的过程中。MDMA使用的是axi总线,axi总线是不允许突发被提前终止的(不同于AHB),那么现在问题就算想回退到传输一个不完整的缓冲区都不行了。这个问题又应该怎么解释呢?

四、MDMA的适用范围
MDMA在我看来,它最大的功能仍然是在内存之间搬运数据,而非与外设互动(DMA1,2除外)。有什么其他的作用也可以提出来!欢迎讨论!
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
119430
QQ
发表于 2025-10-14 09:11:18 | 显示全部楼层
1、也有可能等待缓冲区够一个BufferTransferLength
2、这个得匹配,防止有意外
3、我的设置BufferTransferLength是突发拍数x传输宽度整数倍,这种特别操作没尝试过
4、通用DMA和MDMA性能差距很大,确实什么好互动的。另外就是做图形旋转,QSPI DMA,JEPG等场合使用。
回复

使用道具 举报

3

主题

47

回帖

56

积分

初级会员

积分
56
发表于 2025-10-14 20:46:47 | 显示全部楼层
我也被mdma搞得晕头转向,有人写过通用的mdma函数来在几个不同内存中传递数据吗?
回复

使用道具 举报

3

主题

10

回帖

19

积分

新手上路

积分
19
 楼主| 发表于 2025-10-15 02:41:53 来自手机 | 显示全部楼层
spi-sd 发表于 2025-10-14 20:46
我也被mdma搞得晕头转向,有人写过通用的mdma函数来在几个不同内存中传递数据吗?

通用的应该没有,不过仔细搞懂了细节直接写应该还好。我这几天也一直在不断总结笔记,记录技术细节,到最后应该会发出一个完整的版本。
回复

使用道具 举报

3

主题

10

回帖

19

积分

新手上路

积分
19
 楼主| 发表于 2025-10-15 02:42:56 来自手机 | 显示全部楼层
eric2013 发表于 2025-10-14 09:11
1、也有可能等待缓冲区够一个BufferTransferLength
2、这个得匹配,防止有意外
3、我的设置BufferTransfe ...

感谢硬汉哥回复,我也觉得MDMA应该这样做,任何违反手册的行为,即使行为是正常的也不应该采取。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
119430
QQ
发表于 2025-10-15 10:03:15 | 显示全部楼层
spi-sd 发表于 2025-10-14 20:46
我也被mdma搞得晕头转向,有人写过通用的mdma函数来在几个不同内存中传递数据吗?

此贴分享案例了。

STM32H7的MDMA,DMA2D和DMA性能测试出来了,DMA2D和MDMA有一拼,DMA1和2的性能太挫
https://forum.anfulai.cn/forum.p ... 4058&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

5

主题

177

回帖

192

积分

初级会员

积分
192
发表于 2025-10-16 09:40:31 | 显示全部楼层
其实MDMA可以访问GPIO的 我看到一个案例,但是MDMA的触发依赖于DMA,触发的上限被DMA限制
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-11-22 01:32 , Processed in 0.045389 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表