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

【STM32实战】基于STM32F1的USB转多路串口(USB-Multiple-CDC)

[复制链接]
wjandsq 发布时间:2014-12-23 16:26
本帖最后由 wjandsq 于 2015-9-6 15:08 编辑
; H* `3 X7 \3 x9 G" y* \
$ A- V. U' X# s6 }) E根据ST英文社区提供的资料,实现的USB转多路串口(USB-Multiple-CDC)例程,利用了STM32F103系列多端点的特性。而STM32F2/F4端点数量较少,不能实现USB-Multiple-CDC,但STM32F2/F4可以外加高速PHY芯片,实现USB2.0高速通讯。应该说F1和F2、F4使用场合不同,所以功能定位有所不同。
! B! W8 i; n# i( U6 d3 b) ]1 }) u5 t3 E1 w
: j# \5 R# v4 b# F$ u6 p0 Z* e. L
例程包下载地址:USB-Multiple-CDC  : T' U+ Z1 Z7 O8 F. \- k
, c6 P8 e# B& C7 k$ [0 Z, z
# z( P+ m2 ^2 @6 L
. f2 x( y" o% ^( A
注意事项: 7 y3 ~6 b  C# F% c4 w( Y% M
1.工程包中含有驱动安装引导文件。) d/ a" u. x* K
2.3CDC工程包,属于USB转多路串口(USB-Multiple-CDC),驱动的安装可参考“USB-Dual-CDC驱动安装说明书”。6 @2 B. r6 J. o: ]0 z
3.采用带参数的宏实现3路串口的DMA发送,这个相对于ST官方的阻塞式发送,更具有实用性。& B0 ]+ R7 h( V' \8 T2 N

! e6 [; }. @: C2 O2 ^) S' f5 S# a& u; H) X
USB-Dual-CDC驱动安装说明书下载地址: USB-Dual-CDC驱动安装说明书4 L- m! V# q) @5 z$ y- @) Y
USB-Dual-CDC驱动安装说明书是之前USB-Dual-RS485产品的驱动安装说明书,可以参考这个安装步骤,3路的驱动,就是多安装1路而已。
* m3 b2 C3 E0 Y' b5 H0 w! r% o$ T

! r0 D' ~( a6 O+ h8 u8 x三路串口的DMA发送代码部分预览如下:
- @1 Y9 U. }3 L/ _3 _# k+ ]  w9 b/* 带参数的宏功能(预编译展开): USB的IN端点 发送数据到PC主机 */. J3 Z1 C; Z. C
#define EPx_IN_Callback(ENDPx, CDCx_Tx_State, VCPx_Rx_Buffer, VCPx_Rx_ptr_out, VCPx_Rx_length) {\
. G& V  t: h# G5 ?2 w    uint16_t USB_Tx_ptr;\
' O, h1 E- y: }' W9 H7 |1 q9 N! a    uint16_t USB_Tx_length;\
- c! I7 w* U3 U; _% t$ }    if (CDCx_Tx_State == 1) {\( l- g! d( w- B% o8 a9 c* f
        USB_Tx_ptr = VCPx_Rx_ptr_out;\
/ O+ g- d( Q7 X- k        if (VCPx_Rx_length == 0) {\5 U; f* S$ p) g; D+ a5 O
            CDCx_Tx_State = 0;\" O* m' |% W- g2 f- i
            SetEPTxCount(ENDPx,0);\
' p  ^8 @; Y# T6 I            SetEPTxValid(ENDPx);\
; c1 C* W# n9 y' I# m$ t+ i        } else {\
( \1 A* l: ]. B# y0 Y- d* w: |' T            if (VCPx_Rx_length > VIRTUAL_COM_PORT_DATA_SIZE) {\
5 j2 e7 s  i5 _; H' i                USB_Tx_length = VIRTUAL_COM_PORT_DATA_SIZE;\: s# s' _. @, Y: F* ]1 {
                VCPx_Rx_ptr_out += VIRTUAL_COM_PORT_DATA_SIZE;\& u1 K6 j) p: L  t5 I
                VCPx_Rx_length -= VIRTUAL_COM_PORT_DATA_SIZE;\
: n5 t8 t& \$ P- j) f' E            } else {\
6 X' q$ ]5 l' }+ _5 M  d                USB_Tx_length = VCPx_Rx_length;\7 e) T7 w% z6 c) J
                VCPx_Rx_ptr_out += VCPx_Rx_length;\
6 b4 S6 C- s2 k; R! r/ _2 j5 J' S! D                VCPx_Rx_length = 0;\; W% S) ?: d9 V3 ]" r0 R
            }\
' t3 ^' [. |8 u  R+ r) ?            USB_SIL_Write(ENDPx, &VCPx_Rx_Buffer[USB_Tx_ptr], USB_Tx_length);\. |, k# a4 z8 [' H5 o  |. {
            SetEPTxValid(ENDPx);\
# V# Q) [( k& B, m        }\
+ a1 P0 `4 U; C7 m' F    }\
5 l' i! z# _7 K# C}$ \+ h# {3 J8 ~

6 U, E' Z6 X( A9 ~3 w
3 q1 c# j- b. S, f8 `' @5 @/* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(阻塞方式) */
7 c: N  M; j4 z7 O* n#define EPx_OUT_Callback(ENDPx, USARTx, GPIOx, GPIO_Pin_x) {\
; z4 |& u6 C: T1 ~4 B  x$ w* R    uint32_t i;\
  R9 [6 a3 c% ^5 d9 I# r/ _    uint16_t USB_Rx_Cnt;\& B" V/ j, u# ~5 _* L
    USB_Rx_Cnt = USB_SIL_Read(ENDPx | 0x00, USB_Rx_Buffer); \- y$ i8 h7 l8 m. l
    GPIOx->BSRR = GPIO_Pin_x;\
7 l' o# L. w" h' J    for (i = 0; i < USB_Rx_Cnt; i++) {\2 t2 \$ F8 D- M! H
        USARTx->DR = *(USB_Rx_Buffer + i);\$ m$ P7 ?( m9 y1 L: W
        while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);\
" B8 I; B% P" E" l7 N! \$ S    }\
1 T1 |- d! W+ w0 ^( h4 D* j    SetEPRxValid(ENDPx);\5 |# n- m% U; _4 f" r
    while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);\! q; ^1 E" w! ^( W- B
    USART_ClearFlag(USARTx, USART_FLAG_TC);\
5 p6 \; T1 I' V    GPIOx->BRR = GPIO_Pin_x;\
/ |( L/ s& ]- H+ R}. A9 r) I5 Y  X/ O% @8 ~+ _. _
. z4 F8 R- \' {
/* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(DMA方式) */3 e' k: v( h( p' j: z
#define EPx_OUT_Callback_DMA(Flag_VCPx_Tx_Buf_Use, ENDPx, VCPx_Tx_Buffer1,VCPx_Tx_Buffer2,\
. G; Q2 @( Y% v7 I/ \    GPIOx, GPIO_Pin_x, DMA1_Channelx, VCPx_Tx_Buffer_Cnt, Flag_VCPx_Tx_Buf_Full) {\% Y/ `7 m1 |9 `7 b/ w
    uint16_t USB_Rx_Cnt;\) x0 d$ f4 l. ]2 a# K8 z
    if(Flag_VCPx_Tx_Buf_Use == 0){\* x9 u- P7 O' S+ e( r
        USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\
2 E- ~0 u2 U: ~4 |# E& E        PMAToUserBufferCopy(&VCPx_Tx_Buffer1[0], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\/ S2 Q( H. {& e$ t4 h
        SetEPRxValid(ENDPx);\
: Y! M; R5 v: ^+ L: ?0 e, v/ B5 Y        GPIOx->BSRR = GPIO_Pin_x;\. n( E  i$ e: o. o
        DMA1_Channelx->CNDTR = USB_Rx_Cnt;\
5 w1 B6 w0 T* A4 b' v0 P5 z; i        DMA_Cmd(DMA1_Channelx, ENABLE);\/ D6 g( O! g; A: {9 `/ S
        Flag_VCPx_Tx_Buf_Use = 1;\
! r; j2 [* |" e: @5 k% R4 ]5 {        VCPx_Tx_Buffer_Cnt = 0;\* R, ]6 R) V. @4 r/ A0 h# `
    } else {\/ j5 y0 ~& K9 L& k. p* s
        USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\/ n; s; B" y4 ]9 q2 X# ^# w
        if(VCPx_Tx_Buffer_Cnt < (1024-128)){\& W& }; G, g4 H
          PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\
5 T& w9 d" H* n2 i6 F; a          VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\
# Z" R6 c, K: W! H4 q# s: z          SetEPRxValid(ENDPx);\
0 U2 e0 \! o1 d( h        } else {\
7 N) W, x+ Q4 V* _          PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\
( P# z2 d: d( f+ g0 r          VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\
# _: B5 {( ?& O7 U          Flag_VCPx_Tx_Buf_Full = 1;\0 m2 `2 r& v. [) W9 N7 H
        }\6 N6 a4 w3 [$ ~2 a/ D3 y3 T1 }
    }\0 p; O4 i8 B1 o% x4 i  _9 S& A
}" Z0 R3 W. b% z( X" P( X

* ]7 o  m; U" X! \! F附录:USB Serial Tools工具软件的特殊功能介绍: }8 u9 f% `4 Z7 _+ r' g
一般的串口调试工具,不会针对USB插拔做专门的检测和处理,比较容易崩溃,例如微软收购的超级终端等。
" t, [. F- ]* D5 Z/ u# fUSB Serial Tools 是本人自2009-2012年,个人业余时间开发的一个带有USB插拔检测的串口调试软件。; C3 s& L9 e+ b+ u
和其它串口调试工具相比,是专用软件,值得一提的功能如下:: @0 K) b6 G& k5 R- h- H( s
1 支持高波特率。(支持该功能的串口调试工具屈指可数,大部分串口调试工具仅支持到115200)

6 X4 ?! T3 _" z+ J9 n. j7 r2 支持USB插拔检测。(支持该功能的串口调试工具屈指可数,大部分串口调试工具都会因此崩溃)
% l% [' ~8 _6 [
USB Serial Tools 下载地址:  USB Serial Tools.zip
- x$ |0 A2 O# S# q7 ], s2 @, z+ k/ _1 c4 [

, y2 L6 \% j% o; h6 W0 y$ q
  R9 h# H. w( V

8 e: D; F' L) H! |
9 `$ o& }3 q, Z! J" y  f

) H' x8 ?# c( T6 r* O1 F
( |6 [7 K- ^8 \6 f$ ]5 z
  N" D) z5 w- c+ n& p+ D3 D9 x
, r7 h. V) B; m' E0 }- I
# I7 V3 S3 n& N6 }) n
: ?  g" s- C  H4 G- u9 h
+ N7 b; M4 ]9 t$ C0 h

1 g) j5 G2 l2 G1 u& m- z1 |5 Y8 z

USB串口工具支持端点号显示

USB串口工具支持端点号显示
收藏 5 评论12 发布时间:2014-12-23 16:26

举报

12个回答
沐紫 回答时间:2014-12-23 16:38:11
xiexie
巅峰残狼 回答时间:2014-12-23 18:55:15
好牛逼的样子,赞一个
mini92 回答时间:2015-7-28 19:45:27
楼主你好,请问一下delphi xe4如何安装控件,你的源码我在大虾电子网找到了,卡在了delphi安装Cport控件那一步无法进行下去了,求求楼主可怜一下菜鸟,帮忙解决一下这个问题,谢谢
mini92 回答时间:2015-7-28 20:17:48
我发现,我的问题就是卡在了安装CPort控件的步骤上,然后还有就是生成lib文件的步骤上,大虾电子网上的安装控件教程的帖子被删除了,求求楼主大发慈悲共享一下,
jhon 回答时间:2015-9-23 10:30:38
工程下载链接有问题,能发一份到我邮件么  373981167@qq.com  谢谢!
stary666 回答时间:2015-9-23 10:43:16
好东西,,,,,,
foxglove 回答时间:2015-9-23 10:50:27
实现的USB转多路串口(USB-Multiple-CDC)例程
低级格式化 回答时间:2016-12-30 23:25:20
呃……资料已经下不到了,楼主可否再传一份?
yygkqzh 回答时间:2018-4-13 21:42:12
资源失效了 能重新发一下吗
a14725836900 回答时间:2019-5-2 12:07:11
谢谢分享,您的研究很详细,谢谢了。
pubgnice 回答时间:2019-5-22 17:44:21
  F2 I5 g) y$ I7 h( X0 i$ o
好东西啊!学习学习!
tech1222 回答时间:2020-2-11 23:36:35
有参考的作用,谢谢
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版