硬汉嵌入式论坛

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

继续提升STM32F4的4线SDIO DMA方式的读写稳定性,发布新版案例(2020-06-30)

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2020-6-30 13:50:26 | 显示全部楼层 |阅读模式
V6-106a_FatFS文件系统例程(SD卡 V1.1).rar (5.88 MB, 下载次数: 1240)

1、请使用这里的小软件做SD卡格式化:
     SD卡联盟发布的SD/SDHC/SDXC格式化小软件V5.0.1
     http://www.armbbs.cn/forum.php?mod=viewthread&tid=96181

2、解决DMA的4字节对齐问题,通过DMA FIFO方式的收发位宽设置解决
3、解决DMA突发传输的1KB边界问题。
1.jpg

4、解决一个bug:



稳定性测试:
连续测试20次2MB文件的读写,全部正确无错误。

2020-06-30_134948.png




评分

参与人数 2金币 +30 收起 理由
missfox + 20 赞一个!
morning_enr6U + 10 很给力!

查看全部评分

回复

使用道具 举报

11

主题

43

回帖

76

积分

初级会员

积分
76
发表于 2020-6-30 15:42:23 | 显示全部楼层
@硬汉哥 能同步出个F407的版本吗 好像F407也有类似问题
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2020-6-30 15:57:22 | 显示全部楼层
mexico007 发表于 2020-6-30 15:42
@硬汉哥 能同步出个F407的版本吗 好像F407也有类似问题

F407和F429的SDIO一样的,直接复制就可以使用,注意你使用的引脚
回复

使用道具 举报

11

主题

43

回帖

76

积分

初级会员

积分
76
发表于 2020-6-30 16:05:46 | 显示全部楼层
@硬汉哥 还有个比较纠结的问题1. 用FATFS操作SD卡 是不是f_open打开文件的情况下 突然掉电 就会出现SD损坏的情况 还是只有在f_write时 才会出现SD卡损坏 2.如果我是f_open的情况下 突然掉电 会出现什么问题吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2020-6-30 16:10:45 | 显示全部楼层
mexico007 发表于 2020-6-30 16:05
@硬汉哥 还有个比较纠结的问题1. 用FATFS操作SD卡 是不是f_open打开文件的情况下 突然掉电 就会出现SD损坏 ...

FATFS不支持掉电保护,这个不太好整,如果仅仅是读取,不用大小,只有写入才会出问题了,特别是FatFS处理FAT表阶段出问题。

如果你的设备有可能发生掉电问题,几个思路
1、使用支持掉电保护的,如RL-FlashFS,FileX等
2、硬件上加个超级电容啥的,掉电了及时处理。
3、使用FatFS给的简易处理思路,一定程度上降低掉电造成的异常:


http://elm-chan.org/fsw/ff/doc/appnote.html

1.jpg



回复

使用道具 举报

23

主题

1404

回帖

1473

积分

至尊会员

积分
1473
发表于 2020-7-1 09:02:35 | 显示全部楼层
超赞
代码不规范,亲人两行泪!
回复

使用道具 举报

11

主题

43

回帖

76

积分

初级会员

积分
76
发表于 2020-7-7 15:12:58 | 显示全部楼层
@硬汉哥 请求能将你上面第二点和第三点更改的地方批注出来吗 我下载了代码 刷了半天 没看到不同点 可能太多 一一对比 眼镜看不过来了 麻烦 谢谢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2020-7-7 16:03:36 | 显示全部楼层
mexico007 发表于 2020-7-7 15:12
@硬汉哥 请求能将你上面第二点和第三点更改的地方批注出来吗 我下载了代码 刷了半天 没看到不同点 可能太多 ...

在DMA配置的地方,有区别。
回复

使用道具 举报

11

主题

43

回帖

76

积分

初级会员

积分
76
发表于 2020-7-7 16:18:24 | 显示全部楼层
@硬汉哥 void SD_LowLevel_DMA_TxConfig(uint32_t *BufferSRC, uint32_t BufferSize) 是这个函数吗 可以具体点吗
回复

使用道具 举报

11

主题

43

回帖

76

积分

初级会员

积分
76
发表于 2020-7-7 16:19:53 | 显示全部楼层
@硬汉哥 void SD_LowLevel_DMA_TxConfig(uint32_t *BufferSRC, uint32_t BufferSize) 请问是这个函数吗? 找了半天就是这个DMA 还有这个是解决了以上第二点第三点两个问题?
回复

使用道具 举报

11

主题

43

回帖

76

积分

初级会员

积分
76
发表于 2020-7-7 16:29:49 | 显示全部楼层
void SD_LowLevel_DMA_RxConfig(uint32_t *BufferDST, uint32_t BufferSize) 就发现这个函数有一条设置不一样 硬汉哥 你最新版改的是SDDMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;原来的版本是SDDMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_INC4;就改了这边吗?
回复

使用道具 举报

11

主题

43

回帖

76

积分

初级会员

积分
76
发表于 2020-7-8 09:35:22 | 显示全部楼层
@硬汉哥 请求解惑 因为第二点 第三点还是蛮重要的 我想搞清楚硬汉哥是怎么解决的 理解一下原理
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2020-7-8 11:51:38 | 显示全部楼层
mexico007 发表于 2020-7-7 16:29
void SD_LowLevel_DMA_RxConfig(uint32_t *BufferDST, uint32_t BufferSize) 就发现这个函数有一条设置不一 ...

对,就是修改的这些。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2020-7-8 11:53:20 | 显示全部楼层
mexico007 发表于 2020-7-8 09:35
@硬汉哥 请求解惑 因为第二点 第三点还是蛮重要的 我想搞清楚硬汉哥是怎么解决的 理解一下原理

这个后来不断实践中发现的。
回复

使用道具 举报

5

主题

20

回帖

35

积分

新手上路

积分
35
发表于 2020-7-31 09:32:02 | 显示全部楼层
@硬汉哥 能不能研究下F4的HAL库SDIO+DMA,我遇到读写multiblock很慢的问题(调用函数:HAL_SD_WriteBlocks_DMA()、HAL_SD_ReadBlocks_DMA()、HAL_SD_GetCardState()),先用HAL_SD_WriteBlocks_DMA/HAL_SD_ReadBlocks_DMA很快返回OK,然后调用HAL_SD_GetCardState,要等好几秒才能返回传输完成状态,如果只用1block的方式就很快返回完成状态,但是整体读写速度又会慢
回复

使用道具 举报

5

主题

20

回帖

35

积分

新手上路

积分
35
发表于 2020-7-31 09:41:54 | 显示全部楼层
@硬汉哥 能不能研究下F4 HAL库SDIO DMA的,我遇到读写MultiBlock,调用HAL_SD_GetCardState轮询传输完成状态有时要几秒才返回完成,SINGLE_BLOCK就能很快,但会影响整体速度
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2020-7-31 10:48:26 | 显示全部楼层
rnjack 发表于 2020-7-31 09:32
@硬汉哥 能不能研究下F4的HAL库SDIO+DMA,我遇到读写multiblock很慢的问题(调用函数:HAL_SD_WriteBlocks_ ...

好的,近期做第3版emWin会配套上HAL SDIO的模板。
回复

使用道具 举报

5

主题

20

回帖

35

积分

新手上路

积分
35
发表于 2020-7-31 13:32:11 | 显示全部楼层
问题解决了,参考你这个例子http://www.armbbs.cn/forum.php?m ... ighlight=SDIO%2BDMA,先判断DMA完成状态,再调用HAL_SD_GetCardState
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2020-7-31 15:35:54 | 显示全部楼层
rnjack 发表于 2020-7-31 13:32
问题解决了,参考你这个例子http://www.armbbs.cn/forum.php?mod=viewthread&tid=96817&highlight=SDIO%2BD ...

好的
回复

使用道具 举报

12

主题

59

回帖

95

积分

初级会员

积分
95
发表于 2023-3-21 10:23:38 | 显示全部楼层
不太明白为什么Write block等待却是 SD_WaitReadOperation????
为啥呀
回复

使用道具 举报

12

主题

59

回帖

95

积分

初级会员

积分
95
发表于 2023-3-21 10:35:59 | 显示全部楼层
看了老哥的代码 SDIO_FLAG_TXUNDERR并没有配置的地方呀
回复

使用道具 举报

12

主题

59

回帖

95

积分

初级会员

积分
95
发表于 2023-3-21 10:36:57 | 显示全部楼层
  SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_RXOVERR | SDIO_IT_STBITERR, ENABLE);
是这里吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2023-3-21 10:38:32 | 显示全部楼层
pjzmj2012 发表于 2023-3-21 10:23
不太明白为什么Write block等待却是 SD_WaitReadOperation????
为啥呀

认真看帖


下载+(3).png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2023-3-21 10:45:09 | 显示全部楼层
pjzmj2012 发表于 2023-3-21 10:35
看了老哥的代码 SDIO_FLAG_TXUNDERR并没有配置的地方呀

我没有改这个,这个是是坛友提的问题。

此贴14楼。

F4系列标准库库SDIO的FatFS例子修改一个bug,可提升4线SDIO的DMA稳定性
https://www.armbbs.cn/forum.php? ... 4492&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 17:15 , Processed in 0.271037 second(s), 37 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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