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

stm32f103+usb+fatfs联调问题

[复制链接]
日月当空-2044542 提问时间:2013-12-5 22:52 /
最近在做一个设备,使用stm32f103和mmc卡做的一个8G的U盘(其实是32G,因为usb是通信慢,为了格式化快点只用了8G),同时还添加了fatfs文件系统可以实时记录串口输入的数据。
U盘和fatfs文件系统不会同时工作,源代码没有在这台电脑上,基本流程是这样的,我将fatfs的写文件函数放在了
while(USB枚举成功否?)
{
if(串口1缓存有数据)
{ file1buf[cnt1++];
打开文件1,标记,不再重新打开
如果数据量大,则满512 写文件1
如果数据量小,或者文件结尾,计时器满1秒,写一次文件1
刷新文件1
}
if(串口2缓存有数据)
{ file2buf[cnt2++];
打开文件2,标记,不再重新打开
如果数据量大,则满512 写文件1
如果数据量小,或者文件结尾,计时器满1秒,写一次文件1
刷新文件2
}
}
if 文件1打开
关闭文件1
if文件2打开
关闭文件2
 
这样写发现同时打开三个文件程序直接跑飞,打开两个文件进行写会出现一些错误,程序很容易跑飞,初步判断是资源不够,缓存用的太多了,虽然程序编译没错,但是运行时就会出错,如果采用一个文件的方法,轮询的打开,记录,关闭,则会因为浪费时间而丢失数据。只打开一个文件记录一个串口的数据则不会丢数据,也不会出现异常。我直接使用的f_write函数而没有用f_puts函数,对f_puts函数的字符串如何组帧不太清楚,不知道有没有\0什么的,看程序感觉应该是用f_puts比较好一点,好像程序内部会有一个缓冲。
if(串口1缓存有数据)
{file1buf[cnt1++];
打开文件1
写文件1
关闭文件1
}
if(串口2缓存有数据)
{file2buf[cnt2++];
打开文件2
写文件2
关闭2
}
各位大侠,可曾有usb和fatfs同时使用过,一起交流一下,目前一路数据的记录已经没有问题,记录完可以在电脑上看见记录的数据,但是同时记录两路数据还存在困难,还望各位大神指点一二。
还有大神们可有改写好usb双缓冲的,我调试来着,结果有错误老是搞得我的电脑死机必须重启,所以先放下了,留着以后再弄。我看见有人将usb最大数据包长度改成了65536,而一般都是设置成64,我想问一下,如果我改成512是不是就可以直接按块读写mmc卡,而不需要去转换了?
问题比较多,也比较杂,还请见谅!
收藏 评论11 发布时间:2013-12-5 22:52

举报

11个回答
日月当空-2044542 回答时间:2013-12-5 22:56:10

回复:stm32f103+usb+fatfs联调问题

自己顶一个
日月当空-2044542 回答时间:2013-12-6 23:13:12

RE:stm32f103+usb+fatfs联调问题

今天串口中断使用乒乓缓存方式,直接将数据保存到文件里,这样就不会丢数据了。这样还能加大buf,应该可以做到4KB,这样就应该两路数据同时记录,不会丢数据了
日月当空-2044542 回答时间:2013-12-7 20:53:26

RE:stm32f103+usb+fatfs联调问题

无意中发现stm32给的usb程序竟然是usb1.0!!!
wkuang 回答时间:2013-12-7 21:30:33

RE:stm32f103+usb+fatfs联调问题

兄弟,你这么做是不是效率有点低,还有点不稳定,很容易丢数据。
提一个建议方案:
1、开10块接收缓存,用链表连接起来,在串口接收到数据的时候,将数据存储到缓存里。(缓存的数目按照需求定义)。
2、定义一个20ms的定时器,定时的将缓存链表的数据写入文件系统中。具体定时器的周期按照 一块缓存写入sd卡的时间来设定,最好每次最多能写几块缓存。
3、串口的优先级比定时器优先级要高,保证接受不丢数据。写入有缓存来保障。
dzc2001 回答时间:2013-12-9 22:53:39

RE:stm32f103+usb+fatfs联调问题

本来就算是usb1.0,是支持usb2.0的低速和全速,后面207支持高速也要外接上高速的phy
Hiker 回答时间:2013-12-10 10:07:41

RE:stm32f103+usb+fatfs联调问题

我在做项目也有同时使用SD,USB存储但是没有出现楼主所说的问题。
1,文件锁有被开起没;
2,长文件名被选中没;
3,中文字库集被支持没;
4,最大文件支持是多少。
日月当空-2044542 回答时间:2013-12-16 15:03:20

回复:stm32f103+usb+fatfs联调问题

回复第 5 楼 于2013-12-07 21:30:33发表:
兄弟,你这么做是不是效率有点低,还有点不稳定,很容易丢数据。
提一个建议方案:
1、开10块接收缓存,用链表连接起来,在串口接收到数据的时候,将数据存储到缓存里。(缓存的数目按照需求定义)。
2、定义一个20ms的定时器,定时的将缓存链表的数据写入文件系统中。具体定时器的周期按照 一块缓存写入sd卡的时间来设定,最好每次最多能写几块缓存。
3、串口的优先级比定时器优先级要高,保证接受不丢数据。写入有缓存来保障。
-------------------------------------------------------------------------------------------------------------------------------------------------------
效率是有点低,我同时打开两个文件,同时记录数据,每10秒刷新保存一次数据,当数据量大的时候就会出现丢数。只保存一个文件的时候不会丢数,我测试的是230400bps在全速率的时候的情况。
我原来也想过用定时器的方法保存数据,后来感觉使用while循环里面轮询,只要数据在2秒内满一个buf就直接写入文件(大数据量),如果两秒内不满,则查看当前使用的是哪个buf,有多少数据,然后就写数据,保存数据。我想这样可以在大数据量的时候尽量多的使用多块读写模式,我采用乒乓结构的buf是1KB的,即每路串口2k的缓存。(如果缓存开的太大了会导致USB枚举出错,设备会跑飞),我感觉应该是fatfs文件系统在同时操作两个文件的时候会耗费很多时间和资源,所以导致数据丢失。如果我试着加大缓存,丢数的情况会减轻,但会带来不稳定的隐患。
串口优先级我再好好看看,我设置PVD中断时发现,如果PVD中断设置成最高的,最先抢占最先响应模式,及时没有发生掉电也会影响到USB的通信。不知道串口的中断会不会带来什么其他的后果
 
日月当空-2044542 回答时间:2013-12-16 15:08:30

回复:stm32f103+usb+fatfs联调问题

回复第 6 楼 于2013-12-09 22:53:39发表:
本来就算是usb1.0,是支持usb2.0的低速和全速,后面207支持高速也要外接上高速的phy
说的对,stm32f103不支持usb2.0的高速,只能支持全速,但是全速的大容量存储器也太慢了,读只有230KB/s,写最大只有80KB/s。这样使用的时候U盘会反应很慢的,电脑读取U盘的目录的时候要等上很久,打开一个大文件也要等好久。听说使用USB双缓冲可以提高速度,但是我还没有搞明白是怎么弄
 
日月当空-2044542 回答时间:2013-12-16 15:13:07

回复:stm32f103+usb+fatfs联调问题

回复第 7 楼 于2013-12-10 10:07:41发表:
我在做项目也有同时使用SD,USB存储但是没有出现楼主所说的问题。
1,文件锁有被开起没;
2,长文件名被选中没;
3,中文字库集被支持没;
4,最大文件支持是多少。
 
文件操作正常,能读能写。USB也能正常通信,电脑能识别U盘,就是读写速度很慢,我用的是8G的U盘,不知道你用的是多大的,我直接使用fatfs记录数据,两路同时记录的时候就会出现丢数的现象。我感觉应该使用407才能够满足速度的要求吧,现在不知道怎么回事,探索中
 
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版