本帖最后由 wjandsq 于 2015-9-6 15:08 编辑 根据ST英文社区提供的资料,实现的USB转多路串口(USB-Multiple-CDC)例程,利用了STM32F103系列多端点的特性。而STM32F2/F4端点数量较少,不能实现USB-Multiple-CDC,但STM32F2/F4可以外加高速PHY芯片,实现USB2.0高速通讯。应该说F1和F2、F4使用场合不同,所以功能定位有所不同。 3 b) ]1 }) u5 t3 E1 w : j# \5 R# v4 b# F$ u6 p0 Z* e. L 例程包下载地址:USB-Multiple-CDC : T' U+ Z1 Z7 O8 F. \- k , c6 P8 e# B& C7 k$ [0 Z, z # z( P+ m2 ^2 @6 L . f2 x( y" o% ^( A 注意事项: 7 y3 ~6 b C# F% c4 w( Y% M 1.工程包中含有驱动安装引导文件。) d/ a" u. x* K 2.3CDC工程包,属于USB转多路串口(USB-Multiple-CDC),驱动的安装可参考“USB-Dual-CDC驱动安装说明书”。6 @2 B. r6 J. o: ]0 z 3.采用带参数的宏实现3路串口的DMA发送,这个相对于ST官方的阻塞式发送,更具有实用性。& B0 ]+ R7 h( V' \8 T2 N ) S' f5 S# a& u; H) X USB-Dual-CDC驱动安装说明书下载地址: USB-Dual-CDC驱动安装说明书4 L- m! V# q) @5 z$ y- @) Y USB-Dual-CDC驱动安装说明书是之前USB-Dual-RS485产品的驱动安装说明书,可以参考这个安装步骤,3路的驱动,就是多安装1路而已。 5 H0 w! r% o$ T 三路串口的DMA发送代码部分预览如下: /* 带参数的宏功能(预编译展开): USB的IN端点 发送数据到PC主机 */. J3 Z1 C; Z. C #define EPx_IN_Callback(ENDPx, CDCx_Tx_State, VCPx_Rx_Buffer, VCPx_Rx_ptr_out, VCPx_Rx_length) {\ uint16_t USB_Tx_ptr;\ uint16_t USB_Tx_length;\ if (CDCx_Tx_State == 1) {\( l- g! d( w- B% o8 a9 c* f USB_Tx_ptr = VCPx_Rx_ptr_out;\ if (VCPx_Rx_length == 0) {\5 U; f* S$ p) g; D+ a5 O CDCx_Tx_State = 0;\" O* m' |% W- g2 f- i SetEPTxCount(ENDPx,0);\ SetEPTxValid(ENDPx);\ } else {\ if (VCPx_Rx_length > VIRTUAL_COM_PORT_DATA_SIZE) {\ USB_Tx_length = VIRTUAL_COM_PORT_DATA_SIZE;\: s# s' _. @, Y: F* ]1 { VCPx_Rx_ptr_out += VIRTUAL_COM_PORT_DATA_SIZE;\& u1 K6 j) p: L t5 I VCPx_Rx_length -= VIRTUAL_COM_PORT_DATA_SIZE;\ } else {\ USB_Tx_length = VCPx_Rx_length;\7 e) T7 w% z6 c) J VCPx_Rx_ptr_out += VCPx_Rx_length;\ VCPx_Rx_length = 0;\; W% S) ?: d9 V3 ]" r0 R }\ USB_SIL_Write(ENDPx, &VCPx_Rx_Buffer[USB_Tx_ptr], USB_Tx_length);\. |, k# a4 z8 [' H5 o |. { SetEPTxValid(ENDPx);\ }\ }\ }$ \+ h# {3 J8 ~ /* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(阻塞方式) */ #define EPx_OUT_Callback(ENDPx, USARTx, GPIOx, GPIO_Pin_x) {\ uint32_t i;\ uint16_t USB_Rx_Cnt;\& B" V/ j, u# ~5 _* L USB_Rx_Cnt = USB_SIL_Read(ENDPx | 0x00, USB_Rx_Buffer); \- y$ i8 h7 l8 m. l GPIOx->BSRR = GPIO_Pin_x;\ for (i = 0; i < USB_Rx_Cnt; i++) {\2 t2 \$ F8 D- M! H USARTx->DR = *(USB_Rx_Buffer + i);\$ m$ P7 ?( m9 y1 L: W while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);\ }\ SetEPRxValid(ENDPx);\5 |# n- m% U; _4 f" r while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);\! q; ^1 E" w! ^( W- B USART_ClearFlag(USARTx, USART_FLAG_TC);\ GPIOx->BRR = GPIO_Pin_x;\ }. A9 r) I5 Y X/ O% @8 ~+ _. _ . z4 F8 R- \' { /* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(DMA方式) */3 e' k: v( h( p' j: z #define EPx_OUT_Callback_DMA(Flag_VCPx_Tx_Buf_Use, ENDPx, VCPx_Tx_Buffer1,VCPx_Tx_Buffer2,\ GPIOx, GPIO_Pin_x, DMA1_Channelx, VCPx_Tx_Buffer_Cnt, Flag_VCPx_Tx_Buf_Full) {\% Y/ `7 m1 |9 `7 b/ w uint16_t USB_Rx_Cnt;\) x0 d$ f4 l. ]2 a# K8 z if(Flag_VCPx_Tx_Buf_Use == 0){\* x9 u- P7 O' S+ e( r USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\ PMAToUserBufferCopy(&VCPx_Tx_Buffer1[0], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\/ S2 Q( H. {& e$ t4 h SetEPRxValid(ENDPx);\ GPIOx->BSRR = GPIO_Pin_x;\. n( E i$ e: o. o DMA1_Channelx->CNDTR = USB_Rx_Cnt;\ DMA_Cmd(DMA1_Channelx, ENABLE);\/ D6 g( O! g; A: {9 `/ S Flag_VCPx_Tx_Buf_Use = 1;\ VCPx_Tx_Buffer_Cnt = 0;\* R, ]6 R) V. @4 r/ A0 h# ` } else {\/ j5 y0 ~& K9 L& k. p* s USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\/ n; s; B" y4 ]9 q2 X# ^# w if(VCPx_Tx_Buffer_Cnt < (1024-128)){\& W& }; G, g4 H PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\ VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\ SetEPRxValid(ENDPx);\ } else {\ PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\ VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\ Flag_VCPx_Tx_Buf_Full = 1;\0 m2 `2 r& v. [) W9 N7 H }\6 N6 a4 w3 [$ ~2 a/ D3 y3 T1 } }\0 p; O4 i8 B1 o% x4 i _9 S& A }" Z0 R3 W. b% z( X" P( X 附录:USB Serial Tools工具软件的特殊功能介绍: }8 u9 f% `4 Z7 _+ r' g 一般的串口调试工具,不会针对USB插拔做专门的检测和处理,比较容易崩溃,例如微软收购的超级终端等。 USB Serial Tools 是本人自2009-2012年,个人业余时间开发的一个带有USB插拔检测的串口调试软件。; C3 s& L9 e+ b+ u 和其它串口调试工具相比,是专用软件,值得一提的功能如下:: @0 K) b6 G& k5 R- h- H( s 1 支持高波特率。(支持该功能的串口调试工具屈指可数,大部分串口调试工具仅支持到115200) 2 支持USB插拔检测。(支持该功能的串口调试工具屈指可数,大部分串口调试工具都会因此崩溃) USB Serial Tools 下载地址: USB Serial Tools.zip 7 ], s2 @, z+ k/ _1 c4 [ # I7 V3 S3 n& N6 }) n : ? g" s- C H4 G- u9 h + N7 b; M4 ]9 t$ C0 h & m- z1 |5 Y8 z |
USB串å£å·¥å ·æ¯æ端ç¹å·æ¾ç¤º
STM32固件库分享,超全系列整理
最全USB HID开发资料,悉心整理一个月,亲自测试
小马哥STM32F103开源小四轴RoboFly全部资料大放送
USB Audio设计与实现
【MCU实战经验】+STM32F107的USB使用
圈圈发布USB图书第二版有感,以及分享一些我学习USB过程...
STM32F4-DISC 实现USB主机(U盘)和USB设备(虚拟串口)自动切换
STM32 USB-HID通信移植步骤STM32 USB HID键盘例程
基于STM32F103两轮平衡小车设计(开源)
STM32F107VCT6官方原理图和PCB
好东西啊!学习学习!