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

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

[复制链接]
wjandsq 发布时间:2014-12-23 16:26
本帖最后由 wjandsq 于 2015-9-6 15:08 编辑
) Y+ A0 q$ h' F# W# x5 ^% v9 b8 b  t1 A1 W7 \* k* \
根据ST英文社区提供的资料,实现的USB转多路串口(USB-Multiple-CDC)例程,利用了STM32F103系列多端点的特性。而STM32F2/F4端点数量较少,不能实现USB-Multiple-CDC,但STM32F2/F4可以外加高速PHY芯片,实现USB2.0高速通讯。应该说F1和F2、F4使用场合不同,所以功能定位有所不同。$ u# I3 t' m; Y; M$ d0 N! R2 y

; w/ I/ L! t6 z) ^" q5 B4 P
$ }* F: D0 }6 f3 V4 q例程包下载地址:USB-Multiple-CDC  : m, w( a( r: i: D

6 t# i6 r( o4 n, U1 `5 R3 U8 @) ?5 @5 H8 G

) f' {3 p1 H! @0 Y+ y' n注意事项:
# X/ z& n/ ]' F# p+ k) ?# s1.工程包中含有驱动安装引导文件。. i; K. J/ H$ z, m, N/ [
2.3CDC工程包,属于USB转多路串口(USB-Multiple-CDC),驱动的安装可参考“USB-Dual-CDC驱动安装说明书”。* G! [* {& [$ m- b4 B
3.采用带参数的宏实现3路串口的DMA发送,这个相对于ST官方的阻塞式发送,更具有实用性。4 [: H+ @* w- d+ `! A$ H7 R8 V

. B7 T9 t* @% f" E
$ a$ w  n! ~7 z( P; r, Q; TUSB-Dual-CDC驱动安装说明书下载地址: USB-Dual-CDC驱动安装说明书* p. {2 L& T3 p% m9 ?
USB-Dual-CDC驱动安装说明书是之前USB-Dual-RS485产品的驱动安装说明书,可以参考这个安装步骤,3路的驱动,就是多安装1路而已。' T6 Q) U, J8 U3 h: Y: S3 `! f4 [
+ ^" }, e$ y; f; U: F) ~7 N
7 x/ @: X/ }  C3 T/ o+ W
三路串口的DMA发送代码部分预览如下:+ D  N6 Q* n  t6 V, y4 s
/* 带参数的宏功能(预编译展开): USB的IN端点 发送数据到PC主机 */5 v: p, I% o, _: p" s# I
#define EPx_IN_Callback(ENDPx, CDCx_Tx_State, VCPx_Rx_Buffer, VCPx_Rx_ptr_out, VCPx_Rx_length) {\
: g; o& X5 _" A    uint16_t USB_Tx_ptr;\: t# I" ?; w3 |" f: c, m
    uint16_t USB_Tx_length;\
" |5 K. ^7 S1 h& {, C, s$ i    if (CDCx_Tx_State == 1) {\
& E7 f* J3 a) z; [0 ~1 Q& _9 Z        USB_Tx_ptr = VCPx_Rx_ptr_out;\
3 |1 ?! _8 Z5 }7 O, x  E        if (VCPx_Rx_length == 0) {\$ ^5 T! `& c  ?) v2 H; P8 E
            CDCx_Tx_State = 0;\- z' s" J3 v/ C/ H+ X
            SetEPTxCount(ENDPx,0);\
0 j0 o' P2 B, c; @( c            SetEPTxValid(ENDPx);\% |2 p8 J5 Y2 e% u2 }
        } else {\) L. f/ b! N0 ^/ h3 J: B3 l
            if (VCPx_Rx_length > VIRTUAL_COM_PORT_DATA_SIZE) {\- h  }& x" s0 S/ F2 l4 `) ]
                USB_Tx_length = VIRTUAL_COM_PORT_DATA_SIZE;\
" U7 L9 g( |+ u, Y) J' O4 [4 a                VCPx_Rx_ptr_out += VIRTUAL_COM_PORT_DATA_SIZE;\
' {& u) f) j( P3 @                VCPx_Rx_length -= VIRTUAL_COM_PORT_DATA_SIZE;\; K/ g' L+ |9 Y* S0 |- C6 P
            } else {\
: w  D6 M* q) r: A, J                USB_Tx_length = VCPx_Rx_length;\
5 q; V4 K' j" s1 E* M4 Z7 j                VCPx_Rx_ptr_out += VCPx_Rx_length;\5 a) C) H8 G* w6 F
                VCPx_Rx_length = 0;\
( B8 U' t, c$ L. r$ S6 T" E4 `9 L            }\( o  v3 B) ~$ Z! w5 i; h
            USB_SIL_Write(ENDPx, &VCPx_Rx_Buffer[USB_Tx_ptr], USB_Tx_length);\5 P+ u% ~6 F  J+ k) F" p
            SetEPTxValid(ENDPx);\. O+ P5 H/ z6 _* G9 A
        }\
- c% N8 _6 k6 |  P    }\
: p. X4 a+ M5 }3 E+ S5 @( F}/ g, H( I8 A) ]" Y2 P8 c8 E

6 W$ s' M; o$ I
6 p9 {+ b/ j! y6 w/* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(阻塞方式) */4 G( L9 S/ R* ~" L
#define EPx_OUT_Callback(ENDPx, USARTx, GPIOx, GPIO_Pin_x) {\6 W+ \# x) D2 C" z1 B7 v
    uint32_t i;\7 c: n1 u7 W+ e' u: Z) R
    uint16_t USB_Rx_Cnt;\! [" ^9 H* A# C
    USB_Rx_Cnt = USB_SIL_Read(ENDPx | 0x00, USB_Rx_Buffer); \* }( }+ S: V; D) N& I: o3 B' Y
    GPIOx->BSRR = GPIO_Pin_x;\
% o% {0 |$ r/ Q8 }& E5 Z) e2 P    for (i = 0; i < USB_Rx_Cnt; i++) {\
  Z/ {9 H/ |/ r! Z% @) m$ |* [        USARTx->DR = *(USB_Rx_Buffer + i);\
( n! a8 K% }  D; m% o/ q+ G        while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);\9 b) X- i* ^5 r1 l+ d
    }\
0 b+ j6 o6 t6 a0 }- |* ~6 f* m    SetEPRxValid(ENDPx);\
, Y& y9 p: c6 c% c1 Q    while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);\
' W5 B/ M' t6 s, j0 l7 y    USART_ClearFlag(USARTx, USART_FLAG_TC);\
# b% W: o6 r. I8 \7 T- g( V    GPIOx->BRR = GPIO_Pin_x;\
2 ^3 C1 r0 P7 y/ T. `- ]. H}
: Z1 N* ]5 H1 h7 G8 l$ A+ a: \" P0 `7 w
/* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(DMA方式) */
2 o& p3 w: s: x) ~0 A#define EPx_OUT_Callback_DMA(Flag_VCPx_Tx_Buf_Use, ENDPx, VCPx_Tx_Buffer1,VCPx_Tx_Buffer2,\7 a1 p, a, X( N6 T1 [1 F
    GPIOx, GPIO_Pin_x, DMA1_Channelx, VCPx_Tx_Buffer_Cnt, Flag_VCPx_Tx_Buf_Full) {\1 O0 V4 ]2 ]$ \
    uint16_t USB_Rx_Cnt;\
- P: {/ o. y8 B8 @    if(Flag_VCPx_Tx_Buf_Use == 0){\! y1 i- [7 }9 x" M; T* G; k
        USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\
" |5 N% M1 [4 x; L( ?3 K$ k        PMAToUserBufferCopy(&VCPx_Tx_Buffer1[0], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\9 X0 R2 v/ P7 }  e$ o
        SetEPRxValid(ENDPx);\
; ]8 u& n/ ^6 E; u1 M& X6 ]        GPIOx->BSRR = GPIO_Pin_x;\4 [1 z( @! [  ~$ M
        DMA1_Channelx->CNDTR = USB_Rx_Cnt;\( `* W* R8 A. A
        DMA_Cmd(DMA1_Channelx, ENABLE);\
) e5 i+ X4 C4 q. O6 j        Flag_VCPx_Tx_Buf_Use = 1;\
: v. \4 a: v2 s7 f/ S        VCPx_Tx_Buffer_Cnt = 0;\* ]/ Z- v3 g2 M7 ~0 e
    } else {\
7 |1 t- L9 f" `, [        USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\& P' P/ Y) ?' q/ x
        if(VCPx_Tx_Buffer_Cnt < (1024-128)){\
$ W( w8 a( r$ h( ^/ D          PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\; q& k2 X& l" T3 N) Q) e
          VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\
4 B6 }5 e# E3 m* H          SetEPRxValid(ENDPx);\
, e6 ]3 t* q: B( x) S! a        } else {\
; }5 n# t$ B% f' s          PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\! G- V8 N: M0 S- o) n" h
          VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\
9 S6 {. Y0 |3 ~* R  T8 U) A+ ?4 o9 P          Flag_VCPx_Tx_Buf_Full = 1;\4 j7 D# `  k+ _& h/ e
        }\1 F/ j% t% h/ g' ?5 R' z
    }\% x# S3 \" w1 U1 E( K
}
2 d% h$ {0 y7 p5 E# y( ^: g1 c

7 F, f" R  s9 m  n" ?3 N附录:USB Serial Tools工具软件的特殊功能介绍
. v0 Z9 k$ ]+ f9 m一般的串口调试工具,不会针对USB插拔做专门的检测和处理,比较容易崩溃,例如微软收购的超级终端等。  S1 @1 ?# P& W+ ?/ F! `2 y* E
USB Serial Tools 是本人自2009-2012年,个人业余时间开发的一个带有USB插拔检测的串口调试软件。
% ], {9 s. i# O7 T和其它串口调试工具相比,是专用软件,值得一提的功能如下:
8 v- `: K9 e0 \6 j7 U- ?' c1 支持高波特率。(支持该功能的串口调试工具屈指可数,大部分串口调试工具仅支持到115200)
) ^' S2 W5 Y+ h- r2 g9 U
2 支持USB插拔检测。(支持该功能的串口调试工具屈指可数,大部分串口调试工具都会因此崩溃)
; R4 W' y; Q# R" G
USB Serial Tools 下载地址:  USB Serial Tools.zip
8 @! E0 G9 `* E- ^5 i1 }2 I2 B8 d
6 g8 G# J. O7 \5 p
8 O4 i7 Z; \6 k# X; g

+ U0 b5 v& S9 y3 s" N( v
2 @& M* v) s2 ~* d, d1 r" ~
9 {8 H' c: q% z: M9 k* D0 @
$ ~# [5 W% [$ a: F1 f

0 \& y: h; h2 n/ h2 u
( H# G" O/ Z' u  P6 [7 z
! O' W$ V9 \3 F" A

+ q! I; L9 J1 A+ k- d. Y+ Q& \. o3 O, G  ]3 j" F# E
+ v' E4 v' y" s+ D( A! b. d$ Y
" z9 P7 h$ X; K9 [' F" P! [

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

) _/ G* a& _# f1 J4 u9 o好东西啊!学习学习!
tech1222 回答时间:2020-2-11 23:36:35
有参考的作用,谢谢

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版