你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Cube+SDIO+FATFS使用时SD卡读块卡死问题!!

[复制链接]
adlu 提问时间:2016-3-26 14:59 /
10ST金币
本帖最后由 adlu 于 2016-3-26 15:09 编辑

MCU型号:STM32F407ZET6
开发软件:STM32CubeMX V4.11MDK V5

使用STM32CubeMX配置生成程序框架,使用SDIO 4bit模式操作SD卡,并配置了使用FATFS
截图如下
QQ图片20160326145521.png
QQ图片20160326145534.png

SDIO时钟分频系数为2,即SDIO_CK=48MHz/(2+2)=12MHz.SDIO其他配置默认。
QQ图片20160326145605.png
FATFS配置,仅改变CODE_PAGE为简体中文,其他默认。
a.png

问题描述:
SD卡读写操作时,经常出现卡死的情况。
通过J-Link调试,发现卡死时程序在HAL_SD_ReadBlocks()函数的两个语句之间来回运行,如下图。
b.png

  1.   /* Read block(s) in polling mode */
  2.   if(NumberOfBlocks > 1)
  3.   {
  4. 。。。
  5. }
  6.   else
  7.   {
  8.     /* Check for error conditions */
  9.     errorstate = SD_CmdResp1Error(hsd, SD_CMD_READ_SINGLE_BLOCK);
  10.    
  11.     if (errorstate != SD_OK)
  12.     {
  13.       return errorstate;
  14.     }   
  15.    
  16.     /* In case of single block transfer, no need of stop transfer at all */
  17. #ifdef SDIO_STA_STBITERR
  18.     while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR)) /*卡在此句1*/
  19. #else /* SDIO_STA_STBITERR not defined */
  20.     while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND))      
  21. #endif /* SDIO_STA_STBITERR */
  22.     {
  23.       if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF)) /*卡在此句2*/
  24.       {
  25.         /* Read data from SDIO Rx FIFO */
  26.         for (count = 0; count < 8; count++)
  27.         {
  28.           *(tempbuff + count) = SDIO_ReadFIFO(hsd->Instance);
  29.         }
  30.         
  31.         tempbuff += 8;
  32.       }
  33.     }
  34.   }
复制代码

降低SDIO的时钟或配置为1bit模式,也无法避免该现象的发生。

请高人指点迷津!!


最佳答案

查看完整内容

找到while(hsd->SdTransferCplt == 0)这个语句并屏蔽.... 你的SDIO global interrupt的优先级是多少? SDIO的Tx,Rx的DMA的中断优先级又是多少? 我也碰到你的问题,但我将SDIO global interrupt的优先级设置为小于或等于SDIO的Tx,Rx的DMA的中断优先级后,问题好像解决了。
收藏 3 评论17 发布时间:2016-3-26 14:59

举报

17个回答
任风吹吹 回答时间:2016-3-26 14:59:36
adlu 发表于 2016-3-30 18:21
已经解决。
CubeMX生成的代码SDIO polling模式可能真的有问题。
配置SDIO使用DMA模式,SDIO_RX和SDIO_TX配 ...

找到while(hsd->SdTransferCplt == 0)这个语句并屏蔽....

你的SDIO global interrupt的优先级是多少? SDIO的Tx,Rx的DMA的中断优先级又是多少?

我也碰到你的问题,但我将SDIO global interrupt的优先级设置为小于或等于SDIO的Tx,Rx的DMA的中断优先级后,问题好像解决了。
power568 回答时间:2016-3-26 15:45:51
adlu 回答时间:2016-3-26 17:12:27
power568 发表于 2016-3-26 15:45
参考 https://www.stmcu.org.cn/module/forum/thread-604576-1-1.html
,看能不能帮助你...

这个贴我看过,只是讲SD卡读写的基本操作。这部分操作我已经实现,包括FATFS对文件的读和写操作。
而且已经实现文件的读取,创建,写入,保存,删除等操作。

我遇到的问题是:很容易卡死在上面贴出的那两行代码中。
power568 回答时间:2016-3-27 23:39:47
明白,好像是什么状态不满足时卡死了,有没有可能是硬件原因,如信号不稳定等...
adlu 回答时间:2016-3-30 18:08:59
本帖最后由 adlu 于 2016-3-30 18:22 编辑

问题已解决。


adlu 回答时间:2016-3-30 18:21:12
本帖最后由 adlu 于 2016-3-30 18:23 编辑

已经解决。
CubeMX生成的代码SDIO polling模式可能真的有问题。
配置SDIO使用DMA模式,SDIO_RX和SDIO_TX配置相同。
a.jpg

生成代码,然后需要手动修改部分代码。
1.如果是用CubeMX 4.11及更早版本的,要修改stm32f4xx_hal_msp.c中HAL_SD_MspInit( )函数的两个DMA配置参数,将DMA_NORMAL改为DMA_PFCTRL。

2.修改sd_diskio.c中SD_read( )和SD_write( )函数,
分别将BSP_SD_ReadBlocks( )改为BSP_SD_ReadBlocks_DMA( );
将BSP_SD_WriteBlocks( )改为BSP_SD_WriteBlocks_DMA( ).

3.全局搜索SdTransferCplt变量,找到while(hsd->SdTransferCplt == 0)这个语句并屏蔽,否则会卡死在词句,我也不知道为什么。

经过上述步骤,就可以顺利的使用SDIO DMA功能进行SD卡读写了。
配合CubeMX生成的FATFS架构,就可以进行SD卡的文件操作了。目前未发现其他问题。

点评

谢谢分享!  发表于 2016-12-19 14:00
鹏果果 回答时间:2016-8-25 13:40:58
估计F103可以用来参考。先谢谢经验分享!
流畅的笔记 回答时间:2016-12-29 21:12:59
按照您的方法没有解决呢
小小超 回答时间:2016-12-30 08:30:42
谢谢分享!!!
adlu 回答时间:2017-1-2 08:53:37
本帖最后由 adlu 于 2017-1-2 08:55 编辑
任风吹吹 发表于 2016-12-30 16:14
找到while(hsd->SdTransferCplt == 0)这个语句并屏蔽....

你的SDIO global interrupt的优先级是多少? S ...

谢谢分享.
可能就是优先级的问题。CubeMX里面没有任何提示,或者自动设定这两个优先级的高低,所以只有自己试错才能知道。
zbber 回答时间:2017-1-2 11:46:16
明白,好像是什么状态不满足时卡死了,有没有可能是硬件原因,如信号不稳定等
5265325 回答时间:2017-1-3 09:42:55
流畅的笔记 回答时间:2017-1-5 14:30:42
按照楼上的方法改过系统优先级后DMA传输就可以了。
wuQAQ 回答时间:2017-2-10 02:41:21
弄了好久都每成功,你们有没有代码啊
12下一页

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版