标题:
一个关于SD卡读写超时的话题
[打印本页]
作者:
taoran
时间:
2016-10-20 13:08
标题:
一个关于SD卡读写超时的话题
在基于
STM32 MCU
的应用开发中,经常会有人用到
SD
卡。有人发现在对
SD
卡进行读写时,偶尔会遇到
SD
卡读写失败的情况。尤其是单独对
SD
卡进行读写正常、或者非多任务环境下运行正常,而当
SD
读写跟其它程序代码混在一起或在多任务环境下运行时就容易发生异常。
比方如下情形:
1
、使用
STM32F4
的
SDIO
,用
CubeMX
配置。用
polling
模式的时候,出现
SD
卡写的时候卡死的情况。后来用
DMA
模式就好了。
2
、
STM32F746DISCO
开发板和官方
1.3.0
例程基础上使用了
FreeRTOS
系统,改为
DMA
传输后还是不稳定。后来把
SDIO
相关的
中断优先级别调高,
SDIO
中断设为
3
,
DMA
发送和接收的调为
4
,比
FreeRTOS
的系统用户级别高,解决问题。
3
、在
FreeRTOS+FatFs+STM32F429
的基础上。
A.
单个任务操作,
SD
卡读写没有问题
B.
多个任务,
SD
卡和
U
盘两个任务,优先级别一样,
SD
卡无法读写,
U
盘可以读写,调中断级别,调整堆栈大小都没有用。
C.
还是多任务,
SD
卡和
U
盘两个任务,甚至更多任务,只要把
SD
卡任务的优先级别调为最高,则
SD
卡,
U
盘读写都正常。
4
、使用
STM32
官方
SDIO
的
SD CARD
驱动的时候
,
单任务的时候没有出现错误
,
使用多任务的时候经常出现问题
,
表现为读取文件的时候没有问题
,
经常点击屏幕的时候就会出问题
,
最后通过仿真找到出错点就是读取数据向
SD
卡发送
CD17
命令时出现
SD_RX_OVERRUN
这个错误
,
产生原因为读取
FIFO
溢出
.
通过仿真与测试发现问题主要出现在读取过程中不能打断。
在两个读取函数里面
SD_ErrorSD_ReadMultiBlocks(u32 addr, u32 *readbuff, u16 BlockSize, u32NumberOfBlocks);SD_Error SD_ReadBlock(u32 addr, u32 *readbuff, u16BlockSize);
加上临界保护可以消除问题。同样写操作的时候也一样需要加临界保护。
以上罗列的情形,根本上讲因为
SD
卡读写过程中发生了超时错误导致读写异常。
应对措施视具体应用要求可能有所差异,最终目的都是为了避免SD卡读写过程中的超时错误
。比如将查询模式改为
DMA
模式、调整相关
SD
卡读写过程中所涉及中断的优先级、提升
SD
卡读写任务的优先级、将
SD
卡读写程序放在临界保护区运行或者在读写
SD
卡操作时关闭中断等。
我们可以从
SD
卡相关协议得知,在对
SD
卡进行读写操作时是有超时保护及约束机制的。对于标准卡和高容量卡的读写超时定义还有所差异。细节请参考
SD
卡相关规格书。
SD Specifications ----Physical Layer Simplified Specification
。
作者:
lijinqiu
时间:
2017-8-24 21:44
谢谢分享,最近也在调试sdcard!!
作者:
1113634577
时间:
2019-1-30 09:16
数据分段存储,每段喂狗,每段写入时间小于看门狗最大计时时间
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1