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

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

[复制链接]
wjandsq 发布时间:2014-12-23 16:26
本帖最后由 wjandsq 于 2015-9-6 15:08 编辑 2 x) L" Q, [% J% h! p
8 a8 x7 J/ {" C" U- B+ J9 t
根据ST英文社区提供的资料,实现的USB转多路串口(USB-Multiple-CDC)例程,利用了STM32F103系列多端点的特性。而STM32F2/F4端点数量较少,不能实现USB-Multiple-CDC,但STM32F2/F4可以外加高速PHY芯片,实现USB2.0高速通讯。应该说F1和F2、F4使用场合不同,所以功能定位有所不同。; b, a8 }' i3 ^

5 M( ~6 S4 ]; {$ u: V- V5 F1 e7 A
/ _, \+ L" I; q2 {例程包下载地址:USB-Multiple-CDC  
5 u( T. |+ \4 ~/ h  L$ V# f" k. R/ F/ m, [! D; V2 M% }
) d1 }1 a( F' e5 m: A, L
, Y' m% M# m. H# W8 M
注意事项:
) D! h) C7 p% T# W0 s$ y4 c, d0 u! O1.工程包中含有驱动安装引导文件。
/ I: l! d1 `8 d0 E2 W2.3CDC工程包,属于USB转多路串口(USB-Multiple-CDC),驱动的安装可参考“USB-Dual-CDC驱动安装说明书”。! e+ Q( y* n+ ]9 v  d& B! P
3.采用带参数的宏实现3路串口的DMA发送,这个相对于ST官方的阻塞式发送,更具有实用性。. Y' P4 |# [( L

/ ~" v- B5 k* h) _9 H0 R% n4 z( Q% G" e
USB-Dual-CDC驱动安装说明书下载地址: USB-Dual-CDC驱动安装说明书# j# h7 n& h0 i) Y
USB-Dual-CDC驱动安装说明书是之前USB-Dual-RS485产品的驱动安装说明书,可以参考这个安装步骤,3路的驱动,就是多安装1路而已。
. ^7 t; |& q# X% ?: f! T3 m( a* m
( `: z% C5 {5 ~
5 Z$ q" o6 N3 c0 V9 m5 d& `三路串口的DMA发送代码部分预览如下:
- c# p" V  b  \" J4 ~" U/* 带参数的宏功能(预编译展开): USB的IN端点 发送数据到PC主机 */+ U$ `" {4 l6 Y4 B( G
#define EPx_IN_Callback(ENDPx, CDCx_Tx_State, VCPx_Rx_Buffer, VCPx_Rx_ptr_out, VCPx_Rx_length) {\
8 O4 g& u6 r( ^! d    uint16_t USB_Tx_ptr;\+ U: ?) ]! S$ }' c, O; O( A+ S
    uint16_t USB_Tx_length;\3 Y% p7 v2 |) E" M4 h, {) j
    if (CDCx_Tx_State == 1) {\# K6 b2 z+ p" R# L: v; }. Y
        USB_Tx_ptr = VCPx_Rx_ptr_out;\
9 d# |$ g3 ]5 d        if (VCPx_Rx_length == 0) {\
3 O8 z' E# B( w% b0 Q* Z* W; i            CDCx_Tx_State = 0;\+ ]! Y6 L' ~6 c5 e9 e4 G, g
            SetEPTxCount(ENDPx,0);\" [) m) }5 Y5 _
            SetEPTxValid(ENDPx);\* }- Y" `  Z. ~4 u$ g" j
        } else {\
1 k6 M: G- ]! m5 `" s' h2 H+ u            if (VCPx_Rx_length > VIRTUAL_COM_PORT_DATA_SIZE) {\7 F6 i4 v! C" E' ?, s& Q. F0 P
                USB_Tx_length = VIRTUAL_COM_PORT_DATA_SIZE;\
3 G/ k. G, u$ j/ B% w                VCPx_Rx_ptr_out += VIRTUAL_COM_PORT_DATA_SIZE;\1 T* @6 o$ d: b0 W
                VCPx_Rx_length -= VIRTUAL_COM_PORT_DATA_SIZE;\
/ |3 X- P# ]* M6 ]9 L            } else {\
2 `  u% a# g$ y8 A3 f& a6 ]                USB_Tx_length = VCPx_Rx_length;\8 I# K. H" [* L% }  z9 y! Z
                VCPx_Rx_ptr_out += VCPx_Rx_length;\
$ @$ T8 b% A# z; ~  t                VCPx_Rx_length = 0;\
9 `) E" R2 H1 ^# `% g6 u7 h            }\
$ [: ]/ Q  {) d+ o9 K            USB_SIL_Write(ENDPx, &VCPx_Rx_Buffer[USB_Tx_ptr], USB_Tx_length);\6 [# N( j2 n( [! M0 n6 W0 L
            SetEPTxValid(ENDPx);\
# [. |" D6 g: v3 A$ ~& n        }\
' p: K1 M  E; M; W- W/ F) [& S    }\) f2 g3 A$ W2 t; T! ?/ O2 a2 C( h
}
" ]% n1 g/ V. J. g8 Z9 L
+ u7 A, \' U  _! R
2 o3 S+ W" y9 H2 K! x/* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(阻塞方式) */- ^4 C( h1 K+ b
#define EPx_OUT_Callback(ENDPx, USARTx, GPIOx, GPIO_Pin_x) {\
* i& }3 v& S& F    uint32_t i;\
: R' Y! ^4 C$ h4 W& `, s0 S5 V    uint16_t USB_Rx_Cnt;\
/ l% I* |6 B$ Z$ W2 S9 X$ M! D    USB_Rx_Cnt = USB_SIL_Read(ENDPx | 0x00, USB_Rx_Buffer); \
! Z6 e: B/ ]$ }5 I& ]( U    GPIOx->BSRR = GPIO_Pin_x;\$ s' S) E, S  n
    for (i = 0; i < USB_Rx_Cnt; i++) {\: c6 v# c* Z$ F8 W+ a3 K
        USARTx->DR = *(USB_Rx_Buffer + i);\
  q, G* ~% J6 m6 |: A        while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);\+ f$ K5 B$ f* P8 C( n2 j
    }\
9 f$ ?5 I. ?, q2 K    SetEPRxValid(ENDPx);\
& C+ ^4 ?; R# f    while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);\. ~$ N. g7 u! w* z5 m, ^( T6 C
    USART_ClearFlag(USARTx, USART_FLAG_TC);\
9 V% k4 I* n) [    GPIOx->BRR = GPIO_Pin_x;\
9 o1 A- B: w, A2 H}& j  w4 k+ w' H" ~) e1 G

+ q3 \5 p+ x3 }* D/* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(DMA方式) */
1 l' c+ r, j* M% [+ Z#define EPx_OUT_Callback_DMA(Flag_VCPx_Tx_Buf_Use, ENDPx, VCPx_Tx_Buffer1,VCPx_Tx_Buffer2,\
  n8 [( Y) r( w% j0 u5 C7 b    GPIOx, GPIO_Pin_x, DMA1_Channelx, VCPx_Tx_Buffer_Cnt, Flag_VCPx_Tx_Buf_Full) {\+ _( l6 j( Z# @" d
    uint16_t USB_Rx_Cnt;\
$ m) y0 \4 [1 A) W    if(Flag_VCPx_Tx_Buf_Use == 0){\/ ]1 y# z! b& M5 I, {6 d
        USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\
, h+ e/ ^0 c  U2 d0 ?1 ]: U        PMAToUserBufferCopy(&VCPx_Tx_Buffer1[0], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\
3 \9 q& X: G* u- ~; w- f        SetEPRxValid(ENDPx);\
7 C7 Q5 t; Z" N3 ?8 R        GPIOx->BSRR = GPIO_Pin_x;\
7 J* B# q" L5 O% U( w        DMA1_Channelx->CNDTR = USB_Rx_Cnt;\6 _' n0 y( A* [3 u* _3 g9 _0 @
        DMA_Cmd(DMA1_Channelx, ENABLE);\. {# c$ Y! l8 D/ D/ a5 Z  |
        Flag_VCPx_Tx_Buf_Use = 1;\  r% u& W8 V4 B7 T1 H1 r: L; M* F, {
        VCPx_Tx_Buffer_Cnt = 0;\
4 w! D1 ~: j# V    } else {\' h6 h, |( d1 W& Y1 k
        USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\! I  ]& W& c" N' ]2 q$ Z
        if(VCPx_Tx_Buffer_Cnt < (1024-128)){\
! |5 S4 v6 Q% V& A$ c          PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\
! u& C2 t2 c3 x          VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\
# _& x: l, R8 P          SetEPRxValid(ENDPx);\
$ M: B5 ]) P4 g. @; o        } else {\
5 {. y3 @3 X! K) c  y. K          PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\
! ?) W7 O) T- A% Q          VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\' J( j2 n/ h1 r
          Flag_VCPx_Tx_Buf_Full = 1;\
/ c. c; {1 y! W. l8 i        }\
7 h2 d( n+ M3 l$ L! Z" L    }\  s& J& ?6 ?9 c! z" `0 Y
}$ X4 X+ R: I4 Q: ]( V0 g

: K. [8 B! P' {, t. Z3 K附录:USB Serial Tools工具软件的特殊功能介绍
. Q; w6 T2 M/ T4 e0 l+ s9 E一般的串口调试工具,不会针对USB插拔做专门的检测和处理,比较容易崩溃,例如微软收购的超级终端等。
" a$ s1 W/ X& J$ }- m( jUSB Serial Tools 是本人自2009-2012年,个人业余时间开发的一个带有USB插拔检测的串口调试软件。
6 p( @% ^! _- S2 y和其它串口调试工具相比,是专用软件,值得一提的功能如下:
1 I1 K1 Z# M% I: C: n1 支持高波特率。(支持该功能的串口调试工具屈指可数,大部分串口调试工具仅支持到115200)
$ R. w, r' i( V9 Q1 m) o; B# H
2 支持USB插拔检测。(支持该功能的串口调试工具屈指可数,大部分串口调试工具都会因此崩溃)4 f- `6 }4 E4 {
USB Serial Tools 下载地址:  USB Serial Tools.zip
" r8 z5 f3 q& H( k2 m' s3 @( z/ A( \! E% e5 t
! ]- r) u0 X9 u; f* y

" G) R  J- k! z% U" d5 E

& G) H9 T5 E  {6 |1 V4 F1 {# u( u( ^. {3 E5 Z

+ W( v0 u; ]' m
- Q/ W% [- `: I" ?$ m4 q! ]1 o$ e6 L/ F" V# P& W9 ]- B
1 ]. o  c0 v& ]0 L
; G1 U, m5 Q" y0 [% N$ h% Q' n

5 R! }5 r: f+ ~% q+ f) ~$ o# ~( g# V; d8 w2 O+ I

6 W1 E! Q$ P, V5 c' D
- D; d5 d, w- B2 J

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
9 O; ~/ d1 c. J5 z( s$ X- U
好东西啊!学习学习!
tech1222 回答时间:2020-2-11 23:36:35
有参考的作用,谢谢
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版