USBCDC:把STM32的USB当串口使用
warmonkey2011/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未测试过。
这个驱动程序实际上是使用了系统自带的XXXXXXXXXs,安装的只是一个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 997次下载

attachment icon vcpdriver_v1.zip 5.19MB ZIP 747次下载
+25  科创币    zw1235    2013/08/06 高质量发帖
+1  学术分    科创网    2011/07/11 支持原创教程
来自:电子信息 / 电子技术
79
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
warmonkey 作者
13年4个月前 修改于 9年3个月前 IP:未同步
328085
备注:
1.某坛友报告linux下测试通过,无需安装驱动程序
2.这个虚拟串口的速度不受波特率限制,可以达到USB 2.0 Full Speed的极限

11.17添加内容
关于如何同时使用usb和jlink等调试器
把iar的run to main去掉,然后自己在USBCDC_init()后面放置断点。
原理:在枚举usb设备时,如果调试器挂起cpu,就会导致响应超时,进而枚举失败,电脑显示“无法识别的设备”。只要把所有的断点都去掉,或者放到枚举完之后,就不会出问题了。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
10班陈大葱22号
13年4个月前 IP:未同步
328378
哇 就是在个人工程里USBCDC就可以实现usb串口同时又能运行自己的程序吗?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
warmonkey作者
13年4个月前 IP:未同步
328382
不影响你的工程,可以在调通其他模块之后,启用usbcdc功能。这个做数据通信特别方便
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
ddddaxia
13年4个月前 IP:未同步
329629
这个东西是不错,等会试下
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
zhangjunyejo
13年4个月前 IP:未同步
331446
很好 希望楼主继续加油  努力 fighting
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
zhangjunyejo
13年4个月前 IP:未同步
331447
楼主给加点分吧  下不下来
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
liwang0806
13年3个月前 IP:未同步
339851
急需这个东西,看看 来了
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
博海
13年2个月前 IP:未同步
342933
做个记号[s:230]
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
lulu980232
13年1个月前 IP:未同步
355287
正在学习中,感觉很有帮助,谢谢!
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
hanbao0371
13年0个月前 IP:未同步
363722
谢谢搂主分享啊,下来学习下
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
lilin
12年11个月前 IP:未同步
376257
楼主,能否把这个工程添加的目录给我看下啊?我下去新建了工程,怎么也编译不过,提示很多管脚等类型未定义,不知道是什么没添加进去
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
菊辉
12年11个月前 IP:未同步
376936
正在学STM32  USB 虚拟串口,太感谢了。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
fuluoce
12年11个月前 IP:未同步
380597
[s:271]正在学STM32  USB ,太感谢了。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
lishuhong219
12年11个月前 IP:未同步
380819
我最近想实现的是stm32通过usb虚拟的串口直接和PC的串口调助手通信,也就是说不用USART转接收发。按说只要在stm32中不使用USART的功能,直接在收到PC下发的数据时,使用USB的端点再回传想返回的信息就行了。但是却发现一个问题,如果只是从PC的串口助手下发的,第一次的数据可以收到,再发的就没反应了。如果每收到一次后紧跟着用USB向PC发一次数据的话,就可以继续收到上位机的数据。但这样就无法实现仅仅通过USB就可以和PC的串口助手任意通信了。
这样做主要是为了使用没有串口的PC就可以通过串口助手来方便的控制stm32,。不知道是不是要改驱动?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
zuowang
12年11个月前 IP:未同步
380890
学习中,下载下来看看
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
skertone
12年10个月前 IP:未同步
385490
Windows XP 应该内置CDC 设备驱动吧,

能否做到“免驱动安装” 呢?

既然你需要 .inf 文件,哪可能是用 PID/VID 方式安装的了
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
colafei
12年7个月前 IP:未同步
417863
准备做这方面 困寻资料,终于找到了 谢谢
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
leo_z
12年7个月前 IP:未同步
417944
正是需要的。。下载看看。[s:274]
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
colafei
12年7个月前 IP:未同步
418044
程序修改完成以后,灌到stm32芯片中,插到电脑上 显示设备未知设备,找到相应的驱动程序,附件的驱动程序首先进行了安装!
不知何故
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
irarykim
12年7个月前 IP:未同步
428492
多谢~ 下下来试试。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
irarykim
12年7个月前 IP:未同步
428633
回 6楼(zhangjunyejo) 的帖子
用迅雷精简版(迅雷7没试过)可以下。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
zhixian
12年6个月前 IP:未同步
445067
我正想在项目里用上USBCDC,这个资料作为参考不错
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
kidleaf
12年5个月前 IP:未同步
453584
学习学习,最近也在做这块
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
腹黑小白兔
12年5个月前 IP:未同步
453616
甚好,最近遇到很多坑爹的串口线
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
yoobee
12年3个月前 IP:未同步
470789
楼主,能否发整个项目上来,可以编译的,谢谢啦
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
yiqianlong
12年0个月前 IP:未同步
501117
话说偶本来想注个册下个资料就走的。。。
1.发送部份程序有问题,如下注释部分是原来的程序,再下两句是我改的。而且“else”语句缩进少了个TAB,很可能是用正确的程序故意改错的。。。
/*    if(length < limit)
        length = limit;
    else
        limit = length;//use limit to save retval*/
    if(length > limit)
        length = limit;

2.插上电脑后,无法装驱程,WIN7和XP都一样。附件的驱程不知道装到哪去了。。在网上查了半天,终于搞定:
复制以下内容,另存为.inf文件——
;------------------------------------------------------------------------------
; STMicroelectronics Comunication Device Class driver (CDC) INF FILE
; (C)2009 Copyright STMicroelectronics
;------------------------------------------------------------------------------

[Version]
Signature="$Windows NT$"
Class=Ports
ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318}
Provider=%MANUFACTURER%
LayoutFile=XXXXXXXXXf
;CatalogFile=%FILENAME%.cat

DriverVer= 9/20/2009,1.2.0

[Manufacturer]
%MANUFACTURER%=DeviceList,NTamd64

[DestinationDirs]
DefaultDestDir=12


;------------------------------------------------------------------------------
;              Windows 2000/XP/Vista32 Support
;------------------------------------------------------------------------------
[DriverInstall.nt]
include=XXXXXXXXXf
CopyFiles=DriverCopyFiles.nt
AddReg=XXXXXXXXXXXXXXXXXXXdReg

[DriverCopyFiles.nt]
XXXXXXXXXs,,,0x20

[XXXXXXXXXXXXXXXXXXXdReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,%DRIVERFILENAME%.sys
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"

[XXXXXXXXXXXXXXXXXXXrvices]
AddService=usbser, 0x00000002, DriverService.nt

[DriverService.nt]
DisplayName=%SERVICE%
ServiceType=1
StartType=3
ErrorControl=1
ServiceBinary=%12%\\%DRIVERFILENAME%.sys

;------------------------------------------------------------------------------
;              Windows Vista x64 / Windows7 x64 Support
;------------------------------------------------------------------------------

[DriverInstall.NTamd64]
include=XXXXXXXXXf
CopyFiles=DriverCopyFiles.NTamd64
AddReg=XXXXXXXXXXXXXXXXXXXXXXXXdReg

[DriverCopyFiles.NTamd64]
%DRIVERFILENAME%.sys,,,0x20

[XXXXXXXXXXXXXXXXXXXXXXXXdReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,%DRIVERFILENAME%.sys
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"

[XXXXXXXXXXXXXXXXXXXXXXXXrvices]
AddService=usbser, 0x00000002, DriverService.NTamd64

[DriverService.NTamd64]
DisplayName=%SERVICE%
ServiceType=1
StartType=3
ErrorControl=1
ServiceBinary=%12%\\%DRIVERFILENAME%.sys


;------------------------------------------------------------------------------
;            VID/PID Settings
;------------------------------------------------------------------------------
[SourceDisksFiles]
[SourceDisksNames]
[DeviceList]
%DESCRIPTION%=DriverInstall,USB\\VID_0483&[s:9]ID_5740

[DeviceList.NTamd64]
%DESCRIPTION%=DriverInstall,USB\\VID_0483&[s:9]ID_5740


;------------------------------------------------------------------------------
;              String Definitions
;------------------------------------------------------------------------------
[Strings]

FILENAME="ST_Virtual"
DRIVERFILENAME ="usbser"
MANUFACTURER="STMicroelectronics"
INSTDISK="CDC_DISK"
DESCRIPTION="STM Virtual COM Port"
SERVICE="Virtual Com Driver"
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
warmonkey作者
12年0个月前 IP:未同步
501183
1是因为我的注释不清楚,实际意思是取length和limit中较小值,并保存在limit中。后面程序需要读取真实的length数值

2是因为我打开了自动搜索驱动程序的功能,所以没贴上那个inf。感谢楼主贴上inf的内容
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
kensou2k
11年8个月前 IP:未同步
534121
楼主写的很不错,还想问问,PID和VID如果不对应,驱动是否不能识别?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
kensou2k
11年8个月前 IP:未同步
534123
官方程序中有几个BUG导致只能单字节发送,用7位串口方式也有问题。查看源程序,发现有几个地方需要修改:

XXXXB->UART 没有等串口发送完,现象是只能发一个字符
void USB_To_USART_Send_Data(u8* data_buffer, u8 Nb_bytes)
{
  u32 i;

  for (i = 0; i < Nb_bytes; i++)
  {
    USART_SendData(USART1, *(data_buffer + i));

    //added by dreamdive
    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

  }
}

XXXXol USART_Config(void)函数中,数据长度设置错误导致乱码
  
  /*set the data type : only 8bits and 9bits is supported */
  switch (linecoding.datatype)
  {
    case 0x07://数据长度7位
      USART_XXXXXXXXXXXXXXXXART_WordLength = USART_WordLength_8b;
      break;
    case 0x08://数据长度8位
      //USART_XXXXXXXXXXXXXXXXART_WordLength = USART_WordLength_9b;
      //无较验位时用8位方式,否则用9位方式
      if(XXXXXXXXXXXXXritytype==USART_Parity_No)
        USART_XXXXXXXXXXXXXXXXART_WordLength = USART_WordLength_8b;
      else
        USART_XXXXXXXXXXXXXXXXART_WordLength = USART_WordLength_9b;
      break;
    default :
    {
      USART_Config_Default();
      return (FALSE);
    }
  }

3.void USART_To_USB_Send_Data(void)函数中,判断错误导致用7位串口方式时UART->USB乱码

  if (USART_XXXXXXXXXXXXXXXXART_WordLength == USART_WordLength_8b)
  {
    buffer_in[count_in] = USART_ReceiveData(USART1) & 0x7F;
  }
  else if (USART_XXXXXXXXXXXXXXXXART_WordLength == USART_WordLength_9b)
  {
    buffer_in[count_in] = USART_ReceiveData(USART1);
  }

  改为:
  if (linecoding.datatype == 0x07)          
  {
    buffer_in[count_in] = USART_ReceiveData(USART1) & 0x7F;
  }
  else
  {
    buffer_in[count_in] = USART_ReceiveData(USART1);
  }

经测试,8位无校验/带校验和7位无校验/带校验工作全部正常。

刚刚看了ST最新官方um0424.zip,修正和我想的一样,呵呵:-).不过有个网友发现有个问题见

不知是不是中断处理的不好(我没有测试过新版的,一直在用KEIL自带的例程)。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
kensou2k
11年8个月前 IP:未同步
535099
则么,这个程序有keil版本的吗?

iar版本的老是不好移植啊。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
jerrydong
11年7个月前 IP:未同步
549649
挺好的,急需,谢谢
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
kelvin77
11年6个月前 IP:未同步
556304
很感谢楼主,我想请教一下ST官方的例程里面是通过USART去转接发数据的,但既然是USB虚拟串口,为什么设备端不直接从USB去读取和发送数据?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
warmonkey作者
11年6个月前 IP:未同步
556422
回 32楼(kelvin77) 的帖子
所以我做了这个例程,里面就是可以直接用的
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
zw1235
11年6个月前 IP:未同步
556480
高质量发帖
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
pirdol
11年6个月前 IP:未同步
557763
请问楼主程序调试中遇到过usb无法识别的问题吗?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
casuallyston
11年5个月前 IP:未同步
566913
请问是将usb的   D+   D-直接连接到stm32的TXD,RXD 上吗?这样会不会输入电压,或者电流太大  把芯片烧坏了?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
张静茹
11年5个月前 IP:未同步
642509
不错很有用,
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
swjtuzqw
10年5个月前 IP:未同步
717307
在linux下面是不是识别为ttyACM0呢?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
swjtuzqw
10年5个月前 IP:未同步
717308
楼主的开发板具体是哪个型号呢?我也想买几块,急用。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
.........
10年5个月前 IP:未同步
717309
swjtuzqw 发表于 2014-8-31 15:09
在linux下面是不是识别为ttyACM0呢?


以前TI的MPS430 Launchpad的板载仿真器虚拟出来的串口是被识别成这个名字的。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
swjtuzqw
10年5个月前 IP:未同步
717330
......... 发表于 2014-8-31 15:24
以前TI的MPS430 Launchpad的板载仿真器虚拟出来的串口是被识别成这个名字的。


那你这个呢?有没有试过是不是ttyACM0?你这个看起来应该就是属于CDC ACM类型的设备吧?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
.........
10年5个月前 IP:未同步
717368
swjtuzqw 发表于 2014-8-31 17:28
那你这个呢?有没有试过是不是ttyACM0?你这个看起来应该就是属于CDC ACM类型的设备吧?


这个没搞过,所以不知道,你试试不就知道了啊。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
swjtuzqw
10年5个月前 IP:未同步
717374
......... 发表于 2014-8-31 20:07
这个没搞过,所以不知道,你试试不就知道了啊。


能否加QQ咨询下你详细的编译和板子信息,
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
swjtuzqw
10年5个月前 IP:未同步
717376
本帖最后由 swjtuzqw 于 2014-8-31 20:24 编辑

swjtuzqw 发表于 2014-8-31 20:20
能否加QQ咨询下你详细的编译和板子信息,


我是做linux驱动开发的,没玩过这个,不是很熟悉!万分感激[s:1],我的QQ619383646
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
swjtuzqw
10年5个月前 IP:未同步
717378
......... 发表于 2014-8-31 20:07
这个没搞过,所以不知道,你试试不就知道了啊。


我是做linux驱动开发的,没玩过这个,不是很熟悉!万分感激
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
sfa329
10年5个月前 IP:未同步
717854
楼主很强大,正在找这个,谢谢楼主分享。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
sjyf
10年3个月前 IP:河南
727150
帖子很热啊。关注一下。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
wtch519361
10年3个月前 IP:浙江
727183
引用 lilin:
楼主,能否把这个工程添加的目录给我看下啊?我下去新建了工程,怎么也编译不过,提示很多管脚等类型未定义,不知道是什么没添加进去
我也在学习USB CDC类,能不能把工程文件发给我看看
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
wtch519361
10年3个月前 IP:浙江
727184
引用 yoobee:
楼主,能否发整个项目上来,可以编译的,谢谢啦
我也在学习USBCDC类,能不能把整个项目发我看看?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
wtch519361
10年3个月前 IP:浙江
727185
引用 yoobee:
楼主,能否发整个项目上来,可以编译的,谢谢啦
邮箱是wtch519361@XXXXXXX 十分感谢
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
warmonkey
学者 机友
文章
363
回复
8003
学术分
12
2008/10/11注册,7时38分前活动

Cubesat

主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}