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

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

[复制链接]
wjandsq 发布时间:2014-12-23 16:26
本帖最后由 wjandsq 于 2015-9-6 15:08 编辑
$ ?. i- t, J3 J; {& k# n
! d6 c2 F( K9 c3 X' L根据ST英文社区提供的资料,实现的USB转多路串口(USB-Multiple-CDC)例程,利用了STM32F103系列多端点的特性。而STM32F2/F4端点数量较少,不能实现USB-Multiple-CDC,但STM32F2/F4可以外加高速PHY芯片,实现USB2.0高速通讯。应该说F1和F2、F4使用场合不同,所以功能定位有所不同。9 v" t1 ?. M3 \" L9 i
4 q7 T* j1 M2 O( x
8 q* m# F# j. X) E( X" z- `4 H
例程包下载地址:USB-Multiple-CDC  
5 @' H+ a  u. Y4 ~
- k. n6 K, P; I0 Q
* v. }! F4 c# K
/ v  t5 S1 {0 E* y( U! q, [% C注意事项: ) B9 ^7 M$ G" ^6 c
1.工程包中含有驱动安装引导文件。
; h! C" k6 N0 v% C& K2.3CDC工程包,属于USB转多路串口(USB-Multiple-CDC),驱动的安装可参考“USB-Dual-CDC驱动安装说明书”。
. b7 K1 H! Y* k5 l  W) m( B3.采用带参数的宏实现3路串口的DMA发送,这个相对于ST官方的阻塞式发送,更具有实用性。, L5 g/ n4 Q9 z6 B8 i: O
: a/ w5 e) G" A2 k  V, h4 n

0 c3 B/ @. L# ^. Z0 C6 EUSB-Dual-CDC驱动安装说明书下载地址: USB-Dual-CDC驱动安装说明书7 [2 Z9 |$ K5 s/ i% {
USB-Dual-CDC驱动安装说明书是之前USB-Dual-RS485产品的驱动安装说明书,可以参考这个安装步骤,3路的驱动,就是多安装1路而已。6 i' @7 u; s) q

$ _% y( e$ N7 |3 ^; E0 j) B' j, {+ _& O) a9 p
三路串口的DMA发送代码部分预览如下:1 w% I/ }2 A. ?$ O$ ]+ c- O7 c
/* 带参数的宏功能(预编译展开): USB的IN端点 发送数据到PC主机 */1 x/ T6 n8 |1 ?% @
#define EPx_IN_Callback(ENDPx, CDCx_Tx_State, VCPx_Rx_Buffer, VCPx_Rx_ptr_out, VCPx_Rx_length) {\
& C+ i' b$ J, f" X    uint16_t USB_Tx_ptr;\+ w( n2 p& F3 G4 D
    uint16_t USB_Tx_length;\
0 q- l0 @$ D4 ^    if (CDCx_Tx_State == 1) {\
, B: c  c1 ~" H/ b- i* K        USB_Tx_ptr = VCPx_Rx_ptr_out;\
$ G0 U8 h! `5 X        if (VCPx_Rx_length == 0) {\
4 p. {$ X! T, E* `            CDCx_Tx_State = 0;\3 H5 K' Q. K+ v* Z7 @( b- @, `
            SetEPTxCount(ENDPx,0);\) e1 f' T& c- F  x! d  n# a( {
            SetEPTxValid(ENDPx);\
5 V( t) F  z: h8 u" k# Q6 c. D        } else {\
7 W& u  D0 {/ O) s% ]$ B5 h  O            if (VCPx_Rx_length > VIRTUAL_COM_PORT_DATA_SIZE) {\  x, j+ u) t: q* _: X
                USB_Tx_length = VIRTUAL_COM_PORT_DATA_SIZE;\
: i( |% }$ u- S  G' t2 [4 {                VCPx_Rx_ptr_out += VIRTUAL_COM_PORT_DATA_SIZE;\
5 z2 x/ L+ m$ N( ?6 K( x7 D- H                VCPx_Rx_length -= VIRTUAL_COM_PORT_DATA_SIZE;\6 R# n$ `; c6 y) P
            } else {\
1 \9 M7 q8 g7 C; f                USB_Tx_length = VCPx_Rx_length;\% }6 k; \+ r5 h6 F% ~/ W. u( A
                VCPx_Rx_ptr_out += VCPx_Rx_length;\
  u# I2 W& s" _: |: t+ m# k                VCPx_Rx_length = 0;\
9 X8 a9 ?2 y6 l8 [, P2 t            }\6 I0 k; Z1 |4 j+ i6 S5 ^
            USB_SIL_Write(ENDPx, &VCPx_Rx_Buffer[USB_Tx_ptr], USB_Tx_length);\
& w+ \8 V3 V$ |# f* F: q/ z. h            SetEPTxValid(ENDPx);\
& _0 S5 S6 m  q: U        }\
; B* {/ h- L& }7 o) C; n7 v% X    }\
+ y' G% s" p* I1 ]: U}+ c- @4 T. ]/ O4 A0 v

9 }  f9 ?5 P. _2 P
% S! A8 j/ q# u. i/* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(阻塞方式) */# w, V% J, f' P
#define EPx_OUT_Callback(ENDPx, USARTx, GPIOx, GPIO_Pin_x) {\
4 T1 U& S* h- O. O( ]! _    uint32_t i;\/ R$ ~% c2 y! {4 a  ?
    uint16_t USB_Rx_Cnt;\# T/ `2 G; c+ {% G2 {
    USB_Rx_Cnt = USB_SIL_Read(ENDPx | 0x00, USB_Rx_Buffer); \
" q1 Y) `0 E1 }5 R    GPIOx->BSRR = GPIO_Pin_x;\
, p' h8 l+ z9 Z    for (i = 0; i < USB_Rx_Cnt; i++) {\
' ?+ y7 E% n; ?( r/ _        USARTx->DR = *(USB_Rx_Buffer + i);\
" {* @6 S1 m$ p. \2 ?        while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);\
  q9 j, E3 ~0 C9 F- `. X% I# ]) F    }\
0 `: a% Q! n8 H4 a2 L: {+ W; h8 w  D    SetEPRxValid(ENDPx);\
# g; X, E5 ]' E$ W: t1 D2 T: N  u    while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);\& a. I5 A1 T2 ^6 ?. M* R0 u
    USART_ClearFlag(USARTx, USART_FLAG_TC);\
  u! {3 ~( J$ A9 g! o4 z    GPIOx->BRR = GPIO_Pin_x;\, H. f3 K7 [% w% D: H3 a
}
+ p+ @9 C1 B: g
, I3 n. E9 q- Q( _6 f$ W/* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(DMA方式) */5 K( _0 Z( |0 R0 t) x" S
#define EPx_OUT_Callback_DMA(Flag_VCPx_Tx_Buf_Use, ENDPx, VCPx_Tx_Buffer1,VCPx_Tx_Buffer2,\
$ V1 W# [$ \1 |$ o- x; b8 `* Z4 v  W    GPIOx, GPIO_Pin_x, DMA1_Channelx, VCPx_Tx_Buffer_Cnt, Flag_VCPx_Tx_Buf_Full) {\
- q3 E9 J1 O1 w. X# g- G# c    uint16_t USB_Rx_Cnt;\
) G4 n# e" o6 {& c; N9 l/ e    if(Flag_VCPx_Tx_Buf_Use == 0){\
2 @$ v# ^0 d) J4 o8 [* o6 u        USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\
! n, r. f: Q& e; i        PMAToUserBufferCopy(&VCPx_Tx_Buffer1[0], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\8 f, Y( ^2 P  D
        SetEPRxValid(ENDPx);\4 w; Q" U1 D; L4 w- g
        GPIOx->BSRR = GPIO_Pin_x;\
; g2 L" y3 M0 a7 c        DMA1_Channelx->CNDTR = USB_Rx_Cnt;\* Z& ]/ k/ j+ y+ o( _
        DMA_Cmd(DMA1_Channelx, ENABLE);\/ n( i7 K( R" S- B9 B1 C8 A. g, Z, H
        Flag_VCPx_Tx_Buf_Use = 1;\
( ^  _* R5 o7 b' J; ?% k        VCPx_Tx_Buffer_Cnt = 0;\7 g8 F1 U0 H! `, j
    } else {\
) Q4 @. O' }0 W* R. ^& B        USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\
% l% G6 B5 u0 T) a4 m4 `        if(VCPx_Tx_Buffer_Cnt < (1024-128)){\/ b. p0 m7 m& I1 ?4 k2 p% e
          PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\4 a3 j- F" u1 v- _4 M- t' J
          VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\
. ^) s' I* z$ I8 ]( A, P1 T          SetEPRxValid(ENDPx);\
. X. X  @" ^2 p! \9 d, f, ]        } else {\5 |& c. z4 f8 Z9 m
          PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\# S) ^: Y5 I1 ^0 C
          VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\
& y5 v/ n2 [6 G+ w: ^, P          Flag_VCPx_Tx_Buf_Full = 1;\$ t5 y" w% \/ W0 o& L5 g/ u. v
        }\
  |# }1 o  T1 w+ O' P2 h    }\
% ]: [  ~  \; X( ~  t* o}
4 C) V4 O$ |& e) S* e
2 K: `% c. E; k$ N4 a& t3 y) x
附录:USB Serial Tools工具软件的特殊功能介绍& Z1 S7 K% k+ ]$ A
一般的串口调试工具,不会针对USB插拔做专门的检测和处理,比较容易崩溃,例如微软收购的超级终端等。
7 h& E6 _& i1 h7 q) ]USB Serial Tools 是本人自2009-2012年,个人业余时间开发的一个带有USB插拔检测的串口调试软件。% b* r% ~  E$ \
和其它串口调试工具相比,是专用软件,值得一提的功能如下:& f3 ]5 Z" a" S' U! G+ a
1 支持高波特率。(支持该功能的串口调试工具屈指可数,大部分串口调试工具仅支持到115200)
3 b- b- {* L( n* `( F2 e+ _! T
2 支持USB插拔检测。(支持该功能的串口调试工具屈指可数,大部分串口调试工具都会因此崩溃)6 V' U) X' H6 C1 z" m
USB Serial Tools 下载地址:  USB Serial Tools.zip 4 _9 C7 h4 a. E" ]$ X
1 @: w3 [$ X; n. g  J' h& u& q+ x" e8 g3 X
; t6 _0 {, H( y0 b  w1 n# r
9 t% M$ K6 p9 L! d' l
! f7 e4 P# _/ I4 W9 |) ], Z

7 S1 z: W4 o9 j/ C

" N# S0 d2 }# X; Y/ k2 [, N( l1 c- R: s

) K9 ^. G- {  E$ M! l& s" V' r5 M1 p4 G, u

9 L/ ~1 m: {8 D. X" k$ e( j$ `
% p$ J- c  [1 O3 n4 W7 a& F* {) M0 k1 Y9 a$ l$ U# Q
2 q; V/ V5 `  S( |% s
* f. U& f# W. D5 c9 m; c

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
  r0 `' W/ E& u
好东西啊!学习学习!
tech1222 回答时间:2020-2-11 23:36:35
有参考的作用,谢谢

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版