打印
[STM32F4]

2015-04-20 STM32F407 FreeRTOS+SD+FatFS调试小结

[复制链接]
18086|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wowow|  楼主 | 2015-4-21 10:20 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wowow 于 2015-4-22 17:13 编辑

前言:ST官方提供的STM32Cube大大减轻了开发的难度,不过bug还是有的。写下此文的目的一是感谢ST提供的开发包,二是为了提出自己发现问题期待改进,三是交流共同提高。时间有限,写得比较简略。
版本:CubeMX 4.7 + STM32Cube_FW_F4_V1.5.0生成的代码

配置:FreeRTOS + FatFS(SD卡) + FwIP + USB HID,其中FwIP和HID只做了初始化未使用。

本文主要记录要点和bug解决方案。要点:
1.STACK和HEAP大小
2.FatFS差一步f_mount()
3.多线程环境下读SD出现RX_OVERRUN Bug。
4.SD的DMA和中断相关设置
5.SDDMA中断服务程序中死锁的bug。
6读写性能
7疑问

1.用了文件系统STACK/HEAP和线程的STACK都要加大,否则会出溢出导致HardFault中断或其它奇怪的问题。具体要多大STACK待测,先弄大点。

2.FatFS+SD的使用:SD卡驱动已经跟一个盘绑定了,就差一步f_mount()就可以用了。基本的f_open,f_read, f_write例子很多不详叙。



3.Bug:反复读SD卡里的一个文件(360k大小)测试发现出错率很高(40%-60%,错了一定数量就一直是出错了)。关掉FwIP的线程就好很多(出错率0.1%-0.2%)。
最后发现SD_Read()调用的BSP_SD_ReadBlocks在多线程环境上会导致SD_RX_OVERRUN错误,需要将读写都改成DMA。


4 DMA设置:



中断设置:要开SDIO中断,缺省没开。



5死锁的bug:SD_DMA_RxCplt()一直在死等 while(hsd->SdTransferCplt == 0)
死锁原因:DMA的完成中断里死等SD完成的信号。此信号在SD中断里清除,而SD的中断跟DMA中断是同一优先级,无法抢占。
解决办法:
SD_DMA_RxCplt()里去掉 while(hsd->SdTransferCplt == 0)
SD_DMA_TxCplt()里去掉while(hsd->SdTransferCplt ==0)
为这点事调整中断优先级没必要。而且在中断里死等另一个信号这种写法本来就不可取。

6. 读写性能(主频168M,SD时钟48M分频到24M)
读速度测试,文件大小368,011,FreeRTOS无其它线程,DMA
  一次读大小
  
  测试次数
  
  平均时间(ms)
  
  最大时间
  
  平均速度
  
  512
  
  231
  
  326
  
  327
  
  1,128,868
  
  1024
  
  302
  
  200
  
  201
  
  1,840,055
  
  2048
  
  2005
  
  121
  
  122
  
  3,041,413
  
读写速度测试,文件大小368,011,FreeRTOS无其它线程,DMA
  一次读写大小
  
  测试次数
  
  平均时间(ms)
  
  最小时间
  
  最大时间
  
  平均速度
  
  512
  
  339
  
  1871
  
  未测
  
  3351
  
  393,384
  
  512
  
  246
  
  1636
  
  1353
  
  3342
  
  449,892
  
  1024
  
  254
  
  1176
  
  898
  
  2846
  
  625,870
  
  2048
  
  378
  
  771
  
  516
  
  2460
  
  954,633
  
看着最大时间和平均时间都有些高,实际JScope采集到的波形是这样的:(512第二次)


对比用USB读卡器在PC上测的结果:
读的速度512好一些,1024差一点,2k差了近25%。
写的速度差得太多。


7.疑问
1)DMA完成后 NDRT=FF7F或FF80,负数?但比较读写完生成的文件内容是对的。
2)SD 接收有128字节的FIFO,怎么这么容易就OVERRUN了?
3)SD读写的瓶颈在哪里?

沙发
peakwl| | 2015-4-21 14:11 | 只看该作者
:D

使用特权

评论回复
板凳
mmuuss586| | 2015-4-21 20:03 | 只看该作者

学习了;

使用特权

评论回复
地板
zh113214| | 2015-4-21 20:21 | 只看该作者
学习了,多谢楼主的总结分享

使用特权

评论回复
5
我爱你的吻123| | 2015-4-21 21:50 | 只看该作者
MARK!

使用特权

评论回复
6
wowow|  楼主 | 2015-4-22 14:58 | 只看该作者
有人能解答一下末尾的疑问吗?自己一个人折腾很费劲,期待能有人讨论。
刚调完了USB HID 鼠标部分,HAL里也有bug。。。。
文档还没写完,稍后再上传。

使用特权

评论回复
7
戈卫东| | 2015-4-22 15:48 | 只看该作者
图怎么出不来?

使用特权

评论回复
8
wowow|  楼主 | 2015-4-22 17:14 | 只看该作者

出了点问题,重新上传了。

使用特权

评论回复
9
wowow|  楼主 | 2015-4-22 17:18 | 只看该作者
caosix 发表于 2015-4-22 16:35
静待 楼主: 是否 给出 工程文件 呢?

请楼主:去掉 FreeRTOS 保留其余的部分!

HAL是开源的,我做的修改也开源出来。没时间对项目做裁减发布出来。想做些开源的项目,暂时没时间。

使用特权

评论回复
10
wowow|  楼主 | 2015-4-23 13:10 | 只看该作者
11
wnxyy| | 2015-5-6 09:46 | 只看该作者
mark

使用特权

评论回复
12
wnxyy| | 2015-5-6 09:46 | 只看该作者
wowow 发表于 2015-4-23 13:10
开源链接:
https://git.oschina.net/dingtu/STM32Cube_FW_F4_BugFix  
https://github.com/skywolf/STM32C ...

关注了群主的工程

使用特权

评论回复
13
ok666666z| | 2015-5-6 09:57 | 只看该作者
mark.

使用特权

评论回复
14
拼命三郎V5| | 2015-5-6 09:58 | 只看该作者
学习一下,标记一下

使用特权

评论回复
15
longfenghugui| | 2015-7-21 17:43 | 只看该作者
和楼主同样问题啊,我是刚开始不开任务调试,初始化之后进行FATFS操作,不能DMA中断,DMA WRITE之后的CHECK 不过,总是WHILE,开任务后,DMA进去了,也是和你一样等SDIO中断的置标志位,

但是我的中数据优先级已经是SDIO高于DMA了,不知道什么原因就是进不去SDIO中断,我的也是用的cube软件,唉!这种软件是好用,但是出了问题不好调啊,不知道他在哪里作什么不知道的设置

使用特权

评论回复
16
longfenghugui| | 2015-7-21 17:44 | 只看该作者

LZ  操作之后确定进入了SDIO中断了,求支援

使用特权

评论回复
17
longfenghugui| | 2015-7-22 09:43 | 只看该作者
已解决

使用特权

评论回复
18
lkl0305| | 2015-10-7 00:01 | 只看该作者
多谢分享

使用特权

评论回复
19
mf1111| | 2015-10-11 19:17 | 只看该作者
楼主,我在cube中用spi flash做,可是mount不成功,每次返回13

使用特权

评论回复
20
foxglove| | 2015-11-2 16:11 | 只看该作者
CubeMX FreeRTOS FatFS(SD卡)  FwIP  USB HID

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:skywolf.github.io

59

主题

649

帖子

3

粉丝