硬汉嵌入式论坛

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

[SD/SDIO] SD+FATFS读写例程疑问

[复制链接]

51

主题

103

回帖

256

积分

高级会员

积分
256
发表于 2025-10-18 12:55:08 | 显示全部楼层 |阅读模式
本帖最后由 coolaimcu 于 2025-10-18 12:56 编辑

大家好!


最近在配置SDMMC2 +DMA+FATFS读写时,基于AXI-SRAM,MPU配置如下,红框中选的是disable, 怎么测试都不行,总是稀奇古怪的问题!
error.jpg

后来我把这个选项改成了Enable, 突然就可以了。我也稀里糊涂的不知道为什么,代码都是STM32CubeMX生成的,也没改动过。
无标题.jpg

另外,我参考了硬汉V7-025的例程,我发现sd_diskio_dmac.c文件中,提到bsp.c文件中已经将AXI SRAM设置为WT模式,写操作无需再手动操作Cache实现Clean,
cache.jpg

然后我看了下bsp.c文件,发现好像并没有配置AXI-SRAM的MPU,所以这个到底配置了没有,硬汉哥的这个例程是基于无MPU/Cache配置的吗?我对MPU/CACHE知识匮乏,不太懂,有点没看明白。
AXI.jpg

回复

使用道具 举报

51

主题

103

回帖

256

积分

高级会员

积分
256
 楼主| 发表于 2025-10-18 21:31:54 | 显示全部楼层
我后来又持续测试,发现了更多莫名其妙的问题! 后来我直接把cache关闭了,然后瞬间问题都没了! 所以我遇到的所有问题基本全是cache引起的, 这个cache太烦了!干脆不用了!
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
119430
QQ
发表于 2025-10-19 10:29:41 | 显示全部楼层
coolaimcu 发表于 2025-10-18 21:31
我后来又持续测试,发现了更多莫名其妙的问题! 后来我直接把cache关闭了,然后瞬间问题都没了! 所以我遇 ...

我那个是最低性能配置,仿真大家一致各种奇葩问题。

使用STM32H7的AXI SRAM,SRAM1到SRAM4对应的Cache最高性能和最低性能配置
https://forum.anfulai.cn/forum.p ... 9322&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

51

主题

103

回帖

256

积分

高级会员

积分
256
 楼主| 发表于 2025-10-20 10:52:51 | 显示全部楼层
eric2013 发表于 2025-10-19 10:29
我那个是最低性能配置,仿真大家一致各种奇葩问题。

使用STM32H7的AXI SRAM,SRAM1到SRAM4对应的Cache ...

好的,我现在直接关闭cache了,我也不懂,也搞不定,开了cache问题太多了,而且感觉SD时钟才25M,感觉开不开cache是不是都不影响,本身就不是很高速的东西
回复

使用道具 举报

25

主题

244

回帖

319

积分

高级会员

积分
319
QQ
发表于 2025-10-21 09:07:25 | 显示全部楼层
IsCacheable 决定是否开启 cache。
IsBufferable 决定是否将写入指令也使用 cache 缓冲后统一写入内存。如果不开启 IsCache 那么没有意义
IsShareable 决定是否采用严格的时序控制,这在外设的外设,例如 FMC 访问外部内存时非常重要,因为资源跨芯片了,需要开启严格时序。

屏幕截图 2025-10-21 085335.png

cache 需要结合合理的总线理解,不要跨域。例如你用 SDMMC2 在 D2 域总线,那 DMA 的 buffer 也开在 D2 域内存区是最好的。

几乎仅在 D1 域才不需要 SCB_CleanDCache_by_AddrSCB_InvalidateDCache_by_Addr 做命中。但是所有的 DMA 都不在 D1 域,所以都要做 InvalidateDCache ,这会引入两个循环使得 CPU 参与处理,反而丧失了 DMA 的优势。

因此 DMA 的 buffer 区都不要使用 cache。

我的应用是仅在 D1 域开启了 cache,不用手动 cache 维护,纯计算 buffer 都放在 D1 里,没有发现过 cache 引起的数据错误。
其他域和外设交互 buffer 做cache 维护引入循环,感觉并不会加速多少。



    /* 配置AXI SRAM的MPU属性为Write back, Read allocate,Write allocate
        最佳性能,用于CPU处理计算 */
    MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    MPU_InitStruct.BaseAddress      = 0x24000000;
    MPU_InitStruct.Size             = MPU_REGION_SIZE_512KB;
    MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;
    MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
    MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    MPU_InitStruct.Number           = MPU_REGION_NUMBER0;
    MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL1;
    MPU_InitStruct.SubRegionDisable = 0x00;
    MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;


回复

使用道具 举报

51

主题

103

回帖

256

积分

高级会员

积分
256
 楼主| 发表于 2025-10-21 10:19:35 | 显示全部楼层
yono 发表于 2025-10-21 09:07
IsCacheable 决定是否开启 cache。
IsBufferable 决定是否将写入指令也使用 cache 缓冲后统一写入内存。如 ...

谢谢大佬解惑
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-22 04:11 , Processed in 0.041963 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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