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

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

[复制链接]
wjandsq 发布时间:2014-12-23 16:26
本帖最后由 wjandsq 于 2015-9-6 15:08 编辑 , }/ V( o/ v4 p2 r" A* T

6 |6 N# t' ~. o  x3 g# ]) r! G* P6 f根据ST英文社区提供的资料,实现的USB转多路串口(USB-Multiple-CDC)例程,利用了STM32F103系列多端点的特性。而STM32F2/F4端点数量较少,不能实现USB-Multiple-CDC,但STM32F2/F4可以外加高速PHY芯片,实现USB2.0高速通讯。应该说F1和F2、F4使用场合不同,所以功能定位有所不同。
$ Q- k4 u) Z6 Q7 S7 ^* N2 T
1 D3 A7 o1 u8 x; l, M1 N6 l! Q
4 T2 z+ w: S+ i/ D. \例程包下载地址:USB-Multiple-CDC  # {) E' y* ]8 ]  S! N
/ O1 A6 z8 J6 p- W/ ]7 c' H
+ G7 g1 g, A8 E0 E
  o: [7 O: W- ~3 _7 C/ T; u
注意事项:
5 c% v! T2 l9 o1 Y3 ~1.工程包中含有驱动安装引导文件。
0 a' ?" o, K% N) ^' L; u3 ?2.3CDC工程包,属于USB转多路串口(USB-Multiple-CDC),驱动的安装可参考“USB-Dual-CDC驱动安装说明书”。
' J1 ^, [. A' g) M3.采用带参数的宏实现3路串口的DMA发送,这个相对于ST官方的阻塞式发送,更具有实用性。
- g: K' L6 F- e) L2 z  L2 i
! b* J* W; ?9 o) v' D
3 y2 _, f- g3 v; e! `USB-Dual-CDC驱动安装说明书下载地址: USB-Dual-CDC驱动安装说明书
% t6 l* \- Q; UUSB-Dual-CDC驱动安装说明书是之前USB-Dual-RS485产品的驱动安装说明书,可以参考这个安装步骤,3路的驱动,就是多安装1路而已。
# s' N- n. L0 O9 D+ d- ?7 S8 J. Q# c" c% \4 P! ]* G3 o1 _: E

3 w5 ~# c& \1 G三路串口的DMA发送代码部分预览如下:5 h7 w" U  w( [
/* 带参数的宏功能(预编译展开): USB的IN端点 发送数据到PC主机 */
; R/ \; q; @6 E% |) x3 ~* `4 V9 t#define EPx_IN_Callback(ENDPx, CDCx_Tx_State, VCPx_Rx_Buffer, VCPx_Rx_ptr_out, VCPx_Rx_length) {\
& W- s. A* R2 K  s    uint16_t USB_Tx_ptr;\
4 T, a( ~; I% H: r8 \0 @7 L7 k    uint16_t USB_Tx_length;\
  P% Q% V6 d1 I    if (CDCx_Tx_State == 1) {\$ i0 B$ k% y4 ~# i
        USB_Tx_ptr = VCPx_Rx_ptr_out;\
  w6 V7 {' Z( B5 d; S3 P6 E7 g# e        if (VCPx_Rx_length == 0) {\: E4 C+ ^7 Z3 h# n3 ?
            CDCx_Tx_State = 0;\
5 j$ G2 p: T; w7 c, O* P1 H: ?( @            SetEPTxCount(ENDPx,0);\
* {3 Q2 n# a8 [# Y+ x            SetEPTxValid(ENDPx);\
: G! R# p( D! d        } else {\5 y/ u* u; B& `" e  \7 v
            if (VCPx_Rx_length > VIRTUAL_COM_PORT_DATA_SIZE) {\
& U- h) S$ y* Y4 n  |, X                USB_Tx_length = VIRTUAL_COM_PORT_DATA_SIZE;\# J) F. j0 @; O, _2 g! T/ Y  q! _
                VCPx_Rx_ptr_out += VIRTUAL_COM_PORT_DATA_SIZE;\
: H; j' I9 v; \3 I* a' G                VCPx_Rx_length -= VIRTUAL_COM_PORT_DATA_SIZE;\
! e+ J" o$ C% w/ O6 v3 t            } else {\
2 \. t2 s7 @; _; [  g                USB_Tx_length = VCPx_Rx_length;\$ A7 N+ |- N" p9 `3 @  R
                VCPx_Rx_ptr_out += VCPx_Rx_length;\" X9 K, t1 I6 h0 ]) k  r+ b$ S
                VCPx_Rx_length = 0;\  o# l: e; v" N1 M# l
            }\
# E4 m" O) ?; N+ H5 k- i# ]            USB_SIL_Write(ENDPx, &VCPx_Rx_Buffer[USB_Tx_ptr], USB_Tx_length);\
/ Q2 t0 k4 q  S0 w- D            SetEPTxValid(ENDPx);\
( H; M* P- ^, J$ {        }\
% Y5 B# E0 X0 X8 T: [+ r    }\
) v8 ?7 [/ h, G}8 |4 \  A; s3 H: w+ }

9 l/ B3 G* ~' X# J' s& _( a1 ^$ R2 I% U) i- X6 i
/* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(阻塞方式) */
5 r2 D, X0 Y9 `% }% {#define EPx_OUT_Callback(ENDPx, USARTx, GPIOx, GPIO_Pin_x) {\9 }) a: N* W: k
    uint32_t i;\
- ~7 k; A+ I' v6 M    uint16_t USB_Rx_Cnt;\: R* f$ v! F2 u9 y0 S
    USB_Rx_Cnt = USB_SIL_Read(ENDPx | 0x00, USB_Rx_Buffer); \* b4 P5 Q# u! U: f2 R' r
    GPIOx->BSRR = GPIO_Pin_x;\
4 h# V8 t; [' N. Y0 M    for (i = 0; i < USB_Rx_Cnt; i++) {\% \+ _! p, Q! I- I. Z* y
        USARTx->DR = *(USB_Rx_Buffer + i);\* N7 `. x7 \* G$ \9 O
        while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);\8 M/ O4 i+ l  U0 z
    }\( D. S+ N5 Q0 x# i2 j& o- l
    SetEPRxValid(ENDPx);\
/ k! z- ^* M4 s- U6 R3 o! s. ^    while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);\5 _0 N: A5 s, K
    USART_ClearFlag(USARTx, USART_FLAG_TC);\
$ D7 ~) i, f7 Y1 u( D    GPIOx->BRR = GPIO_Pin_x;\
3 U; w9 }! m. F9 ^}0 p# F; L, \  t& I( ?
" _* K; F- ]9 p! ^* E& A# \
/* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(DMA方式) */
- K3 R. q$ T$ v: x4 Q/ ^& {#define EPx_OUT_Callback_DMA(Flag_VCPx_Tx_Buf_Use, ENDPx, VCPx_Tx_Buffer1,VCPx_Tx_Buffer2,\) s4 [5 Z" a, D. F" F& @6 u- E* x
    GPIOx, GPIO_Pin_x, DMA1_Channelx, VCPx_Tx_Buffer_Cnt, Flag_VCPx_Tx_Buf_Full) {\, O; S0 z* O/ y
    uint16_t USB_Rx_Cnt;\0 I( B" O7 H/ W1 D* J
    if(Flag_VCPx_Tx_Buf_Use == 0){\
) N% ?$ }0 n1 c. t1 u4 x/ s        USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\* }! o- \# y. m- v4 e$ m, \
        PMAToUserBufferCopy(&VCPx_Tx_Buffer1[0], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\9 X2 C& {8 z9 k- [9 c8 c! I) F
        SetEPRxValid(ENDPx);\
6 X; V6 M4 c+ s2 K. `        GPIOx->BSRR = GPIO_Pin_x;\
, P# I1 u7 i8 f        DMA1_Channelx->CNDTR = USB_Rx_Cnt;\: ]9 [, a% r! _" C; t5 c- C; c
        DMA_Cmd(DMA1_Channelx, ENABLE);\
( Z3 S9 A: o5 d        Flag_VCPx_Tx_Buf_Use = 1;\
& P; ~9 o& |) p$ A" W        VCPx_Tx_Buffer_Cnt = 0;\
$ n- ~8 E8 p. T7 a( [! r    } else {\
* ]* ~7 H# S6 x" l9 T        USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\
4 d. N4 z2 |, E1 t1 `+ H        if(VCPx_Tx_Buffer_Cnt < (1024-128)){\3 j7 N' M0 W. s% n
          PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\
1 v, D- ~6 U/ @8 |4 s% P; K8 F; ~8 N          VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\1 l! S9 [. ~9 W1 X, Z7 y
          SetEPRxValid(ENDPx);\% M# c8 o* P" c+ z9 D5 H% D
        } else {\
6 ^" r. a$ c0 K( Z9 T' ~          PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\
5 O. D' `, n5 n, Y% Z          VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\
1 I3 c2 [, s& l  I# s0 E2 s; E. K' N& Z% z          Flag_VCPx_Tx_Buf_Full = 1;\4 V( V5 s( b# t9 o0 a+ H
        }\
! h, v% @% ?! z2 X* `2 |    }\
9 s- ~1 U& k( I- j}( v) S" e, H# n( N% ~2 R$ ]4 I

/ Q7 Q8 D9 E2 K9 e' b, Q4 s+ P6 V附录:USB Serial Tools工具软件的特殊功能介绍
  S2 D% B9 C6 B9 w: D1 d8 X一般的串口调试工具,不会针对USB插拔做专门的检测和处理,比较容易崩溃,例如微软收购的超级终端等。+ I# q- R0 g  o3 r
USB Serial Tools 是本人自2009-2012年,个人业余时间开发的一个带有USB插拔检测的串口调试软件。
6 G5 p1 {) X9 H9 h. g' V和其它串口调试工具相比,是专用软件,值得一提的功能如下:
: ^8 v, ]8 b( a( [: [  ^! j1 支持高波特率。(支持该功能的串口调试工具屈指可数,大部分串口调试工具仅支持到115200)
% l& C" N1 k$ a8 @9 V! }
2 支持USB插拔检测。(支持该功能的串口调试工具屈指可数,大部分串口调试工具都会因此崩溃)
3 u8 u' z% y9 l  }$ c
USB Serial Tools 下载地址:  USB Serial Tools.zip 6 f+ p- E- u) l5 G

# Y& G4 S( ?6 v; x  o
7 T+ r- d. m5 G0 z, F& i& A
, p# j$ S( v, t6 T) ~5 \$ w
1 k; b& V+ X& z. v2 R9 c' c+ J

$ [% J. ]1 Q% i# L* A0 j

* V* X& C1 d: b6 g- Y* _1 L* Z; O) P; U

! O9 S' _5 X2 V, }& @  @9 n- ?/ I; \$ d% z7 l$ k! d7 n
& ?3 M* ]* W* a# k0 z' C- w
8 A. I, _/ ?8 H4 e0 Z: H

# z+ j0 ]% c3 C" x& i$ C1 u! Q8 n1 z7 Q! t1 w4 h

6 F, ?, d* `+ 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& N( \3 Z/ k' j; H: B; f' c
好东西啊!学习学习!
tech1222 回答时间:2020-2-11 23:36:35
有参考的作用,谢谢

所属标签

相似分享

官网相关资源

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