文号
t34847
阅读
67175
回复
79
收藏
64
USBCDC:把STM32的USB当串口使用
2011/07/11
IP:广东
USB驱动程序很难写?串口线个头太大?PL2303花钱太多?试试看USBCDC吧
它可以让你把USB当成串口操作,不管对上位机(PC程序)还是下位机(单片机)来说都是一样的。

硬件是STM32的USB,但连接在电脑上之后,会被识别为串口。其稳定性较市场上的USB转串口线要好得多,可以用于产品中。
未命名.jpg

使用方法:
1.先根据你的硬件,修改/project/user/HAL/USBCDC/hw_config.c,此文件对USB进行初始化

2.API调用说明:
先初始化STM32,再调用USBCDC_init();
调用USBCDC_ready()如果返回真(非零),表示连接已建立,可以通讯
此时调用USBCDC_senddata和USBCDC_recvdata,即可收发数据。
USBCDC_disconnect()可以关断连接,令USB模块休眠,降低功耗
如果要重新打开连接,调用USBCDC_connect();这个函数会激活USB模块

3.PC端驱动程序安装,可以使用附带程序,也可以让系统自动上网查找。目前仅测试过windows xp/vista/7,linux未测试过。
这个驱动程序实际上是使用了系统自带的usbser.sys,安装的只是一个inf设置文件。

4.上位机(PC)程序中,对串口直接操作即可,无需考虑USB协议之类的问题

5.例子的代码在/project/user/main.c中,这个例子模拟了串口Tx和Rx短路在一起的情况,也就是说,电脑会立刻收到自己刚刚发出的数据。
2.jpg

6.异常处理:
使用JLink之类的调试器时,USBCDC可能出现异常,退出调试模式并复位STM32后,问题会解决。
如果无法找到串口,或者程序无法识别,或者是通信异常,请关闭应用程序,然后拔掉USB,再插好。
最好是先插USB,再打开程序。停用时,先关闭串口,再拔掉USB(这点非常重要),否则下次可能找不到串口。这个可能是Windows驱动导致的bug

已在STM32Minikit开发板测试通过,主芯片是STM32F103C8T6
未在互联型芯片(STM32F107****)上测试过

---enjoy it


attachment icon USBCDC_STM32.rar 580.30KB RAR 1028次下载

attachment icon vcpdriver_v1.zip 5.19MB ZIP 778次下载
+25
科创币
zw1235
2013/08/06
高质量发帖
+1
学术分
科创网
2011/07/11
支持原创教程
79
warmonkey作者
15年3个月前修改于 11年1个月前IP:未同步
328085
1楼
备注:
1.某坛友报告linux下测试通过,无需安装驱动程序
2.这个虚拟串口的速度不受波特率限制,可以达到USB 2.0 Full Speed的极限

11.17添加内容
关于如何同时使用usb和jlink等调试器
把iar的run to main去掉,然后自己在USBCDC_init()后面放置断点。
原理:在枚举usb设备时,如果调试器挂起cpu,就会导致响应超时,进而枚举失败,电脑显示“无法识别的设备”。只要把所有的断点都去掉,或者放到枚举完之后,就不会出问题了。
引用
评论
warmonkey作者
15年3个月前IP:未同步
328382
3楼
不影响你的工程,可以在调通其他模块之后,启用usbcdc功能。这个做数据通信特别方便
引用
评论
warmonkey作者
13年10个月前IP:未同步
501183
27楼
1是因为我的注释不清楚,实际意思是取length和limit中较小值,并保存在limit中。后面程序需要读取真实的length数值

2是因为我打开了自动搜索驱动程序的功能,所以没贴上那个inf。感谢楼主贴上inf的内容
引用
评论
warmonkey作者
13年5个月前IP:未同步
556422
33楼
回 32楼(kelvin77) 的帖子
所以我做了这个例程,里面就是可以直接用的
引用
评论
warmonkey作者
12年2个月前IP:广东
727407
51楼
引用 wtch519361:
我也在学习USBCDC类,能不能把整个项目发我看看?
project/user/ewarm那个文件夹里面就是
引用
评论
warmonkey作者
11年5个月前IP:广东
780794
65楼
引用 金坷居士:
STM32的USB其实还可以做成USB HID,这样插到Windows之后就被识别成标准的HID设备,连驱动也不需要装,Linux估计也一样,反正设备和鼠标键盘差不多了
直接根据VID PID识别USB设备
USB CDC还需要驱动和选串口...
速度捉急啊亲,HID设备只有64kB/s,CDC有1.1MB/s
引用
评论
warmonkey作者
10年9个月前IP:广东
810456
76楼
引用 coolbird007:
我觉得直接用HID类,驱动都不用写了。也不存在端口分配占用的问题,多个相同设备可以管理。
速度太慢,限制了64kB/s
引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的