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

一个关于SD卡读写超时的话题

[复制链接]
STMCU小助手 发布时间:2021-2-4 13:29
一个关于SD卡读写超时的话题
5 w0 y  J6 n0 X6 b+ t- K
在基于STM32 MCU的应用开发中,经常会有人用到SD卡。有人发现在对SD卡进行读写时,偶尔会遇到SD卡读写失败的情况。尤其是单独对SD卡进行读写正常、或者非多任务环境下运行正常,而当SD读写跟其它程序代码混在一起或在多任务环境下运行时就容易发生异常。比方如下情形:

, z/ i) C* Z+ m/ V0 `( V
1、使用STM32F4的SDIO,用CubeMX配置。用polling模式的时候,出现SD卡写的时候卡死的情况。后来用DMA模式就好了。
9 d4 M2 K3 n& l7 s! y- @, u
2、STM32F746DISCO开发板和官方1.3.0例程基础上使用了FreeRTOS系统,改为DMA传输后还是不稳定。后来把SDIO相关的中断优先级别调高,SDIO中断设为3,DMA发送和接收的调为4,比FreeRTOS的系统用户级别高,解决问题。

# I! p; _( c# H$ B( r7 b
3、在FreeRTOS+FatFs+STM32F429的基础上。
A.单个任务操作,SD卡读写没有问题
B.多个任务,SD卡和U盘两个任务,优先级别一样,SD卡无法读写,U盘可以读写,调中断级别,调整堆栈大小都没有用。
C.还是多任务,SD卡和U盘两个任务,甚至更多任务,只要把SD卡任务的优先级别调为最高,则SD卡,U盘读写都正常。
$ J" G$ N. N; i8 _# |! S- G
4、使用STM32官方SDIO的SD CARD驱动的时候,单任务的时候没有出现错误,使用多任务的时候经常出现问题,表现为读取文件的时候没有问题,经常点击屏幕的时候就会出问题,最后通过仿真找到出错点就是读取数据向SD卡发送CD17命令时出现SD_RX_OVERRUN这个错误,产生原因为读取FIFO溢出. 通过仿真与测试发现问题主要出现在读取过程中不能打断。
& n, Y# k  J4 D2 n* v4 t# I/ ~" I
在两个读取函数里面SD_ErrorSD_ReadMultiBlocks(u32addr, u32 *readbuff, u16 BlockSize, u32NumberOfBlocks);SD_Error SD_ReadBlock(u32addr, u32 *readbuff, u16BlockSize); 加上临界保护可以消除问题。同样写操作的时候也一样需要加临界保护。

+ f3 a3 S* T6 ^7 }" K
以上罗列的情形,根本上讲因为SD卡读写过程中发生了超时错误导致读写异常。应对措施视具体应用要求可能有所差异,最终目的都是为了避免SD卡读写过程中的超时错误。比如将查询模式改为DMA模式、调整相关SD卡读写过程中所涉及中断的优先级、提升SD卡读写任务的优先级、将SD卡读写程序放在临界保护区运行或者在读写SD卡操作时关闭中断等。

+ y; z" Y- @0 W: _& w
我们可以从SD卡相关协议得知,在对SD卡进行读写操作时是有超时保护及约束机制的。对于标准卡和高容量卡的读写超时定义还有所差异。细节请参考SD卡相关规格书。
, J( J) s' T4 C7 y) `6 j- B7 L4 z
SD Specifications ----Physical LayerSimplified Specification。

: y7 ~, H' q+ F' c
4.1.png
4.2.jpg
4.3.jpg

) ^; i& n4 Z: X9 b6 _; b
文章出处: 茶话MCU
/ U0 ~. r6 j' y7 ~$ q$ n2 B5 M
赞 收藏 2 评论0 发布时间:2021-2-4 13:29

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版