硬汉嵌入式论坛

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

[SD/SDIO] STM32H7的SDIO接SD卡使用FatFS时,推荐用TCM,而SDIO直接访问的区用AXI SRAM

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
发表于 2019-3-1 00:07:28 | 显示全部楼层 |阅读模式
对于STM32H7的SDMMC1接口,这个接口仅支持AXI SRAM的访问,其它SRAM和TCM均不支持。
如果大家的主RAM直接使用AXI SRAM,仅需处理Cache的数据一致性问题即可,因为CPU和SDMMC1的专用DMA都将访问AXI SRAM区。

但主RAM采用了AXI SRAM,高性能的TCM的性能不容易得到最大发挥,所以此贴为此而作


基础知识点说明:
如果用户要写入或读取的数据小于ffconf.h文件里面设置的扇区大小(基本都是512字节)。
(1)当要写入和读取的数据小于扇区大小时,会直接使用FATFS结构体里面的数组win[_MAX_SS]做DMA写操作到,正好1个扇区大小。
(2)当要写入和读取的数据大于等于扇区大小时,扇区整数倍的地方将直接使用用户提供的收发缓冲区发送,而不足一个扇区的地方将使用FATFS结构体里面的数组。

经过测试,结构体变量FATFS,FIL和读写缓冲要使用AXI SRAM,其它不用,使用主RAM空间TCM即可:

__attribute__((section (".RAM_D1")))        FATFS fs;
__attribute__((section (".RAM_D1")))        FIL file;

__attribute__((section (".RAM_D1")))   char ReadBuf[1024] ;
__attribute__((section (".RAM_D1")))   char WriteBuf[1024] ;


最后就是数据一致性问题,这个的解决办法很多
(1)可以选择关闭AXI SRAM的Cache,毕竟速度也是200MHz,最简单省事。
(2)Cache采用WT模式,写操作是直接写入AXI SRAM,不过读取还是有Cache,读取前得做无效化操作。
(3)Cache采用WB模式,读写Cache全开启,写完后做Clean操作,读取前做无效化操作。


两个参考文档:
(1)像使用内部SRAM一样定义使用SDRAM和CCM RAM,可以随意定义到指定的RAM区域且无需具体地址
http://www.armbbs.cn/forum.ph ... id=89275&fromuid=58

(2)言简意赅的介绍M7内核的Cache工作流程,摸爬滚打半年的经验总结
http://www.armbbs.cn/forum.ph ... id=90066&fromuid=58









回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2019-3-1 08:37:05 | 显示全部楼层
回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2019-3-1 08:54:58 | 显示全部楼层
Mark,备份下。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

32

主题

262

回帖

363

积分

高级会员

积分
363
发表于 2019-3-1 16:11:55 | 显示全部楼层
赞👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2019-4-26 18:52:37 | 显示全部楼层
请问一下硬汉哥,我看你的SD加文件系统的例程中使用的是并没有如F7 F4那样配置DMA,那么是如何使用的DMA模式进行数据读写的呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2019-4-26 22:04:40 | 显示全部楼层
王海靖 发表于 2019-4-26 18:52
请问一下硬汉哥,我看你的SD加文件系统的例程中使用的是并没有如F7 F4那样配置DMA,那么是如何使用的DMA模 ...

这里面有个隐含的知识点,H7的SDIO是自带DMA的,无需使用通用的DMA1,DMA2。
回复

使用道具 举报

32

主题

262

回帖

363

积分

高级会员

积分
363
发表于 2019-4-26 23:44:37 | 显示全部楼层
王海靖 发表于 2019-4-26 18:52
请问一下硬汉哥,我看你的SD加文件系统的例程中使用的是并没有如F7 F4那样配置DMA,那么是如何使用的DMA模 ...

开启中断就行了
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2019-4-27 09:59:21 | 显示全部楼层
eric2013 发表于 2019-4-26 22:04
这里面有个隐含的知识点,H7的SDIO是自带DMA的,无需使用通用的DMA1,DMA2。

感谢回复
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2019-4-27 09:59:27 | 显示全部楼层

感谢回复
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2019-4-27 11:50:28 | 显示全部楼层
eric2013 发表于 2019-4-26 22:04
这里面有个隐含的知识点,H7的SDIO是自带DMA的,无需使用通用的DMA1,DMA2。
  1.   if(BSP_SD_ReadBlocks_DMA((uint32_t*)buff,
  2.                            (uint32_t) (sector),
  3.                            count) == MSD_OK)
  4.   {
  5.     /* Wait that the reading process is completed or a timeout occurs */
  6.     timeout = HAL_GetTick();
  7.     while((ReadStatus == 0) && ((HAL_GetTick() - timeout) < SD_TIMEOUT))
  8.     {
  9.     }
  10.     /* incase of a timeout return error */
  11.     if (ReadStatus == 0)
  12.     {
  13.       res = RES_ERROR;
  14.     }
  15.     else
  16.     {
  17.       ReadStatus = 0;
  18.       timeout = HAL_GetTick();

  19.       while((HAL_GetTick() - timeout) < SD_TIMEOUT)
  20.       {
  21.         if (BSP_SD_GetCardState() == SD_TRANSFER_OK)
  22.         {
  23.           res = RES_OK;
  24. #if (ENABLE_SD_DMA_CACHE_MAINTENANCE_READ == 1)
  25.             /*
  26.                the SCB_InvalidateDCache_by_Addr() requires a 32-Byte aligned address,
  27.                adjust the address and the D-Cache size to invalidate accordingly.
  28.              */
  29.             alignedAddr = (uint32_t)buff & ~0x1F;
  30.             SCB_InvalidateDCache_by_Addr((uint32_t*)alignedAddr, count*BLOCKSIZE + ((uint32_t)buff - alignedAddr));
  31. #endif
  32.            break;
复制代码


请问一下;前面您说到要读之前进行无效化操作,为什么代码实现是读之后进行的无效化操作
回复

使用道具 举报

32

主题

262

回帖

363

积分

高级会员

积分
363
发表于 2019-4-27 17:01:51 | 显示全部楼层
本帖最后由 在水一方 于 2019-4-28 20:00 编辑
王海靖 发表于 2019-4-27 11:50
请问一下;前面您说到要读之前进行无效化操作,为什么代码实现是读之后进行的无效化操作

CACHE  的使用策略
1.读DMA, 先实现读操作,然后把数据从CACHE 刷新到实际数组
2.写DMA, 先实现把数据刷入CACHE 然后早进行写操作,一般没必要发送的数组可以不用刷配置成WT模式

上面应该是说反了

回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2019-4-28 09:57:52 | 显示全部楼层
在水一方 发表于 2019-4-27 17:01
CACHE  的使用策略
1.读DMA, 先实现读操作,然后把数据从CACHE 刷新到实际数组
2.写DMA, 先实现把数 ...

谢谢您的回答
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2019-6-14 10:27:30 | 显示全部楼层
硬汉哥,请问一下SD卡的文件系统中使用DMA模式的话,数据的缓存区是不是有字节对齐的要求,如果不适用DMA是不是就没有
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2019-6-14 10:40:57 | 显示全部楼层
王海靖 发表于 2019-6-14 10:27
硬汉哥,请问一下SD卡的文件系统中使用DMA模式的话,数据的缓存区是不是有字节对齐的要求,如果不适用DMA是 ...

H7的字节对齐问题,我还没有去研究。V7用户手册搞到这个章节了,我研究下。

F1有这个问题,而且处理麻烦,大于512字节,我都是512字节分批操作

而F4处理字节对齐最简单了,设置那个DMA传输带宽位字节即可(因为DMA支持源地址和目的地址的不同带宽传输,无需做对齐处理了)。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2019-6-14 11:40:07 | 显示全部楼层
eric2013 发表于 2019-6-14 10:40
H7的字节对齐问题,我还没有去研究。V7用户手册搞到这个章节了,我研究下。

F1有这个问题,而且处理麻 ...

谢谢您的回答。
H7的SDIO的DMA是自带的无需配置,F4的需要自己手动设置,所以H7是不是硬件上已经全做好了?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2019-6-14 12:31:16 | 显示全部楼层
王海靖 发表于 2019-6-14 11:40
谢谢您的回答。
H7的SDIO的DMA是自带的无需配置,F4的需要自己手动设置,所以H7是不是硬件上已经全做好 ...

这个东西要测试下,简单些就是读取一个BMP图片显示,如果有字节对齐问题,显示会异常。
回复

使用道具 举报

13

主题

156

回帖

215

积分

高级会员

积分
215
发表于 2019-6-19 17:16:51 | 显示全部楼层
eric2013 发表于 2019-6-14 12:31
这个东西要测试下,简单些就是读取一个BMP图片显示,如果有字节对齐问题,显示会异常。

老大,请问是否支持,外部sdram,看手册好像是支持fmc的。在做音频播放的时候,数据缓冲区放在axiram就可以,放到sdram,读几遍就读不到数据不知怎么原因。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2019-6-19 17:20:52 | 显示全部楼层
本五心 发表于 2019-6-19 17:16
老大,请问是否支持,外部sdram,看手册好像是支持fmc的。在做音频播放的时候,数据缓冲区放在axiram就可 ...

支持,这里有互联方式说明
QQ截图20190619171859.jpg

回复

使用道具 举报

13

主题

156

回帖

215

积分

高级会员

积分
215
发表于 2019-6-19 19:06:54 | 显示全部楼层
eric2013 发表于 2019-6-19 17:20
支持,这里有互联方式说明

我也是发现这里是支持的,所以就有点没搞懂。为什么我把从sd卡读取音频数据缓冲区开辟在外部sdram就不行(发现传输若干次,fread函数读不到数据,读到字节数是0),放在内部axiram是没有一点问题的。音频接口用i2s2、使用的DMA1 -> Stream4。老大给个方向吧
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2019-6-20 08:36:30 | 显示全部楼层
本五心 发表于 2019-6-19 19:06
我也是发现这里是支持的,所以就有点没搞懂。为什么我把从sd卡读取音频数据缓冲区开辟在外部sdram就不行 ...

把你用到的SDRAM区先关闭Cache测试下。
回复

使用道具 举报

13

主题

156

回帖

215

积分

高级会员

积分
215
发表于 2019-6-20 10:49:05 | 显示全部楼层
本帖最后由 本五心 于 2019-6-20 10:50 编辑
eric2013 发表于 2019-6-20 08:36
把你用到的SDRAM区先关闭Cache测试下。

当前就是关闭cache的,整个系统都没有使用cache,包括Sd卡。cache自己熟悉了一段时间,但是有时候,结果并非自己期望那样,可能还是不够了解,所里每次我都是添加一个功能,都是先完全关闭cache的,等测试几天没有问题,在搞cache。我是自己做了几块H7板子,每搞一个功能后,我都会在一块板上面测试几天。音频缓冲区开辟在AXIram中,我已测试几天,其中两个晚上都是一直循环播放到天亮。可以确定是没有问题。虽然说在AXIram中,是没有问题的,但是还是想找下外部sdram为什么不行。
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2019-10-10 14:49:41 | 显示全部楼层
学习了。一直在这个cubeMX里找怎么打开DMA到处看资料怎么打开DMA原来这个只用开启了SDMMC的中断就可以了啊。受教了!
回复

使用道具 举报

2

主题

38

回帖

44

积分

新手上路

积分
44
发表于 2021-3-31 15:56:43 | 显示全部楼层
爱了爱了 解决了一个大问题
回复

使用道具 举报

29

主题

97

回帖

184

积分

初级会员

积分
184
发表于 2021-3-31 22:33:46 | 显示全部楼层
我项目中直接使用的AXI SRAM 512K, 不过SD卡打的log用的另外的D2 SRAM
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 12:06 , Processed in 0.268367 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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