本帖最后由 wjandsq 于 2015-9-6 15:08 编辑 3 I1 F" q0 Y5 R, I: e 根据ST英文社区提供的资料,实现的USB转多路串口(USB-Multiple-CDC)例程,利用了STM32F103系列多端点的特性。而STM32F2/F4端点数量较少,不能实现USB-Multiple-CDC,但STM32F2/F4可以外加高速PHY芯片,实现USB2.0高速通讯。应该说F1和F2、F4使用场合不同,所以功能定位有所不同。 ' i* R1 U/ d& e4 j 3 M6 {/ s. ?8 o 例程包下载地址:USB-Multiple-CDC 5 Q9 I8 l! Z1 _) a$ r6 F/ l 9 B f% [- y! x' M 注意事项: ! H) d. ~( n, ~8 R& o 1.工程包中含有驱动安装引导文件。 2.3CDC工程包,属于USB转多路串口(USB-Multiple-CDC),驱动的安装可参考“USB-Dual-CDC驱动安装说明书”。5 x; c; _# d( Q; @ 3.采用带参数的宏实现3路串口的DMA发送,这个相对于ST官方的阻塞式发送,更具有实用性。 8 M( ]2 w7 ~, P5 L" i6 a USB-Dual-CDC驱动安装说明书下载地址: USB-Dual-CDC驱动安装说明书 USB-Dual-CDC驱动安装说明书是之前USB-Dual-RS485产品的驱动安装说明书,可以参考这个安装步骤,3路的驱动,就是多安装1路而已。: T* W3 l7 F( l& L ; d* ~8 z6 }( m2 J) c/ S4 E7 { j * z3 _" ?/ K, L$ O6 ] 三路串口的DMA发送代码部分预览如下:1 b) Q5 Q5 ~1 F+ M l8 u1 T' l/ ] /* 带参数的宏功能(预编译展开): USB的IN端点 发送数据到PC主机 */- `5 P% ]+ c" a! O% v #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) {\ USB_Tx_ptr = VCPx_Rx_ptr_out;\2 ]2 K8 p/ M( G8 Q" I0 v if (VCPx_Rx_length == 0) {\ CDCx_Tx_State = 0;\ SetEPTxCount(ENDPx,0);\, e$ Y1 \8 V" U* j1 Y1 ? SetEPTxValid(ENDPx);\ } else {\ if (VCPx_Rx_length > VIRTUAL_COM_PORT_DATA_SIZE) {\ g) L! _0 I& O+ ]+ j8 u USB_Tx_length = VIRTUAL_COM_PORT_DATA_SIZE;\* s' S8 r9 ~, c- w2 x VCPx_Rx_ptr_out += VIRTUAL_COM_PORT_DATA_SIZE;\ VCPx_Rx_length -= VIRTUAL_COM_PORT_DATA_SIZE;\! |# o( N/ ~6 y% Q2 f# Z- l } else {\) x% ~# S# Q# z8 r0 \ USB_Tx_length = VCPx_Rx_length;\ VCPx_Rx_ptr_out += VCPx_Rx_length;\$ ^2 i, X7 q) b$ G4 Q1 t; {1 _ VCPx_Rx_length = 0;\ }\ USB_SIL_Write(ENDPx, &VCPx_Rx_Buffer[USB_Tx_ptr], USB_Tx_length);\8 l" |+ W3 B, b# X5 }$ A SetEPTxValid(ENDPx);\, N* N2 l4 A$ l1 B I2 H }\ }\ } ( y4 ?1 j$ i3 j2 }2 b! b / L# [5 K& [4 D! x, ]5 j8 a /* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(阻塞方式) */' j" g; Z6 U4 x* A! o, C #define EPx_OUT_Callback(ENDPx, USARTx, GPIOx, GPIO_Pin_x) {\ uint32_t i;\+ @9 N G5 [/ u7 p* ] uint16_t USB_Rx_Cnt;\ USB_Rx_Cnt = USB_SIL_Read(ENDPx | 0x00, USB_Rx_Buffer); \2 k6 r/ q3 Y# i3 _) `5 V GPIOx->BSRR = GPIO_Pin_x;\ for (i = 0; i < USB_Rx_Cnt; i++) {\ USARTx->DR = *(USB_Rx_Buffer + i);\3 x! ^" T; Q3 n, [* `& {) k while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);\7 i. B( B) {4 n0 O, h( i, d: u }\9 |& h3 D7 V( Y2 _! | SetEPRxValid(ENDPx);\5 s; }$ P4 l1 M2 e7 a# N while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);\/ X1 x1 L _+ q2 q USART_ClearFlag(USARTx, USART_FLAG_TC);\) ~* l, G! z1 B' }1 X& o6 l! T GPIOx->BRR = GPIO_Pin_x;\% k1 P0 z) R G' c9 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) {\ uint16_t USB_Rx_Cnt;\5 q7 Z! ], W1 c$ d if(Flag_VCPx_Tx_Buf_Use == 0){\ USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\ PMAToUserBufferCopy(&VCPx_Tx_Buffer1[0], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\5 o) D# x0 u- @( g& c! P SetEPRxValid(ENDPx);\ GPIOx->BSRR = GPIO_Pin_x;\ DMA1_Channelx->CNDTR = USB_Rx_Cnt;\- z% N! \8 m4 @; T. s2 J0 B DMA_Cmd(DMA1_Channelx, ENABLE);\# R7 ?5 z* G- C6 @! J" B/ M Flag_VCPx_Tx_Buf_Use = 1;\ VCPx_Tx_Buffer_Cnt = 0;\' L4 |0 D1 b# P0 Q } else {\ USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\7 L6 P$ o' M# G$ P* z" e& E( w if(VCPx_Tx_Buffer_Cnt < (1024-128)){\ PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\7 x7 d+ ~: t) B VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\ SetEPRxValid(ENDPx);\. [3 ?' ^7 T, s+ g- |! [% I+ `1 P } else {\/ h X W7 i) Y0 ]* ~. C PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\+ Z- p1 E9 q3 J$ _ VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\ Flag_VCPx_Tx_Buf_Full = 1;\7 \: k( L: R& P: I5 k) B }\8 g6 D' M# C/ J! ^) r7 A }\ }7 W$ r3 a) u) ]" y R: F& q ( O8 |" Y3 L9 x* b" }* K 附录:USB Serial Tools工具软件的特殊功能介绍' X2 P. K! c* C! \) ]2 v3 f" m 一般的串口调试工具,不会针对USB插拔做专门的检测和处理,比较容易崩溃,例如微软收购的超级终端等。& {9 _5 U# E+ f$ \1 @. J# d* z USB Serial Tools 是本人自2009-2012年,个人业余时间开发的一个带有USB插拔检测的串口调试软件。 和其它串口调试工具相比,是专用软件,值得一提的功能如下: 1 支持高波特率。(支持该功能的串口调试工具屈指可数,大部分串口调试工具仅支持到115200)3 X% m% \% E! K5 L! S 2 支持USB插拔检测。(支持该功能的串口调试工具屈指可数,大部分串口调试工具都会因此崩溃) USB Serial Tools 下载地址: USB Serial Tools.zip W6 W: _ l( m" h( J% B 3 ?2 n- A/ f4 w; G# I0 b/ ` : T: c# \2 ^- ]; \0 V/ w - E. L5 G! _7 j$ Y" [$ q( m, l+ J : @- g, q8 f4 E , d% v3 P/ S4 C7 W- j 1 Y/ H- J. u6 Y- f % Z' `( h7 f, d |
USB串å£å·¥å ·æ¯æ端ç¹å·æ¾ç¤º
【MCU实战经验】+STM32F103的uCOSII详细移植
游名科技:STM32F103+TMC2160:86步进电机和驱动一体原理图/PCB...
小马哥STM32F103开源小四轴RoboFly全部资料大放送
在高容量 STM32F103xx 微控制器中实现 ADPCM 算法
【经验分享】在进行 USB CDC 类开发时,无法发送 64整数倍的数据
STM32F103标准库开发---SPI实验---读写 W25Q128 外部 Flash
【源码】STLINK-V3MINI 高速USB仿真器,成功改刷【高速CMSIS-DAP】
在线直播|无需编写任何代码即可在STM32上实现USB-C Power Delivery
RT-Thread在STM32F103RC上移植
STM32 USB CDC 虚拟多串口
好东西啊!学习学习!