本帖最后由 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位宽进行数据操作的,这样又是否正确呢? |