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

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

[复制链接]
wjandsq 发布时间:2014-12-23 16:26
本帖最后由 wjandsq 于 2015-9-6 15:08 编辑
( h2 h: O3 E2 w2 p5 [6 N3 Z( {& H2 S& P! k8 z5 L; g5 i; M
根据ST英文社区提供的资料,实现的USB转多路串口(USB-Multiple-CDC)例程,利用了STM32F103系列多端点的特性。而STM32F2/F4端点数量较少,不能实现USB-Multiple-CDC,但STM32F2/F4可以外加高速PHY芯片,实现USB2.0高速通讯。应该说F1和F2、F4使用场合不同,所以功能定位有所不同。
* K7 P$ g6 b! N& I$ b. B1 E! _3 U9 i0 |2 l- W6 \( Y" c5 A& g. f- {) _' R

) T5 l; V. b* O$ B例程包下载地址:USB-Multiple-CDC  
; _. f( |7 j7 @( t6 z: Q, q5 l" E# h7 R/ ?1 C% X$ @

, v6 c5 i% A5 j, m+ `! o; y) i' q1 ]* N
注意事项:
2 }! B. q- B1 ^  g& H9 q1.工程包中含有驱动安装引导文件。4 R: R1 S8 p! Q% Y4 a( i/ W
2.3CDC工程包,属于USB转多路串口(USB-Multiple-CDC),驱动的安装可参考“USB-Dual-CDC驱动安装说明书”。. I* ?1 u+ B* l
3.采用带参数的宏实现3路串口的DMA发送,这个相对于ST官方的阻塞式发送,更具有实用性。" {$ |; U- F9 e- e- _% U2 P& X

; R4 c" `8 s! H0 I6 V2 q/ b
  S* s; Y+ v1 |  O) e: \8 t! |USB-Dual-CDC驱动安装说明书下载地址: USB-Dual-CDC驱动安装说明书) ?& }9 F# g) W" D& k1 x) t
USB-Dual-CDC驱动安装说明书是之前USB-Dual-RS485产品的驱动安装说明书,可以参考这个安装步骤,3路的驱动,就是多安装1路而已。* t! D, s$ `, c8 ?% f8 f
8 f4 M/ K, {7 \0 @5 L' p8 T
: k$ u; K6 [3 Z. y
三路串口的DMA发送代码部分预览如下:% ^: c' h0 b& n; p. p" x
/* 带参数的宏功能(预编译展开): USB的IN端点 发送数据到PC主机 */
) c/ x" `' P6 [#define EPx_IN_Callback(ENDPx, CDCx_Tx_State, VCPx_Rx_Buffer, VCPx_Rx_ptr_out, VCPx_Rx_length) {\
5 F3 q, l3 E7 B& }6 ]" s3 U    uint16_t USB_Tx_ptr;\
" x8 O# ]* R/ b/ w' b* U) N0 `    uint16_t USB_Tx_length;\/ H6 u, s* A" Z( f7 R
    if (CDCx_Tx_State == 1) {\
! F# ~0 Y1 T$ |        USB_Tx_ptr = VCPx_Rx_ptr_out;\' j! H7 A" ]) ~  E
        if (VCPx_Rx_length == 0) {\" G2 m' P/ m4 ?3 i8 u# ?
            CDCx_Tx_State = 0;\8 j$ o6 N! `2 l; B4 Q: e7 }8 E
            SetEPTxCount(ENDPx,0);\! h' @4 o# p5 V7 X) y
            SetEPTxValid(ENDPx);\$ {* G# c% k3 C( ?5 n( y0 M- X& d
        } else {\
  L$ |! K0 Q7 o, D" n9 K            if (VCPx_Rx_length > VIRTUAL_COM_PORT_DATA_SIZE) {\
) n: E6 S% o& |1 h7 `                USB_Tx_length = VIRTUAL_COM_PORT_DATA_SIZE;\
, T, V* P2 C9 K7 p1 G$ b                VCPx_Rx_ptr_out += VIRTUAL_COM_PORT_DATA_SIZE;\3 H- y( ~. a6 c7 x
                VCPx_Rx_length -= VIRTUAL_COM_PORT_DATA_SIZE;\; l1 p9 @, g  ^3 R; J8 X
            } else {\
* j& p: a! X' \* v( X% D1 y                USB_Tx_length = VCPx_Rx_length;\
' c- l$ R8 O6 V+ e$ P& [                VCPx_Rx_ptr_out += VCPx_Rx_length;\
1 ~( n2 V7 i* O6 T: Y, E9 k& _/ G0 j                VCPx_Rx_length = 0;\
0 a' e- I) h5 R            }\& L6 ^* I# {& R2 J' T
            USB_SIL_Write(ENDPx, &VCPx_Rx_Buffer[USB_Tx_ptr], USB_Tx_length);\
* u9 h* j" C$ N3 ]- L+ J9 W, j            SetEPTxValid(ENDPx);\. h. F% v! b: @' R
        }\
/ s- d' B1 J# n- Z+ L$ E    }\
# E: ?' S+ S8 f9 h}6 a8 Q' V4 C: d5 N, P7 o- E
3 W% @) s* g8 x1 m# C/ ~! @* L

& x( |% i  f; h! k3 w7 Q9 E/* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(阻塞方式) */- C6 D' E! E. T( k* ]
#define EPx_OUT_Callback(ENDPx, USARTx, GPIOx, GPIO_Pin_x) {\" O( F- |. \9 h) X
    uint32_t i;\+ V4 B& k% W6 L2 i
    uint16_t USB_Rx_Cnt;\0 h( q( Z1 ~, {* u1 M
    USB_Rx_Cnt = USB_SIL_Read(ENDPx | 0x00, USB_Rx_Buffer); \
" s2 g- U/ y6 G    GPIOx->BSRR = GPIO_Pin_x;\! y4 \' e6 C! t5 b" \7 ]
    for (i = 0; i < USB_Rx_Cnt; i++) {\# ?! U, T4 K' c- z0 v& i& _
        USARTx->DR = *(USB_Rx_Buffer + i);\* i' f" `1 q  l$ ?' t* W6 Q
        while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);\
$ L9 D7 D2 f* N8 }! ~6 J6 L    }\; n5 T" ]" I" ^+ S, w* N. u( E
    SetEPRxValid(ENDPx);\, u& X+ W0 n% M( r) F4 L4 `
    while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);\- {7 \' U( E5 z& C/ M! v+ {( ]
    USART_ClearFlag(USARTx, USART_FLAG_TC);\
8 W( o+ K) ]  C* Q  }% V- V    GPIOx->BRR = GPIO_Pin_x;\
, L* G! g7 ?7 k$ J! n: G( Z}
3 G5 X, Q9 ?9 J* |, V- n* f: R- m% j5 ?6 s$ J
/* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(DMA方式) */: p; O7 b$ L) w$ |( L& n" H
#define EPx_OUT_Callback_DMA(Flag_VCPx_Tx_Buf_Use, ENDPx, VCPx_Tx_Buffer1,VCPx_Tx_Buffer2,\
  n" p$ B  b/ S    GPIOx, GPIO_Pin_x, DMA1_Channelx, VCPx_Tx_Buffer_Cnt, Flag_VCPx_Tx_Buf_Full) {\8 M% {8 S: d: _$ j9 A9 ~0 ~$ ?) g
    uint16_t USB_Rx_Cnt;\: F$ F# k: A; C5 W2 x  z% s. ?; [( E
    if(Flag_VCPx_Tx_Buf_Use == 0){\* }4 G& ^# R0 c- P% d& t
        USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\$ v1 }" E9 S2 Q  F" N4 S+ H6 V! y
        PMAToUserBufferCopy(&VCPx_Tx_Buffer1[0], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\
, r4 V# f) M/ `% e4 P, B! i; q        SetEPRxValid(ENDPx);\' B4 S7 f, Q5 k0 S( T2 H- W
        GPIOx->BSRR = GPIO_Pin_x;\- b" A' ]8 @, t
        DMA1_Channelx->CNDTR = USB_Rx_Cnt;\
7 q& w2 r% a4 q: U        DMA_Cmd(DMA1_Channelx, ENABLE);\3 |+ B5 D: e% d' {9 N: I$ H; V& H' b
        Flag_VCPx_Tx_Buf_Use = 1;\
( `9 y9 g) G% r0 B3 }7 l/ \3 [        VCPx_Tx_Buffer_Cnt = 0;\3 I+ b! e* S- P& ^
    } else {\
3 m9 R, X1 \7 E" d: C$ a4 z+ a9 X        USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\7 C. x) }+ M* _/ h/ A0 c- i
        if(VCPx_Tx_Buffer_Cnt < (1024-128)){\
( J9 v9 P) W+ n0 z8 r; _          PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\. E7 \+ [7 y: N! }
          VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\1 A6 u8 G& \4 Q! N( V: p6 D
          SetEPRxValid(ENDPx);\
) ?9 F6 @3 E6 b: R2 S        } else {\
& y+ [2 m7 h( R. Q/ S7 u          PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\
8 Q2 P( p, W% @* m  @" t8 |: ?) H          VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\7 F" h: I. A& v( w1 a
          Flag_VCPx_Tx_Buf_Full = 1;\2 v. ^, `8 A+ N$ F, ^
        }\
# X8 C& `0 q9 o$ x* M0 u    }\
8 w& e8 [# z# L8 J7 R2 Q6 g}
$ ]5 Y4 a& D" M/ S0 ~, Y. p' _
9 v0 a8 z7 q5 _  F& v
附录:USB Serial Tools工具软件的特殊功能介绍+ G9 r2 v; g" H2 d1 V3 V
一般的串口调试工具,不会针对USB插拔做专门的检测和处理,比较容易崩溃,例如微软收购的超级终端等。
" }* S% v7 m3 pUSB Serial Tools 是本人自2009-2012年,个人业余时间开发的一个带有USB插拔检测的串口调试软件。
- X  H) g$ g0 s8 K0 R8 k& o: s和其它串口调试工具相比,是专用软件,值得一提的功能如下:
* g' Y# m0 J$ J" ^3 Q1 支持高波特率。(支持该功能的串口调试工具屈指可数,大部分串口调试工具仅支持到115200)

% r' U) i2 M$ i. V2 支持USB插拔检测。(支持该功能的串口调试工具屈指可数,大部分串口调试工具都会因此崩溃)
. U+ R# N, k* a2 W$ |) u5 f
USB Serial Tools 下载地址:  USB Serial Tools.zip
5 Q: }. e; i0 B1 @+ [7 Q* p  m: G* N

( P  E1 g9 Y, f9 |
/ p1 |# {4 M( E! m' M
  z# H& e) a8 h8 d; B
0 ^8 Z% d* ?2 ^! E2 s+ I
/ v6 l6 v! q. j* S

, B3 x# w8 o- [3 I% l5 w7 l7 L; F9 m4 R8 t

$ n# ]7 _1 B7 u' v& O
0 m! G& }5 W! L$ p
1 X' s& H! R) K' n) s! c  ?# u

8 {6 t( w6 {8 i8 x# K0 o* X3 k3 h3 W  Y$ k& o
9 _# Y+ U7 t. D6 b" d

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
$ c: C7 _' r6 i+ j2 l
好东西啊!学习学习!
tech1222 回答时间:2020-2-11 23:36:35
有参考的作用,谢谢
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版