硬汉嵌入式论坛

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

[DMA] 合理配置STM32H7的MDMA突发传输次数和源数据以及目的数据位宽可以再提升一点性能

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2019-6-14 16:21:36 | 显示全部楼层 |阅读模式
STM32H7的MDMA有个使用要求:每次突发传输的总数据大小不能超过128字节。
1、对于源地址就是SourceBurst * SourceDataSize <  BufferTransferLength
2、对于目的地址就是DestBurst*DestDataSize < BufferTransferLength

现在修改下面帖子的MDMA配置:
http://www.armbbs.cn/forum.ph ... 4058&extra=page%3D1

  1. MDMA_Handle.Init.Request              = MDMA_REQUEST_SW;         /* 软件触发 */
  2. MDMA_Handle.Init.TransferTriggerMode  = MDMA_BLOCK_TRANSFER;     /* 块传输 */
  3. MDMA_Handle.Init.Priority             = MDMA_PRIORITY_HIGH;      /* 优先级高*/
  4. MDMA_Handle.Init.Endianness           = MDMA_LITTLE_ENDIANNESS_PRESERVE; /* 小端 */
  5. MDMA_Handle.Init.SourceInc            = MDMA_SRC_INC_DOUBLEWORD;         /* 源地址自增,双字,即8字节 */
  6. MDMA_Handle.Init.DestinationInc       = MDMA_DEST_INC_DOUBLEWORD;        /* 目的地址自增,双字,即8字节 */
  7. MDMA_Handle.Init.SourceDataSize       = MDMA_SRC_DATASIZE_DOUBLEWORD;    /* 源地址数据宽度双字,即8字节 */
  8. MDMA_Handle.Init.DestDataSize         = MDMA_DEST_DATASIZE_DOUBLEWORD;   /* 目的地址数据宽度双字,即8字节 */
  9. MDMA_Handle.Init.DataAlignment        = MDMA_DATAALIGN_PACKENABLE;       /* 小端,右对齐 */                    
  10. MDMA_Handle.Init.SourceBurst          = MDMA_SOURCE_BURST_8BEATS;      /* 源数据突发传输,SourceBurst*SourceDataSize <  BufferTransferLength*/
  11. MDMA_Handle.Init.DestBurst            = MDMA_DEST_BURST_8BEATS;        /* 目的数据突发传输,DestBurst*DestDataSize < BufferTransferLength */

  12. MDMA_Handle.Init.BufferTransferLength = 128;    /* 每次传输128个字节 */

  13. MDMA_Handle.Init.SourceBlockAddressOffset  = 0; /* 用于block传输,地址偏移0 */
  14. MDMA_Handle.Init.DestBlockAddressOffset    = 0; /* 用于block传输,地址偏移0 */
复制代码


修改后的性能(MDMA的前两项性能提升了不少,而后两项涉及到SDRAM的降低了):
QQ截图20190614161609.jpg

之前的性能:
88.jpg



评分

参与人数 1金币 +10 收起 理由
WZH + 10 实测二者乘积等于128时确实不稳定

查看全部评分

回复

使用道具 举报

36

主题

2050

回帖

2158

积分

至尊会员

积分
2158
发表于 2019-6-15 09:40:54 | 显示全部楼层
前几天坛友不是反馈了个写缓冲使能,测试是否有效果
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2019-6-16 17:38:09 | 显示全部楼层
byccc 发表于 2019-6-15 09:40
前几天坛友不是反馈了个写缓冲使能,测试是否有效果

测试了,没效果。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2025-1-21 09:50:47 | 显示全部楼层
本帖最后由 AuqinFly 于 2025-1-21 10:35 编辑

你好,eirc2013,我在认真拜读贵公司编写的STM32H7开发手册中的相关FMC总线去外挂的SDRAM以后,结合您这一篇帖子,在帖子中,您用MDMA配置成为了 8beats 突发传输 , 传输的数据量大小是 8字节(64bit) .每次突发传输的总数据量为8字节*8beats = 64字节
这样的配置在去使用MDMA操作内存运算  无论是 D1域中的AXI-SRAM区域,还是D2域中的SRAM1、SRAM2、SRAM3等等H7内置内存区域 毫无疑问都是ok的。
但是,这样的突发配置去操作外挂的32位宽的SDRAM,为什么也是可行的呢?我去下载了相关的测试工程:《STM32H7的MDMA,DMA2D和DMA性能测试出来了,DMA2D和MDMA有一拼,DMA1和2的性能太挫
https://www.armbbs.cn/forum.php?mod=viewthread&tid=94058(出处: 硬汉嵌入式论坛)》。做了一下测试。
结果真的可以操作外部内存进行64bit的读写,这个结果让我百思不得其解,我急忙去打开测试工程中的板载初始化相关代码找到与SDRAM中的相关代码:其中让我存在疑问的部分粘贴如下
[C] 纯文本查看 复制代码
    /*##-5- 配置SDRAM模式寄存器 ###############################################*/
        tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1          |
                                         SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL   |
                                         SDRAM_MODEREG_CAS_LATENCY_3           |
                                         SDRAM_MODEREG_OPERATING_MODE_STANDARD |
                                         SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;

        Command->CommandMode = FMC_SDRAM_CMD_LOAD_MODE;
        Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
        Command->AutoRefreshNumber = 1;
        Command->ModeRegisterDefinition = tmpmrd;


在SDRAM中的模式寄存器的中配置如上面代码所示,使用了突发长度1,且配置了突发读,single写模式。这里的突发长度仅仅是1,并且没有使用突发写,而是single写。这里的配置与就与前面提及的MDMA的配置不相吻合了,我很好奇在MDMA那里配置成为了在目的地处使用突发写入,但是外部SDRAM目前并不是这样的模式,这样是否正确?其次,外部的内存是32位宽的,MDMA又是使用的双字大小即64位宽进行数据操作的,这样又是否正确呢?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2025-1-22 07:20:42 | 显示全部楼层
AuqinFly 发表于 2025-1-21 09:50
你好,eirc2013,我在认真拜读贵公司编写的STM32H7开发手册中的相关FMC总线去外挂的SDRAM以后,结合您这一 ...

关于这两个问题,我的理解是这样的。
1、首先是FMC的突发支持问题,FMC驱动SDRAM,仅支持单次突发或者说没有突发
https://www.armbbs.cn/forum.php?mod=viewthread&tid=91693

2、然后就是你说的MDMA突发支持,开启MDMA的突发后,实际上只是连续执行多次读取,没有没有开启SDRAM本身的突发。

最后就是64bit操作,这个FMC会分两次操作。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-29 06:22 , Processed in 0.330086 second(s), 31 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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