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

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

[复制链接]
wjandsq 发布时间:2014-12-23 16:26
本帖最后由 wjandsq 于 2015-9-6 15:08 编辑 3 I1 F" q0 Y5 R, I: e

$ Q+ y" N4 @9 \8 {* ?" l1 O根据ST英文社区提供的资料,实现的USB转多路串口(USB-Multiple-CDC)例程,利用了STM32F103系列多端点的特性。而STM32F2/F4端点数量较少,不能实现USB-Multiple-CDC,但STM32F2/F4可以外加高速PHY芯片,实现USB2.0高速通讯。应该说F1和F2、F4使用场合不同,所以功能定位有所不同。
3 i- v" ^1 z$ P4 l" A8 b: J' i* R1 U/ d& e4 j
3 M6 {/ s. ?8 o
例程包下载地址:USB-Multiple-CDC  
- u1 E! H+ z1 F/ @
. z! Z' `% @! e2 o5 Q9 I8 l! Z1 _) a$ r6 F/ l
9 B  f% [- y! x' M
注意事项: ! H) d. ~( n, ~8 R& o
1.工程包中含有驱动安装引导文件。
5 F5 p  v% V1 C6 e. A- x! k% Q2.3CDC工程包,属于USB转多路串口(USB-Multiple-CDC),驱动的安装可参考“USB-Dual-CDC驱动安装说明书”。5 x; c; _# d( Q; @
3.采用带参数的宏实现3路串口的DMA发送,这个相对于ST官方的阻塞式发送,更具有实用性。
$ Y: u  r1 r6 h6 |2 v* w" B
" B2 H- P3 U5 {! \0 @$ k8 M( ]2 w7 ~, P5 L" i6 a
USB-Dual-CDC驱动安装说明书下载地址: USB-Dual-CDC驱动安装说明书
; a( b/ k. x# bUSB-Dual-CDC驱动安装说明书是之前USB-Dual-RS485产品的驱动安装说明书,可以参考这个安装步骤,3路的驱动,就是多安装1路而已。: T* W3 l7 F( l& L
; d* ~8 z6 }( m2 J) c/ S4 E7 {  j
* z3 _" ?/ K, L$ O6 ]
三路串口的DMA发送代码部分预览如下:1 b) Q5 Q5 ~1 F+ M  l8 u1 T' l/ ]
/* 带参数的宏功能(预编译展开): USB的IN端点 发送数据到PC主机 */- `5 P% ]+ c" a! O% v
#define EPx_IN_Callback(ENDPx, CDCx_Tx_State, VCPx_Rx_Buffer, VCPx_Rx_ptr_out, VCPx_Rx_length) {\
) m- |/ U# M% t8 k$ o  h* M    uint16_t USB_Tx_ptr;\
* ?: v$ x* h4 g. o1 J1 N    uint16_t USB_Tx_length;\
- p9 m: p9 [$ T4 z; j) z    if (CDCx_Tx_State == 1) {\
6 D/ @) Z7 S/ j% E        USB_Tx_ptr = VCPx_Rx_ptr_out;\2 ]2 K8 p/ M( G8 Q" I0 v
        if (VCPx_Rx_length == 0) {\
( X: \% A- x4 ^) I6 ?4 x            CDCx_Tx_State = 0;\
7 q8 g% U' U. F) X3 ]- g4 _6 k            SetEPTxCount(ENDPx,0);\, e$ Y1 \8 V" U* j1 Y1 ?
            SetEPTxValid(ENDPx);\
# A+ w4 e8 @# \: F        } else {\
. l- Q" j1 w7 a0 a& `1 {6 Y            if (VCPx_Rx_length > VIRTUAL_COM_PORT_DATA_SIZE) {\  g) L! _0 I& O+ ]+ j8 u
                USB_Tx_length = VIRTUAL_COM_PORT_DATA_SIZE;\* s' S8 r9 ~, c- w2 x
                VCPx_Rx_ptr_out += VIRTUAL_COM_PORT_DATA_SIZE;\
0 x# m# b) z. a" N5 W3 B& ]( @0 E                VCPx_Rx_length -= VIRTUAL_COM_PORT_DATA_SIZE;\! |# o( N/ ~6 y% Q2 f# Z- l
            } else {\) x% ~# S# Q# z8 r0 \
                USB_Tx_length = VCPx_Rx_length;\
3 ^6 f6 d' K3 ?# `                VCPx_Rx_ptr_out += VCPx_Rx_length;\$ ^2 i, X7 q) b$ G4 Q1 t; {1 _
                VCPx_Rx_length = 0;\
: T2 ]( c, u  ~3 O* ^3 [            }\
* Z) l* T* t+ q- f  o7 d. m            USB_SIL_Write(ENDPx, &VCPx_Rx_Buffer[USB_Tx_ptr], USB_Tx_length);\8 l" |+ W3 B, b# X5 }$ A
            SetEPTxValid(ENDPx);\, N* N2 l4 A$ l1 B  I2 H
        }\
3 Z5 k& d) E, R: v" K" A    }\
# m- A2 G$ t8 m" @) V- ^6 @) T! V% a}
3 L( R/ g) K3 [0 [4 L/ @( y4 ?1 j$ i3 j2 }2 b! b
/ L# [5 K& [4 D! x, ]5 j8 a
/* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(阻塞方式) */' j" g; Z6 U4 x* A! o, C
#define EPx_OUT_Callback(ENDPx, USARTx, GPIOx, GPIO_Pin_x) {\
# l7 Q" j# p0 J3 _; d    uint32_t i;\+ @9 N  G5 [/ u7 p* ]
    uint16_t USB_Rx_Cnt;\
/ r- O; N0 v# R. _* a    USB_Rx_Cnt = USB_SIL_Read(ENDPx | 0x00, USB_Rx_Buffer); \2 k6 r/ q3 Y# i3 _) `5 V
    GPIOx->BSRR = GPIO_Pin_x;\
( C1 \! b, _. D4 q# c) ^  q    for (i = 0; i < USB_Rx_Cnt; i++) {\
/ W8 _& [- {& l3 _+ ^" T" }        USARTx->DR = *(USB_Rx_Buffer + i);\3 x! ^" T; Q3 n, [* `& {) k
        while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);\7 i. B( B) {4 n0 O, h( i, d: u
    }\9 |& h3 D7 V( Y2 _! |
    SetEPRxValid(ENDPx);\5 s; }$ P4 l1 M2 e7 a# N
    while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);\/ X1 x1 L  _+ q2 q
    USART_ClearFlag(USARTx, USART_FLAG_TC);\) ~* l, G! z1 B' }1 X& o6 l! T
    GPIOx->BRR = GPIO_Pin_x;\% k1 P0 z) R  G' c9 g
}
( U1 i  G7 A- n3 b! d  q
/ I, @% ?8 S" S( t* W8 u/* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(DMA方式) */
9 B( v' h! b+ M( X3 G3 o#define EPx_OUT_Callback_DMA(Flag_VCPx_Tx_Buf_Use, ENDPx, VCPx_Tx_Buffer1,VCPx_Tx_Buffer2,\
; h! O* h7 |& k9 i. m    GPIOx, GPIO_Pin_x, DMA1_Channelx, VCPx_Tx_Buffer_Cnt, Flag_VCPx_Tx_Buf_Full) {\
: j* N7 \! T. o7 p    uint16_t USB_Rx_Cnt;\5 q7 Z! ], W1 c$ d
    if(Flag_VCPx_Tx_Buf_Use == 0){\
" U% l) P: W- y$ C3 ?5 H( o        USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\
( b% j- m% u' T/ y3 v' b# F7 I! [        PMAToUserBufferCopy(&VCPx_Tx_Buffer1[0], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\5 o) D# x0 u- @( g& c! P
        SetEPRxValid(ENDPx);\
0 ^0 p! H* H- f        GPIOx->BSRR = GPIO_Pin_x;\
8 i0 K. Q( b+ N        DMA1_Channelx->CNDTR = USB_Rx_Cnt;\- z% N! \8 m4 @; T. s2 J0 B
        DMA_Cmd(DMA1_Channelx, ENABLE);\# R7 ?5 z* G- C6 @! J" B/ M
        Flag_VCPx_Tx_Buf_Use = 1;\
6 M* {) c) K1 p0 E( U3 K        VCPx_Tx_Buffer_Cnt = 0;\' L4 |0 D1 b# P0 Q
    } else {\
$ t8 S) I& j8 w& y        USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\7 L6 P$ o' M# G$ P* z" e& E( w
        if(VCPx_Tx_Buffer_Cnt < (1024-128)){\
* U- o# u4 q* v1 p. l          PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\7 x7 d+ ~: t) B
          VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\
* Y# _+ Q( x$ M% d          SetEPRxValid(ENDPx);\. [3 ?' ^7 T, s+ g- |! [% I+ `1 P
        } else {\/ h  X  W7 i) Y0 ]* ~. C
          PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\+ Z- p1 E9 q3 J$ _
          VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\
/ w& B3 V0 O! c. {" E          Flag_VCPx_Tx_Buf_Full = 1;\7 \: k( L: R& P: I5 k) B
        }\8 g6 D' M# C/ J! ^) r7 A
    }\
1 D) R! a% K) ?* W  k0 S2 {$ b}7 W$ r3 a) u) ]" y  R: F& q
( O8 |" Y3 L9 x* b" }* K
附录:USB Serial Tools工具软件的特殊功能介绍' X2 P. K! c* C! \) ]2 v3 f" m
一般的串口调试工具,不会针对USB插拔做专门的检测和处理,比较容易崩溃,例如微软收购的超级终端等。& {9 _5 U# E+ f$ \1 @. J# d* z
USB Serial Tools 是本人自2009-2012年,个人业余时间开发的一个带有USB插拔检测的串口调试软件。
+ g# \3 ^4 I% ~: a" ^% `% z/ }和其它串口调试工具相比,是专用软件,值得一提的功能如下:
# X0 Q  C0 I/ t. M( a, G1 支持高波特率。(支持该功能的串口调试工具屈指可数,大部分串口调试工具仅支持到115200)
3 X% m% \% E! K5 L! S
2 支持USB插拔检测。(支持该功能的串口调试工具屈指可数,大部分串口调试工具都会因此崩溃)
4 g* W6 b; ^) q. N) J. b! \
USB Serial Tools 下载地址:  USB Serial Tools.zip   W6 W: _  l( m" h( J% B

5 l$ D3 m$ x6 W

1 D& j6 G" S6 b3 ?2 n- A/ f4 w; G# I0 b/ `
: T: c# \2 ^- ]; \0 V/ w

# _' G8 N1 K- W6 Q
- E. L5 G! _7 j$ Y" [$ q( m, l+ J
: @- g, q8 f4 E
, d% v3 P/ S4 C7 W- j

8 f3 S  j' x3 Y! {

- O2 U& _2 `# k# m2 d+ j: D1 Y/ H- J. u6 Y- f
% Z' `( h7 f, d

: O/ S" |. T! ^  d
8 c+ n8 i, G* i! M  y

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
. A9 F" r5 B3 I. T* [
好东西啊!学习学习!
tech1222 回答时间:2020-2-11 23:36:35
有参考的作用,谢谢

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版