OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3563|回复: 11

STM32F407的host做U盘存储 卡顿 丢帧,求指教

[复制链接]

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2016-7-25
在线时间
29 小时
发表于 2019-12-3 10:32:37 | 显示全部楼层 |阅读模式
5金钱
原子哥,我用F407的host做U盘存储,数据出现卡顿、丢帧。前端用的ADC采集电压,将数据存在U盘后,我用MATLAB画出来,出现下图的情况。
求大神指教!!!!!!感激不尽!!!!!

卡顿丢帧图像

卡顿丢帧图像


最佳答案

查看完整内容[请看2#楼]

在MCU内部,先做缓冲,比如做2个4K字节的缓冲,甚至10个4K字节的缓冲,然后数据先写入缓冲区,等有缓冲区有数据的时候,再把缓冲区数据写入U盘,如果U盘写入未完成,则新数据填充到下一个缓冲区,等待U盘写入完成,清空这个缓冲,这样就可以组成一个环形队列,缓冲区的个数,取决于实际使用效果。但是肯定是可以解决这个问题的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-12-3 10:32:38 | 显示全部楼层
竹叶青123 发表于 2019-12-5 10:32
原子哥,我现在是用的就是后者,并且已经确定了问题所在点,就是卡顿在这个函数上,运行时候时不时的不流 ...

在MCU内部,先做缓冲,比如做2个4K字节的缓冲,甚至10个4K字节的缓冲,然后数据先写入缓冲区,等有缓冲区有数据的时候,再把缓冲区数据写入U盘,如果U盘写入未完成,则新数据填充到下一个缓冲区,等待U盘写入完成,清空这个缓冲,这样就可以组成一个环形队列,缓冲区的个数,取决于实际使用效果。但是肯定是可以解决这个问题的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14410
金钱
14410
注册时间
2018-8-3
在线时间
1156 小时
发表于 2019-12-3 10:53:48 | 显示全部楼层
直接用原子的U盘例程 能不能正常
回复

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2016-7-25
在线时间
29 小时
 楼主| 发表于 2019-12-3 11:56:14 | 显示全部楼层
是用原子的例程修改来用的,结果发现了这个问题,并且不同U盘结果也不一样,兼容性感觉很差,不知道哪里除了原因,没思路了
回复

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2016-7-25
在线时间
29 小时
 楼主| 发表于 2019-12-3 11:56:54 | 显示全部楼层
翼行园子 发表于 2019-12-3 10:53
直接用原子的U盘例程 能不能正常

是用原子的例程修改来用的,结果发现了这个问题,并且不同U盘结果也不一样,兼容性感觉很差,不知道哪里除了原因,没思路了
回复

使用道具 举报

6

主题

1127

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1656
金钱
1656
注册时间
2019-8-15
在线时间
102 小时
发表于 2019-12-3 13:53:28 | 显示全部楼层
帮顶                             
成功没有捷径
回复

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2016-7-25
在线时间
29 小时
 楼主| 发表于 2019-12-4 08:51:53 | 显示全部楼层
不要沉了下,自己顶一下。另外,U盘存储那个程序是在中断中执行,设备连接成功就开始存储?那么什么时候更新一次呢,就是什么flag的时候才开始进行下一次的一个数组的存储?
回复

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2016-7-25
在线时间
29 小时
 楼主| 发表于 2019-12-4 13:24:44 | 显示全部楼层
操作U盘的时候,u8 USBH_UDISK_Write(u8* buf,u32 sector,u32 cnt) 和u8 mf_write(u8*dat,u16 len)这俩有什么区别呢?文档中有写【USBH_UDISK_Read和USBH_UDISK_Write这两个函数,用于U盘读写,从指定扇区地址读写指定个数的扇区数据,这两个函数,再配合fatfs,即可实现对U盘的文件读写访问。】但是没有找到具体应用的例程。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-12-5 02:15:15 | 显示全部楼层
竹叶青123 发表于 2019-12-4 13:24
操作U盘的时候,u8 USBH_UDISK_Write(u8* buf,u32 sector,u32 cnt) 和u8 mf_write(u8*dat,u16 len)这 ...

前者直接操作U盘。
后者通过文件系统操作U盘。
建议一般用后者。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2016-7-25
在线时间
29 小时
 楼主| 发表于 2019-12-5 10:32:47 | 显示全部楼层
正点原子 发表于 2019-12-5 02:15
前者直接操作U盘。
后者通过文件系统操作U盘。
建议一般用后者。

原子哥,我现在是用的就是后者,并且已经确定了问题所在点,就是卡顿在这个函数上,运行时候时不时的不流畅,请问是什么问题,有优化方法吗?
回复

使用道具 举报

8

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
金钱
292
注册时间
2018-8-14
在线时间
37 小时
发表于 2019-12-6 07:40:24 | 显示全部楼层
我感觉像是硬件的的问题,软件不行只会出现写失败或者写成功,不会出现写错的情况吧,
回复

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2016-7-25
在线时间
29 小时
 楼主| 发表于 2019-12-6 08:41:42 | 显示全部楼层
正点原子 发表于 2019-12-6 02:41
在MCU内部,先做缓冲,比如做2个4K字节的缓冲,甚至10个4K字节的缓冲,然后数据先写入缓冲区,等有缓冲区 ...

恩恩,好的原子哥,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 20:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表