打印

基于STM32F103的USB VCD代码

[复制链接]
13371|52
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vigia|  楼主 | 2010-7-30 16:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ST官网上的USB VCD例程总是有问题

我改了一个,今天测试了下,115200BPS下10MB字节无差错。应该还可以了。

放在这里大家共享下。

VCD V2.0.0.zip (309.63 KB)

这个例子我在ST的新三合一板子上跑的,这块板子的USB上拉电阻的使能管脚是PA8,所以如果要在其他板子上跑,要根据自己的板子改下这个使能管脚。


还有,这个例子是在IAR5.5上改的,所以建议在IAR5.5下打开项目,如果是IAR5.5以下版本,可能会丢失项目的配置信息。
沙发
mcu5i51| | 2010-7-31 08:59 | 只看该作者
怎么用呀,还是顶一下,最好上图或说明

使用特权

评论回复
板凳
henry_wu001| | 2010-7-31 17:27 | 只看该作者
iar都5.5拉,
usb转串口,PC上会多出一个串口来,如果多个设备插入同一pc,pc上就会多出许多串口,
有无办法把同一类型的设备只用同一个串口呢?

使用特权

评论回复
地板
香水城| | 2010-8-1 12:11 | 只看该作者
如果把同一类型的设备只用同一个串口,你如何区分不同的设备?

使用特权

评论回复
5
流行音乐| | 2010-8-1 18:25 | 只看该作者
收下了,感谢分享。

使用特权

评论回复
6
icecut| | 2010-8-3 13:48 | 只看该作者
vcd是什么意思

老版本的某个破开发板带的代码竟然usb转串口有问题.已经找到.

新版本的下载了.还没试试.

使用特权

评论回复
7
mcuisp| | 2010-8-4 11:21 | 只看该作者
用同一个序列号就可以了。
不过这样弄不能同时存在。

使用特权

评论回复
8
vigia|  楼主 | 2010-8-7 09:52 | 只看该作者
說明一下

本例程實現了一個USB虛擬串口

上位機可以通過串口應用程序如HyperTerminal與設備通信。

上位機通過USB發給STM32的數據,STM32將立刻通過USART1發給外部的其他設備。外部的其他設備通過USART1發給STM32數據,STM32在每5個SOF(即每5毫秒)后,檢查是否有收到USART1的數據,如有數據則通過USB發送給上位機。

使用特权

评论回复
9
无冕之王| | 2010-8-8 09:05 | 只看该作者
楼主能给个相应的说明就更好了

使用特权

评论回复
10
火箭球迷| | 2010-8-8 09:40 | 只看该作者
很不错,多谢共享

使用特权

评论回复
11
Simon21ic| | 2010-8-8 10:27 | 只看该作者
对一次调用write发送的数据长度有限制吗?
比如,我一次调用串口write,写10M的数据。

使用特权

评论回复
12
yybj| | 2010-8-8 14:46 | 只看该作者
给个说明吧

使用特权

评论回复
13
vigia|  楼主 | 2010-8-9 10:24 | 只看该作者
本帖最后由 vigia 于 2010-8-9 10:26 编辑
对一次调用write发送的数据长度有限制吗?
比如,我一次调用串口write,写10M的数据。
Simon21ic 发表于 2010-8-8 10:27


对于设备来说,一次USB通信最多收到64字节数据,然后通过USART发送出去,在USART发送期间,设备将一直以NAK响应主机,直到USART发送64字节数据完毕,设备可以接收下一个数据包。

所以如果USART很慢,比如2400bps,这个NAK期间会比较长,我不太清楚USB虚拟串口驱动,可以容忍多长时间的NAK响应。

使用特权

评论回复
14
vigia|  楼主 | 2010-8-9 10:24 | 只看该作者
给个说明吧
yybj 发表于 2010-8-8 14:46


怎么样的说明?

关于代码流程吗?还是如何使用?

使用特权

评论回复
15
秋天落叶| | 2010-8-9 13:15 | 只看该作者
可以把代码流程和如何使用都简单说说

使用特权

评论回复
16
dfsa| | 2010-8-9 13:46 | 只看该作者
很不错的资料,楼主能写个简单的使用说明就更好了

使用特权

评论回复
17
Simon21ic| | 2010-8-9 14:24 | 只看该作者
本帖最后由 Simon21ic 于 2010-8-9 14:27 编辑

最近流行PK,偶们也PK一下?

> 对于设备来说,一次USB通信最多收到64字节数据,然后通过USART发送出去,在USART发送期间,设备将一直以NAK响应主机,直到USART发送64字节数据完毕,设备可以接收下一个数据包。
这样的效率太低,看一下我的方案:
1K发送缓冲,1K接收缓冲,环形堆栈。
发送缓冲满后,NACK主机,主机可以设置串口的字节延时。
USB收发都是用双缓冲。
稳定921600bps。
支持一些扩展命令,比如,串口下载MTK固件时,需要支持BREAK命令。

PK一下性能吧?
其实,按照USB FS的1ms轮训,已经大概可以算出来了。
921600下,1ms的单向数据量,已经超过64字节。

使用特权

评论回复
18
vigia|  楼主 | 2010-8-9 15:04 | 只看该作者
本帖最后由 vigia 于 2010-8-9 15:11 编辑
最近流行PK,偶们也PK一下?

> 对于设备来说,一次USB通信最多收到64字节数据,然后通过USART发送出去,在USART发送期间,设备将一直以NAK响应主机,直到USART发送64字节数据完毕,设备可以接收下一个数据包。
这样 ...
Simon21ic 发表于 2010-8-9 14:24


你是高手啦,我们就探讨探讨

我当初做这个代码的时候,只考虑了115200bps的波特率,平均到每毫秒是15个字节,而且对于上位机可以用NAK来做流量控制,所以没有对USB OUT的传输做缓冲,直接收直接发,这样代码简单,一目了然,对于115200的传输来说,也足够了。当然如果USART上升到921600BPS,那肯定是你的方案效率更高,而且可以使能STM32F103的USB双缓冲BULK传输,效果会更好。

对于USB IN传输,我也是只考虑了115200BPS的波特率,所以每5个SOF才检查一次USART收到的数据,如果有数据,就启动USB上传到上位机。由于USART的传输具有突发性,并且我不想做流量控制,所以对于IN的传输,我做了缓冲。我考虑这样是对STM32F103的压力小,主芯片完全可以去处理其他事情。当然,如果速度上升到了921600BPS,间隔的5个SOF就太长了,可以每个SOF都检查下数据。


总之,这只是个DEMO的例程,可以修正提高的地方还很多,欢迎各路高手来踩点。


楼上的需要说明的各位,等我有时间了我来做个说明,希望可以连带大致讲一下STM32的USB库。

使用特权

评论回复
19
Simon21ic| | 2010-8-10 04:30 | 只看该作者
也不算高手,只是正好做过而已,了解STM32可以发挥的性能。

其实,这个系统的正真瓶颈就在串口接收,所以,串口接收部分需要用中断的方式处理,并且,优先级最高,可以打入其他中断,这个就需要做好各种零界处理。否则,速度高的话,是会丢数据的。
当然,实际怎么实现,完全看需求定位。
我这里原来考虑921600的速度,也是因为那时候开发MTK手机,下载最高的速度就是921600。

我做的东西在这里:http://code.google.com/p/vsprog/source/browse/trunk/dongle/firmware。

使用特权

评论回复
20
sinadz| | 2010-8-10 09:01 | 只看该作者
我发现高手都比较谦虚的

使用特权

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

本版积分规则

19

主题

652

帖子

7

粉丝