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

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

[复制链接]
wjandsq 发布时间:2014-12-23 16:26
本帖最后由 wjandsq 于 2015-9-6 15:08 编辑 $ O" _0 s; x7 v2 }

$ v  F! \1 P. L+ H. @% R根据ST英文社区提供的资料,实现的USB转多路串口(USB-Multiple-CDC)例程,利用了STM32F103系列多端点的特性。而STM32F2/F4端点数量较少,不能实现USB-Multiple-CDC,但STM32F2/F4可以外加高速PHY芯片,实现USB2.0高速通讯。应该说F1和F2、F4使用场合不同,所以功能定位有所不同。" ~/ _: O6 f8 D8 F  }+ p

2 e5 l1 H( O9 t1 x7 @- T, h( o4 i' t; A, O* O& a
例程包下载地址:USB-Multiple-CDC  
& {+ T$ m2 d+ e  h' e' }, T& \! J' H0 `! L6 D* s6 w2 ~  S& q' S6 j: ^

& A: @5 _5 J, j, u
) ?* \8 v7 `. g- j& \+ ^注意事项: 7 n: M8 A- t5 f% U
1.工程包中含有驱动安装引导文件。
! i6 A8 t6 p" Z. \/ U2.3CDC工程包,属于USB转多路串口(USB-Multiple-CDC),驱动的安装可参考“USB-Dual-CDC驱动安装说明书”。
* U& |. l' g) t% g" N! R3.采用带参数的宏实现3路串口的DMA发送,这个相对于ST官方的阻塞式发送,更具有实用性。& B+ |, G7 u! K

/ P2 n- c5 n: r# u' |' N
; Q& S, L7 E* L% WUSB-Dual-CDC驱动安装说明书下载地址: USB-Dual-CDC驱动安装说明书
; s- i/ L) H4 \1 DUSB-Dual-CDC驱动安装说明书是之前USB-Dual-RS485产品的驱动安装说明书,可以参考这个安装步骤,3路的驱动,就是多安装1路而已。
% ~9 U0 ^  H0 u9 X9 w& z" C& O% x/ n
3 z  m- ^5 {- S( I4 v, M* E
三路串口的DMA发送代码部分预览如下:
" X5 w* h: E# q/* 带参数的宏功能(预编译展开): USB的IN端点 发送数据到PC主机 */0 J+ v1 Y; e7 A7 T4 ?, ?
#define EPx_IN_Callback(ENDPx, CDCx_Tx_State, VCPx_Rx_Buffer, VCPx_Rx_ptr_out, VCPx_Rx_length) {\& z6 c7 \  Q4 g
    uint16_t USB_Tx_ptr;\
( J& _1 j, B7 [" V    uint16_t USB_Tx_length;\! C# v0 a; v' W( ?9 E: v2 I% ~
    if (CDCx_Tx_State == 1) {\1 t+ D6 R, o4 e1 a8 t
        USB_Tx_ptr = VCPx_Rx_ptr_out;\, \0 X0 k4 f6 }7 r
        if (VCPx_Rx_length == 0) {\
" s: D3 }# Q9 r8 }9 m            CDCx_Tx_State = 0;\- M7 {- c: l0 \
            SetEPTxCount(ENDPx,0);\
) K6 ~$ E" _7 k6 e' U            SetEPTxValid(ENDPx);\
6 ^) R/ F( |4 |9 E7 E5 z        } else {\$ {7 h% B9 A$ a9 w8 c
            if (VCPx_Rx_length > VIRTUAL_COM_PORT_DATA_SIZE) {\+ b. o* z# ?7 L/ \: l2 w; q
                USB_Tx_length = VIRTUAL_COM_PORT_DATA_SIZE;\
6 [% J0 H( L& G. w7 R' y# |                VCPx_Rx_ptr_out += VIRTUAL_COM_PORT_DATA_SIZE;\: O% ^1 D* x5 i# d# ^+ D, |; a
                VCPx_Rx_length -= VIRTUAL_COM_PORT_DATA_SIZE;\
3 `4 d# K* [# s- |0 \) B            } else {\  ]5 Y3 v+ u% M# C: b: N) v
                USB_Tx_length = VCPx_Rx_length;\
8 v. ?1 t3 _7 k" F7 h1 c! ^                VCPx_Rx_ptr_out += VCPx_Rx_length;\
1 g, [. q5 x- ^' F1 @                VCPx_Rx_length = 0;\
5 s$ e! ^( d* t2 J" v- e3 g. b) z            }\
* S  S4 U, u+ W3 [; J! Z5 d) P            USB_SIL_Write(ENDPx, &VCPx_Rx_Buffer[USB_Tx_ptr], USB_Tx_length);\7 [; x( t$ U8 i# B/ I
            SetEPTxValid(ENDPx);\
. `  a6 L1 d! z  S, I3 G        }\+ D1 K' U+ Q/ g0 w- m- F
    }\
% W9 y* l, P9 [# L4 n}
7 N3 G: _! Q% p$ S! E5 \# M. }+ D0 U) ?/ P3 W" M

2 p. X2 o( Z( _3 d. m% E: f! J/* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(阻塞方式) */
* i7 ]$ G6 U6 t  k& G/ A) ^#define EPx_OUT_Callback(ENDPx, USARTx, GPIOx, GPIO_Pin_x) {\/ G0 p0 @3 m$ U* p0 ]
    uint32_t i;\+ N; f* K: c3 `4 M/ }; A
    uint16_t USB_Rx_Cnt;\, i- A4 r4 x1 c: `$ V
    USB_Rx_Cnt = USB_SIL_Read(ENDPx | 0x00, USB_Rx_Buffer); \6 d1 G) w% ~5 @
    GPIOx->BSRR = GPIO_Pin_x;\! k. T8 k: `: \3 l; Q- M
    for (i = 0; i < USB_Rx_Cnt; i++) {\
5 f7 L! X" y& p' v: r2 p        USARTx->DR = *(USB_Rx_Buffer + i);\3 H4 N' F" K) G. O: }, s
        while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);\: C+ H2 x- X, Y. j3 y2 `5 i
    }\8 v9 M# ]  h: S. l  K4 {" l
    SetEPRxValid(ENDPx);\
1 x, _5 B; g0 K    while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);\
6 L: u6 x9 _9 k2 b+ g* p1 X    USART_ClearFlag(USARTx, USART_FLAG_TC);\
4 @6 V5 G# R% \. S  M8 b9 S% U6 K4 p4 |    GPIOx->BRR = GPIO_Pin_x;\
& ]' Q3 V9 _( y' V9 a}- @2 g$ |0 Q8 x2 D3 b! ]3 M5 r* [
- d" J$ U8 ~3 [2 I( v4 P
/* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(DMA方式) */
! y) m; S) ^5 D6 K  y#define EPx_OUT_Callback_DMA(Flag_VCPx_Tx_Buf_Use, ENDPx, VCPx_Tx_Buffer1,VCPx_Tx_Buffer2,\" ~% ^- A# s" \% E% e6 c
    GPIOx, GPIO_Pin_x, DMA1_Channelx, VCPx_Tx_Buffer_Cnt, Flag_VCPx_Tx_Buf_Full) {\5 p7 T% z3 d! x7 a
    uint16_t USB_Rx_Cnt;\* c5 o8 x9 b$ K3 v
    if(Flag_VCPx_Tx_Buf_Use == 0){\0 }2 U; d! {2 m1 i2 @* t4 W/ T0 x
        USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\
( ~% S! d  Y5 v- ?4 n" ~) r3 T        PMAToUserBufferCopy(&VCPx_Tx_Buffer1[0], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\( j/ @# {6 W  i* @5 l
        SetEPRxValid(ENDPx);\* P' o+ f+ ^( H
        GPIOx->BSRR = GPIO_Pin_x;\% p! y& X4 z; N) D3 V
        DMA1_Channelx->CNDTR = USB_Rx_Cnt;\" `& A5 u; v! s8 u6 C( }  u" _( }
        DMA_Cmd(DMA1_Channelx, ENABLE);\+ F' w' j: A% F2 R8 t" L, O
        Flag_VCPx_Tx_Buf_Use = 1;\
, H- ^9 Q0 @8 _( Q7 E: d2 {2 W$ y5 X/ h        VCPx_Tx_Buffer_Cnt = 0;\& \# U; t; V+ X0 n. M. B) F7 T! d
    } else {\
( i+ n+ Q( a5 c/ \8 ~        USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\( Q, }6 ~* P8 [! ^$ o, P: w" }
        if(VCPx_Tx_Buffer_Cnt < (1024-128)){\' |6 U: e  y- q( h  I" p
          PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\, C! @. K# ~: B. `& g! U
          VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\
  R: K' O5 M2 f8 y! V" m5 U          SetEPRxValid(ENDPx);\
$ T& K, G: _& M( y+ Z5 e* B        } else {\- A0 S# I$ l+ a- e1 V" E
          PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\
7 {! y* R0 E: N- r! K, h+ h% ?% R          VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\  R, l5 u: I+ Z
          Flag_VCPx_Tx_Buf_Full = 1;\2 G2 l/ y' g( K
        }\6 [2 v, {1 X" x" T  ~) t
    }\5 `/ x' a1 l$ [' ~# G, @. l4 c+ t
}
% W0 |" ~, H7 S! e2 Z
* z5 u# i2 J; N  c# L6 ?" O
附录:USB Serial Tools工具软件的特殊功能介绍
/ a/ n8 a' A& k& e6 ]5 `一般的串口调试工具,不会针对USB插拔做专门的检测和处理,比较容易崩溃,例如微软收购的超级终端等。
2 C& E, ~% p2 D" SUSB Serial Tools 是本人自2009-2012年,个人业余时间开发的一个带有USB插拔检测的串口调试软件。
7 l2 I9 J' g. A和其它串口调试工具相比,是专用软件,值得一提的功能如下:( R8 f4 A& y/ o' l; D
1 支持高波特率。(支持该功能的串口调试工具屈指可数,大部分串口调试工具仅支持到115200)
" n% A7 K" s. `3 P. J# ~  D3 A6 K
2 支持USB插拔检测。(支持该功能的串口调试工具屈指可数,大部分串口调试工具都会因此崩溃): [5 u$ e2 I6 u; G2 V1 U' c
USB Serial Tools 下载地址:  USB Serial Tools.zip " U5 w& W/ [" v
, G" j/ f& L, a4 P1 C
+ a/ B$ F) u. \/ N0 p  k

, ~6 P" \; U, y4 o
  h/ R& v2 I6 O2 r! h; m) W

5 f4 Z! ~6 j9 P8 ]* D

2 H4 |  W& U! {5 d' q/ j+ _) t- z) u" K& t$ b; p. o
4 V) [. _# O! p# V
  T  J: n' Q6 Y: O4 ~5 c
& n4 D* j* }" @. B7 @2 n! w
' N% `; g4 X3 e4 q6 i7 u) x: [  T' L
5 d5 M+ O3 A6 U' R# u8 t

# z& Q" X' ^* I7 \
. B+ i& R) X- ~1 L3 P1 x  U0 }

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

, w! p: R' D" h' Y7 |1 G好东西啊!学习学习!
tech1222 回答时间:2020-2-11 23:36:35
有参考的作用,谢谢

所属标签

相似技术帖

官网相关资源

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