硬汉嵌入式论坛

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

[SD/SDIO] STM32H7的SDIO自带DMA处理4字节对齐代码的配套工程

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2020-9-25 00:59:25 | 显示全部楼层 |阅读模式


这几个例子里面都已经做了处理:

处理思路就是底层的读写函数里面如果地址是4字节对齐的,不做处理,如果不是对齐,通过复制到一个4字节对齐的缓冲里面做DMA传递。

基于STM32H7的uCOS-III + FatFS + emWin + ST USB的综合模板下载
http://www.armbbs.cn/forum.php?mod=viewthread&tid=100125

基于STM32H7的FreeRTOS+ FatFS + emWin + ST USB的综合模板下载
http://www.armbbs.cn/forum.php?mod=viewthread&tid=100127

基于STM32H7的uCOS-II + FatFS + emWin + ST USB的综合模板下载
http://www.armbbs.cn/forum.php?mod=viewthread&tid=100126


其实有个更简单,性能也最高的解决办法,核心思想如下:

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

所以用户要做的就是直接定义个4字节对齐的读写缓冲区即可。



回复

使用道具 举报

2

主题

58

回帖

74

积分

初级会员

积分
74
发表于 2020-9-25 08:49:40 | 显示全部楼层
给出的高性能解决方法,需要改FatFs
回复

使用道具 举报

2

主题

58

回帖

74

积分

初级会员

积分
74
发表于 2020-9-25 08:51:01 | 显示全部楼层
文末给出的高性能思路,是需要改FatFs源码吧
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2020-9-25 10:47:05 | 显示全部楼层
Jmhh247 发表于 2020-9-25 08:49
给出的高性能解决方法,需要改FatFs

不用,就是用户调用函数f_write和f_read的时候不是有个buf参数么,将这个参数地址设置为4字节对齐。
回复

使用道具 举报

2

主题

58

回帖

74

积分

初级会员

积分
74
发表于 2020-9-25 11:20:39 | 显示全部楼层
eric2013 发表于 2020-9-25 10:47
不用,就是用户调用函数f_write和f_read的时候不是有个buf参数么,将这个参数地址设置为4字节对齐。

多谢,那这确实很方便了。
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2020-9-25 14:43:47 | 显示全部楼层
这个思路不错,晚上回去试试。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2020-9-25 17:13:20 | 显示全部楼层
Jmhh247 发表于 2020-9-25 11:20
多谢,那这确实很方便了。

回复

使用道具 举报

17

主题

70

回帖

121

积分

初级会员

积分
121
发表于 2020-10-14 17:11:15 | 显示全部楼层
使用上面的freertos模板,在H750 480MHZ的SDMMC2上,改了IO口和分频=4.DMA读的时候进HAL_SD_IRQHandler总是提示HAL_SD_ERROR_RX_OVERRUN。请问可能是什么原因造成的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2020-10-15 02:48:25 | 显示全部楼层
1314一路向前 发表于 2020-10-14 17:11
使用上面的freertos模板,在H750 480MHZ的SDMMC2上,改了IO口和分频=4.DMA读的时候进HAL_SD_IRQHandler总是 ...

主频设置为400,仅修改IO,测下是否正常。
回复

使用道具 举报

17

主题

70

回帖

121

积分

初级会员

积分
121
发表于 2020-10-15 10:57:18 | 显示全部楼层
并没什么用,我再把sdmmc_CK频率往下降都没用。我用的是SDMMC2,好像也不需要专门设置AXI SRAM啊。外部上拉也是有的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2020-10-15 11:12:45 | 显示全部楼层
1314一路向前 发表于 2020-10-15 10:57
并没什么用,我再把sdmmc_CK频率往下降都没用。我用的是SDMMC2,好像也不需要专门设置AXI SRAM啊。外部上拉 ...

你用的SDMMC2,中断改了没。
回复

使用道具 举报

17

主题

70

回帖

121

积分

初级会员

积分
121
发表于 2020-10-15 11:31:48 | 显示全部楼层
改了的,已经进去中断了。就是在中断里面检测到HAL_SD_ERROR_RX_OVERRUN的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2020-10-15 13:05:55 | 显示全部楼层
1314一路向前 发表于 2020-10-15 11:31
改了的,已经进去中断了。就是在中断里面检测到HAL_SD_ERROR_RX_OVERRUN的。

别的问题不清楚了。
回复

使用道具 举报

17

主题

70

回帖

121

积分

初级会员

积分
121
发表于 2020-10-15 14:57:37 | 显示全部楼层
搞定了,是我用了DTCM导致的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2020-10-15 16:19:17 | 显示全部楼层
1314一路向前 发表于 2020-10-15 14:57
搞定了,是我用了DTCM导致的

补张图,方便其他坛友看
QQ截图20201015161913.png
回复

使用道具 举报

2

主题

28

回帖

34

积分

新手上路

积分
34
发表于 2020-12-10 09:53:00 | 显示全部楼层
硬汉大哥,我现在遇到的问题是,我只要不是对齐的访问,比如是奇数,读取出来的数据就是错位的。
我用的芯片DMA没有FIFO,搞了很久,方法试了个遍。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2020-12-10 10:35:14 | 显示全部楼层
终极菜鸟 发表于 2020-12-10 09:53
硬汉大哥,我现在遇到的问题是,我只要不是对齐的访问,比如是奇数,读取出来的数据就是错位的。
我用的芯 ...

你用的是那款芯片。
回复

使用道具 举报

2

主题

28

回帖

34

积分

新手上路

积分
34
发表于 2020-12-10 13:39:22 | 显示全部楼层
eric2013 发表于 2020-12-10 10:35
你用的是那款芯片。

我用的AT403
我测试了,没有办法,只要f_seek 函数偏移量不是四个字节对齐,或者是奇数,就必然错位。
我现在只有提前计算判断,对齐四字节访问,目前测试才算正常,这个BUG,我搞了三天。
我也尝试修改 DMA 修改为读取缓冲为字节单位, 但是不成功。
我怀疑是DMA不支持这样用法,或者是DMA功能太弱。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2020-12-10 14:19:55 | 显示全部楼层
终极菜鸟 发表于 2020-12-10 13:39
我用的AT403
我测试了,没有办法,只要f_seek 函数偏移量不是四个字节对齐,或者是奇数,就必然错位。
...

这个有参考,不过STM32的。

继续提升STM32F4的4线SDIO DMA方式的读写稳定性,发布新版案例(2020-06-30)
http://www.armbbs.cn/forum.php?m ... 8560&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

9

主题

31

回帖

58

积分

初级会员

积分
58
发表于 2023-5-19 21:37:44 | 显示全部楼层
eric2013 发表于 2020-10-15 16:19
补张图,方便其他坛友看

哎呀,我也中计了,还中了两次,我usb和sdmmc都是用的dtcm。
谢谢大佬们
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 16:25 , Processed in 0.353977 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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