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

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才能够满足速度的要求吧,现在不知道怎么回事,探索中
 
tyller2011 回答时间:2015-4-28 13:46:45
你好,可否发下你的代码呢。因我现在只能实现usb功能下的U盘,fat无法移植成功,
夜惊风 回答时间:2017-11-11 20:15:35
帮顶了

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版