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

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

[复制链接]
wjandsq 发布时间:2014-12-23 16:26
本帖最后由 wjandsq 于 2015-9-6 15:08 编辑 5 }9 L  F$ ?+ j: u; j
5 H. S/ k4 r$ m4 X
根据ST英文社区提供的资料,实现的USB转多路串口(USB-Multiple-CDC)例程,利用了STM32F103系列多端点的特性。而STM32F2/F4端点数量较少,不能实现USB-Multiple-CDC,但STM32F2/F4可以外加高速PHY芯片,实现USB2.0高速通讯。应该说F1和F2、F4使用场合不同,所以功能定位有所不同。: r/ S& I3 l0 P5 o( b' S  B. K0 ~

) e+ K9 n/ @: v
/ L: ]8 [6 r1 Z& Q* ?3 I例程包下载地址:USB-Multiple-CDC  
2 Q" @1 o2 n. V+ M1 E# T( J; y1 r- ]
  {8 C7 n, f  z
, y, v3 V% Z, E2 \
注意事项:
" U- j- O) w9 j, J1.工程包中含有驱动安装引导文件。
1 L; w8 A! F5 A) m/ J! c; W2.3CDC工程包,属于USB转多路串口(USB-Multiple-CDC),驱动的安装可参考“USB-Dual-CDC驱动安装说明书”。
% v$ D- o( S9 h" \3.采用带参数的宏实现3路串口的DMA发送,这个相对于ST官方的阻塞式发送,更具有实用性。" w5 F5 F* H6 m" a
) S7 m- s. n% B; m% m
; e/ H1 Z8 ?& }8 {' F! ], b0 O
USB-Dual-CDC驱动安装说明书下载地址: USB-Dual-CDC驱动安装说明书
* W/ E$ f& {* u0 Y! n% NUSB-Dual-CDC驱动安装说明书是之前USB-Dual-RS485产品的驱动安装说明书,可以参考这个安装步骤,3路的驱动,就是多安装1路而已。. y' F& z& H5 D, F5 D  D: d
& E( L: m6 {* ^/ @" J+ z' f

; a& }8 v3 h% R* f9 z, J+ G: e三路串口的DMA发送代码部分预览如下:. @  r/ {- p; k& C5 v( p/ k
/* 带参数的宏功能(预编译展开): USB的IN端点 发送数据到PC主机 */- Y3 K" @! F* l* {/ G) R! ]* |
#define EPx_IN_Callback(ENDPx, CDCx_Tx_State, VCPx_Rx_Buffer, VCPx_Rx_ptr_out, VCPx_Rx_length) {\
( M$ C5 R& G+ J, x/ `' V; M    uint16_t USB_Tx_ptr;\
5 E0 A- h4 Z# e; s    uint16_t USB_Tx_length;\7 a# e6 x+ k* e$ V
    if (CDCx_Tx_State == 1) {\/ ^" P3 E7 l3 H- s9 Y" e6 s
        USB_Tx_ptr = VCPx_Rx_ptr_out;\9 {  j6 v( ]' {; Z* C
        if (VCPx_Rx_length == 0) {\, a5 M  Y# A8 e. }+ }
            CDCx_Tx_State = 0;\; L" \! m7 }7 w/ H0 D
            SetEPTxCount(ENDPx,0);\: N: @0 b; Y* L
            SetEPTxValid(ENDPx);\" H+ N$ q/ S, E
        } else {\
3 y) a/ Z4 e% Y# i* }            if (VCPx_Rx_length > VIRTUAL_COM_PORT_DATA_SIZE) {\
2 _& `: @0 t$ c- Y2 r) W, T* c                USB_Tx_length = VIRTUAL_COM_PORT_DATA_SIZE;\; H0 T0 {6 L. E" r1 n5 z5 J2 w
                VCPx_Rx_ptr_out += VIRTUAL_COM_PORT_DATA_SIZE;\
2 F% K  ?1 o, l/ z6 h& X/ Y# a                VCPx_Rx_length -= VIRTUAL_COM_PORT_DATA_SIZE;\
& a: d; N. B& @+ _  A* I            } else {\
" f8 {$ u8 v( a& @2 a+ u                USB_Tx_length = VCPx_Rx_length;\
3 c0 Q% `: d+ G8 U: t, E7 ?                VCPx_Rx_ptr_out += VCPx_Rx_length;\& W& H8 q( @( _
                VCPx_Rx_length = 0;\0 b+ G6 H3 N& k9 K
            }\; w9 g* Y8 s4 Z! _
            USB_SIL_Write(ENDPx, &VCPx_Rx_Buffer[USB_Tx_ptr], USB_Tx_length);\
/ `4 w/ z  r0 e. O6 j) j            SetEPTxValid(ENDPx);\
: ~9 Q# b) U- c5 e        }\/ q7 w+ e/ g+ V- o) i+ X
    }\
( D7 [5 r& q( l: J' a}
. |, b4 N& V1 y4 n
& d8 ~6 {- Z- g! g' }( f
% M; H( J" M1 n/* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(阻塞方式) */
$ d$ _0 g" H* _2 \9 M1 Z. f+ [#define EPx_OUT_Callback(ENDPx, USARTx, GPIOx, GPIO_Pin_x) {\6 V0 U+ O9 r1 p: S. I
    uint32_t i;\9 a1 K3 A% Y% A7 c, B0 x1 {
    uint16_t USB_Rx_Cnt;\
1 s5 ^, e7 g1 o    USB_Rx_Cnt = USB_SIL_Read(ENDPx | 0x00, USB_Rx_Buffer); \
9 b& ?) V) c( K' ^9 g4 q    GPIOx->BSRR = GPIO_Pin_x;\
6 B/ K, C6 m" O5 u    for (i = 0; i < USB_Rx_Cnt; i++) {\2 ^! D% X- Q/ `6 X0 k1 J; g
        USARTx->DR = *(USB_Rx_Buffer + i);\
9 B4 U+ b# w- L( u% O1 |& V3 X        while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);\
. G; b6 E& f: H0 f1 k    }\
- ~3 S  y9 T: N. {: U' V    SetEPRxValid(ENDPx);\8 ^# @+ U1 t- y( R' j
    while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);\
( k2 U5 V9 h( g& n' w    USART_ClearFlag(USARTx, USART_FLAG_TC);\. Y- s2 N' y5 E& A! z
    GPIOx->BRR = GPIO_Pin_x;\
/ G  x3 \$ G- X' N, E}
/ ]- e) V; g2 V1 o4 ^& L0 \4 F
1 M8 S# t  L' L' @3 W) [/* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(DMA方式) */$ [: R+ x' [) N! ~7 i& y
#define EPx_OUT_Callback_DMA(Flag_VCPx_Tx_Buf_Use, ENDPx, VCPx_Tx_Buffer1,VCPx_Tx_Buffer2,\; K: m: y  e8 M* V2 k5 U
    GPIOx, GPIO_Pin_x, DMA1_Channelx, VCPx_Tx_Buffer_Cnt, Flag_VCPx_Tx_Buf_Full) {\
# p0 g: B5 U8 n3 i+ @! @    uint16_t USB_Rx_Cnt;\
- {" I7 o4 m# L% w# X4 ]3 {1 r    if(Flag_VCPx_Tx_Buf_Use == 0){\! H. q- L- W( ?0 X6 i  Z
        USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\
/ L8 u1 }- t' L3 L6 Y) Y( }% l1 {+ z        PMAToUserBufferCopy(&VCPx_Tx_Buffer1[0], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\4 j% u8 f( |  l2 ~# R. |
        SetEPRxValid(ENDPx);\
. Y) B0 S" Z9 o) \! O2 k+ F        GPIOx->BSRR = GPIO_Pin_x;\
/ e4 w, S& a4 X% p. O  N        DMA1_Channelx->CNDTR = USB_Rx_Cnt;\5 D/ [' |0 U1 ^: `$ Z( i6 |3 _
        DMA_Cmd(DMA1_Channelx, ENABLE);\: C4 s; x0 [% {% a3 @, k: e+ [
        Flag_VCPx_Tx_Buf_Use = 1;\# k+ E) b! j1 H4 |9 r: o% q! L6 {
        VCPx_Tx_Buffer_Cnt = 0;\. Z" h' M$ O6 B. q' R
    } else {\) _8 m, \$ U2 ^: h0 |/ ?. ^. p! v1 B: h
        USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\
* p% F9 K2 }4 b1 U2 a        if(VCPx_Tx_Buffer_Cnt < (1024-128)){\
" U9 c: N- d  v. g( ~! F' B+ L          PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\
; x7 y+ t5 D+ y8 ^: @7 X* ?. P          VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\
* k% q" W3 b6 L; i          SetEPRxValid(ENDPx);\/ y+ b1 l" P1 O
        } else {\
) n; r+ o- h1 ]% S6 C" ~          PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\0 K3 L- ~3 m9 u- M4 S; @# w
          VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\: t9 S: w4 f' S7 B' y
          Flag_VCPx_Tx_Buf_Full = 1;\: m" q& ]2 V0 B2 _
        }\
2 \1 ]; z/ X$ d; V9 `    }\; Z8 d7 G5 S" o( N  S/ Q1 v. s
}' \3 M5 b9 J% V8 a$ Y3 w; Y! y0 K  J/ U

! v. Q! s' }9 w附录:USB Serial Tools工具软件的特殊功能介绍4 x2 W8 _. \( v' o1 j' A
一般的串口调试工具,不会针对USB插拔做专门的检测和处理,比较容易崩溃,例如微软收购的超级终端等。
! T) V) O7 D6 T! `8 b8 b/ `USB Serial Tools 是本人自2009-2012年,个人业余时间开发的一个带有USB插拔检测的串口调试软件。
% o) b0 {: [( w6 U5 m6 o. x和其它串口调试工具相比,是专用软件,值得一提的功能如下:3 X- n9 L; N# W7 K, ^
1 支持高波特率。(支持该功能的串口调试工具屈指可数,大部分串口调试工具仅支持到115200)

2 u' C# w  D$ y2 支持USB插拔检测。(支持该功能的串口调试工具屈指可数,大部分串口调试工具都会因此崩溃)
# k3 E6 _% ~4 E" q  {/ E' i
USB Serial Tools 下载地址:  USB Serial Tools.zip
$ Z4 Y5 |; i/ @' t" C3 B
0 E8 `! B( S4 F' g9 _- X
/ A! m" H% j( s8 r
. g. o6 Q$ ~. ?) y5 \% U4 H

* ~! T1 {$ U) A$ A+ |0 Y% r/ b$ ?  Q3 J: l+ }1 D/ v  t' ^
0 I4 M+ z  r! r) i

4 o6 Y/ y5 g* W3 [, L0 L7 F4 {* `3 b' }) W6 T) E1 p

1 p/ F8 M. K  R* \5 r- w: C

4 P) H3 u% p( J7 Y! C9 W" ]
) `6 y  _* m4 i! T4 `+ w) o9 G
& w: x5 i1 |& p# ]6 J+ I+ ]: W  a# ], W7 P

% A: w; A7 J1 a$ n0 D9 ^

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

5 p) b; s/ e0 Q9 |) G好东西啊!学习学习!
tech1222 回答时间:2020-2-11 23:36:35
有参考的作用,谢谢

所属标签

相似分享

官网相关资源

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