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

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
lzp2009 回答时间:2016-8-25 13:40:58
估计F103可以用来参考。先谢谢经验分享!
流畅的笔记 回答时间:2016-12-29 21:12:59
按照您的方法没有解决呢
ts2000 回答时间:2016-12-30 08:30:42
谢谢分享!!!
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版