
本帖最后由 wjandsq 于 2015-9-6 15:08 编辑 % 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 例程包下载地址:USB-Multiple-CDC : m, w( a( r: i: D 8 @) ?5 @5 H8 G 注意事项: 1.工程包中含有驱动安装引导文件。. 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 USB-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) {\ uint16_t USB_Tx_ptr;\: t# I" ?; w3 |" f: c, m uint16_t USB_Tx_length;\ if (CDCx_Tx_State == 1) {\ USB_Tx_ptr = VCPx_Rx_ptr_out;\ 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);\ 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;\ VCPx_Rx_ptr_out += VIRTUAL_COM_PORT_DATA_SIZE;\ VCPx_Rx_length -= VIRTUAL_COM_PORT_DATA_SIZE;\; K/ g' L+ |9 Y* S0 |- C6 P } else {\ USB_Tx_length = VCPx_Rx_length;\ VCPx_Rx_ptr_out += VCPx_Rx_length;\5 a) C) H8 G* w6 F VCPx_Rx_length = 0;\ }\( 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 }\ }\ }/ g, H( I8 A) ]" Y2 P8 c8 E /* 带参数的宏功能(预编译展开): 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;\ for (i = 0; i < USB_Rx_Cnt; i++) {\ USARTx->DR = *(USB_Rx_Buffer + i);\ while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);\9 b) X- i* ^5 r1 l+ d }\ SetEPRxValid(ENDPx);\ while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);\ USART_ClearFlag(USARTx, USART_FLAG_TC);\ GPIOx->BRR = GPIO_Pin_x;\ } + a: \" P0 `7 w /* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(DMA方式) */ #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;\ if(Flag_VCPx_Tx_Buf_Use == 0){\! y1 i- [7 }9 x" M; T* G; k USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\ PMAToUserBufferCopy(&VCPx_Tx_Buffer1[0], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\9 X0 R2 v/ P7 } e$ o SetEPRxValid(ENDPx);\ GPIOx->BSRR = GPIO_Pin_x;\4 [1 z( @! [ ~$ M DMA1_Channelx->CNDTR = USB_Rx_Cnt;\( `* W* R8 A. A DMA_Cmd(DMA1_Channelx, ENABLE);\ Flag_VCPx_Tx_Buf_Use = 1;\ VCPx_Tx_Buffer_Cnt = 0;\* ]/ Z- v3 g2 M7 ~0 e } else {\ USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\& P' P/ Y) ?' q/ x if(VCPx_Tx_Buffer_Cnt < (1024-128)){\ 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;\ SetEPRxValid(ENDPx);\ } else {\ 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;\ 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 } 附录:USB Serial Tools工具软件的特殊功能介绍 一般的串口调试工具,不会针对USB插拔做专门的检测和处理,比较容易崩溃,例如微软收购的超级终端等。 S1 @1 ?# P& W+ ?/ F! `2 y* E USB Serial Tools 是本人自2009-2012年,个人业余时间开发的一个带有USB插拔检测的串口调试软件。 和其它串口调试工具相比,是专用软件,值得一提的功能如下: 1 支持高波特率。(支持该功能的串口调试工具屈指可数,大部分串口调试工具仅支持到115200)) ^' S2 W5 Y+ h- r2 g9 U 2 支持USB插拔检测。(支持该功能的串口调试工具屈指可数,大部分串口调试工具都会因此崩溃) USB Serial Tools 下载地址: USB Serial Tools.zip 5 i1 }2 I2 B8 d 6 g8 G# J. O7 \5 p 8 O4 i7 Z; \6 k# X; g 9 {8 H' c: q% z: M9 k* D0 @ $ ~# [5 W% [$ a: F1 f ! O' W$ V9 \3 F" A + 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串å£å·¥å ·æ¯æ端ç¹å·æ¾ç¤º
好东西啊!学习学习!