本帖最后由 wjandsq 于 2015-9-6 15:08 编辑 2 x) L" Q, [% J% h! p 8 a8 x7 J/ {" C" U- B+ J9 t 根据ST英文社区提供的资料,实现的USB转多路串口(USB-Multiple-CDC)例程,利用了STM32F103系列多端点的特性。而STM32F2/F4端点数量较少,不能实现USB-Multiple-CDC,但STM32F2/F4可以外加高速PHY芯片,实现USB2.0高速通讯。应该说F1和F2、F4使用场合不同,所以功能定位有所不同。; b, a8 }' i3 ^ 例程包下载地址:USB-Multiple-CDC / F/ m, [! D; V2 M% } ) d1 }1 a( F' e5 m: A, L , Y' m% M# m. H# W8 M 注意事项: 1.工程包中含有驱动安装引导文件。 2.3CDC工程包,属于USB转多路串口(USB-Multiple-CDC),驱动的安装可参考“USB-Dual-CDC驱动安装说明书”。! e+ Q( y* n+ ]9 v d& B! P 3.采用带参数的宏实现3路串口的DMA发送,这个相对于ST官方的阻塞式发送,更具有实用性。. Y' P4 |# [( L 9 H0 R% n4 z( Q% G" e USB-Dual-CDC驱动安装说明书下载地址: USB-Dual-CDC驱动安装说明书# j# h7 n& h0 i) Y USB-Dual-CDC驱动安装说明书是之前USB-Dual-RS485产品的驱动安装说明书,可以参考这个安装步骤,3路的驱动,就是多安装1路而已。 三路串口的DMA发送代码部分预览如下: /* 带参数的宏功能(预编译展开): USB的IN端点 发送数据到PC主机 */+ U$ `" {4 l6 Y4 B( G #define EPx_IN_Callback(ENDPx, CDCx_Tx_State, VCPx_Rx_Buffer, VCPx_Rx_ptr_out, VCPx_Rx_length) {\ uint16_t USB_Tx_ptr;\+ U: ?) ]! S$ }' c, O; O( A+ S uint16_t USB_Tx_length;\3 Y% p7 v2 |) E" M4 h, {) j if (CDCx_Tx_State == 1) {\# K6 b2 z+ p" R# L: v; }. Y USB_Tx_ptr = VCPx_Rx_ptr_out;\ if (VCPx_Rx_length == 0) {\ CDCx_Tx_State = 0;\+ ]! Y6 L' ~6 c5 e9 e4 G, g SetEPTxCount(ENDPx,0);\" [) m) }5 Y5 _ SetEPTxValid(ENDPx);\* }- Y" ` Z. ~4 u$ g" j } else {\ if (VCPx_Rx_length > VIRTUAL_COM_PORT_DATA_SIZE) {\7 F6 i4 v! C" E' ?, s& Q. F0 P USB_Tx_length = VIRTUAL_COM_PORT_DATA_SIZE;\ VCPx_Rx_ptr_out += VIRTUAL_COM_PORT_DATA_SIZE;\1 T* @6 o$ d: b0 W VCPx_Rx_length -= VIRTUAL_COM_PORT_DATA_SIZE;\ } else {\ USB_Tx_length = VCPx_Rx_length;\8 I# K. H" [* L% } z9 y! Z VCPx_Rx_ptr_out += VCPx_Rx_length;\ VCPx_Rx_length = 0;\ }\ USB_SIL_Write(ENDPx, &VCPx_Rx_Buffer[USB_Tx_ptr], USB_Tx_length);\6 [# N( j2 n( [! M0 n6 W0 L SetEPTxValid(ENDPx);\ }\ }\) f2 g3 A$ W2 t; T! ?/ O2 a2 C( h } /* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(阻塞方式) */- ^4 C( h1 K+ b #define EPx_OUT_Callback(ENDPx, USARTx, GPIOx, GPIO_Pin_x) {\ uint32_t i;\ uint16_t USB_Rx_Cnt;\ USB_Rx_Cnt = USB_SIL_Read(ENDPx | 0x00, USB_Rx_Buffer); \ GPIOx->BSRR = GPIO_Pin_x;\$ s' S) E, S n for (i = 0; i < USB_Rx_Cnt; i++) {\: c6 v# c* Z$ F8 W+ a3 K USARTx->DR = *(USB_Rx_Buffer + i);\ while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);\+ f$ K5 B$ f* P8 C( n2 j }\ SetEPRxValid(ENDPx);\ while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);\. ~$ N. g7 u! w* z5 m, ^( T6 C USART_ClearFlag(USARTx, USART_FLAG_TC);\ GPIOx->BRR = GPIO_Pin_x;\ }& j w4 k+ w' H" ~) e1 G /* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(DMA方式) */ #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) {\+ _( l6 j( Z# @" d uint16_t USB_Rx_Cnt;\ if(Flag_VCPx_Tx_Buf_Use == 0){\/ ]1 y# z! b& M5 I, {6 d USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\ PMAToUserBufferCopy(&VCPx_Tx_Buffer1[0], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\ SetEPRxValid(ENDPx);\ GPIOx->BSRR = GPIO_Pin_x;\ DMA1_Channelx->CNDTR = USB_Rx_Cnt;\6 _' n0 y( A* [3 u* _3 g9 _0 @ DMA_Cmd(DMA1_Channelx, ENABLE);\. {# c$ Y! l8 D/ D/ a5 Z | Flag_VCPx_Tx_Buf_Use = 1;\ r% u& W8 V4 B7 T1 H1 r: L; M* F, { VCPx_Tx_Buffer_Cnt = 0;\ } else {\' h6 h, |( d1 W& Y1 k USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\! I ]& W& c" N' ]2 q$ Z if(VCPx_Tx_Buffer_Cnt < (1024-128)){\ 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;\' J( j2 n/ h1 r Flag_VCPx_Tx_Buf_Full = 1;\ }\ }\ s& J& ?6 ?9 c! z" `0 Y }$ X4 X+ R: I4 Q: ]( V0 g 附录:USB Serial Tools工具软件的特殊功能介绍 一般的串口调试工具,不会针对USB插拔做专门的检测和处理,比较容易崩溃,例如微软收购的超级终端等。 USB Serial Tools 是本人自2009-2012年,个人业余时间开发的一个带有USB插拔检测的串口调试软件。 和其它串口调试工具相比,是专用软件,值得一提的功能如下: 1 支持高波特率。(支持该功能的串口调试工具屈指可数,大部分串口调试工具仅支持到115200)$ R. w, r' i( V9 Q1 m) o; B# H 2 支持USB插拔检测。(支持该功能的串口调试工具屈指可数,大部分串口调试工具都会因此崩溃)4 f- `6 }4 E4 { USB Serial Tools 下载地址: USB Serial Tools.zip ( z/ A( \! E% e5 t ! ]- r) u0 X9 u; f* y 1 V4 F1 {# u( u( ^. {3 E5 Z / F" V# P& W9 ]- B 1 ]. o c0 v& ]0 L ; G1 U, m5 Q" y0 [% N$ h% Q' n ( g# V; d8 w2 O+ I |
USB串å£å·¥å ·æ¯æ端ç¹å·æ¾ç¤º
游名科技:STM32F103+TMC2160:86步进电机和驱动一体原理图/PCB...
STM32F103标准库开发---SPI实验---读写 W25Q128 外部 Flash
【源码】STLINK-V3MINI 高速USB仿真器,成功改刷【高速CMSIS-DAP】
在线直播|无需编写任何代码即可在STM32上实现USB-C Power Delivery
RT-Thread在STM32F103RC上移植
【MCU实战经验】+STM32F103的uCOSII详细移植
STM32 USB CDC 虚拟多串口
STM32固件库分享,超全系列整理
最全USB HID开发资料,悉心整理一个月,亲自测试
【原创】STM32F103的SPI2的配置函数,DMA发送和接收!
好东西啊!学习学习!