本帖最后由 adlu 于 2016-3-26 15:09 编辑
MCU型号:STM32F407ZET6 开发软件:STM32CubeMX V4.11,MDK V5
使用STM32CubeMX配置生成程序框架,使用SDIO 4bit模式操作SD卡,并配置了使用FATFS。 截图如下
SDIO时钟分频系数为2,即SDIO_CK=48MHz/(2+2)=12MHz.SDIO其他配置默认。 FATFS配置,仅改变CODE_PAGE为简体中文,其他默认。
问题描述: SD卡读写操作时,经常出现卡死的情况。 通过J-Link调试,发现卡死时程序在HAL_SD_ReadBlocks()函数的两个语句之间来回运行,如下图。
- /* Read block(s) in polling mode */
- if(NumberOfBlocks > 1)
- {
- 。。。
- }
- else
- {
- /* Check for error conditions */
- errorstate = SD_CmdResp1Error(hsd, SD_CMD_READ_SINGLE_BLOCK);
-
- if (errorstate != SD_OK)
- {
- return errorstate;
- }
-
- /* In case of single block transfer, no need of stop transfer at all */
- #ifdef SDIO_STA_STBITERR
- while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR)) /*卡在此句1*/
- #else /* SDIO_STA_STBITERR not defined */
- while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND))
- #endif /* SDIO_STA_STBITERR */
- {
- if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF)) /*卡在此句2*/
- {
- /* Read data from SDIO Rx FIFO */
- for (count = 0; count < 8; count++)
- {
- *(tempbuff + count) = SDIO_ReadFIFO(hsd->Instance);
- }
-
- tempbuff += 8;
- }
- }
- }
复制代码
降低SDIO的时钟或配置为1bit模式,也无法避免该现象的发生。
请高人指点迷津!!
|
找到while(hsd->SdTransferCplt == 0)这个语句并屏蔽....
你的SDIO global interrupt的优先级是多少? SDIO的Tx,Rx的DMA的中断优先级又是多少?
我也碰到你的问题,但我将SDIO global interrupt的优先级设置为小于或等于SDIO的Tx,Rx的DMA的中断优先级后,问题好像解决了。
,看能不能帮助你...
这个贴我看过,只是讲SD卡读写的基本操作。这部分操作我已经实现,包括FATFS对文件的读和写操作。
而且已经实现文件的读取,创建,写入,保存,删除等操作。
我遇到的问题是:很容易卡死在上面贴出的那两行代码中。
问题已解决。
已经解决。
CubeMX生成的代码SDIO polling模式可能真的有问题。
配置SDIO使用DMA模式,SDIO_RX和SDIO_TX配置相同。
生成代码,然后需要手动修改部分代码。
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卡的文件操作了。目前未发现其他问题。
点评
谢谢分享.
可能就是优先级的问题。CubeMX里面没有任何提示,或者自动设定这两个优先级的高低,所以只有自己试错才能知道。