本帖最后由 wjandsq 于 2015-9-6 15:08 编辑 2 S& P! k8 z5 L; g5 i; M 根据ST英文社区提供的资料,实现的USB转多路串口(USB-Multiple-CDC)例程,利用了STM32F103系列多端点的特性。而STM32F2/F4端点数量较少,不能实现USB-Multiple-CDC,但STM32F2/F4可以外加高速PHY芯片,实现USB2.0高速通讯。应该说F1和F2、F4使用场合不同,所以功能定位有所不同。 - W6 \( Y" c5 A& g. f- {) _' R 例程包下载地址:USB-Multiple-CDC : Q, q5 l" E# h7 R/ ?1 C% X$ @ + `! o; y) i' q1 ]* N 注意事项: 1.工程包中含有驱动安装引导文件。4 R: R1 S8 p! Q% Y4 a( i/ W 2.3CDC工程包,属于USB转多路串口(USB-Multiple-CDC),驱动的安装可参考“USB-Dual-CDC驱动安装说明书”。. I* ?1 u+ B* l 3.采用带参数的宏实现3路串口的DMA发送,这个相对于ST官方的阻塞式发送,更具有实用性。" {$ |; U- F9 e- e- _% U2 P& X USB-Dual-CDC驱动安装说明书下载地址: USB-Dual-CDC驱动安装说明书) ?& }9 F# g) W" D& k1 x) t USB-Dual-CDC驱动安装说明书是之前USB-Dual-RS485产品的驱动安装说明书,可以参考这个安装步骤,3路的驱动,就是多安装1路而已。* t! D, s$ `, c8 ?% f8 f 8 f4 M/ K, {7 \0 @5 L' p8 T : k$ u; K6 [3 Z. y 三路串口的DMA发送代码部分预览如下:% ^: c' h0 b& n; p. p" x /* 带参数的宏功能(预编译展开): USB的IN端点 发送数据到PC主机 */ #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;\/ H6 u, s* A" Z( f7 R if (CDCx_Tx_State == 1) {\ USB_Tx_ptr = VCPx_Rx_ptr_out;\' j! H7 A" ]) ~ E if (VCPx_Rx_length == 0) {\" G2 m' P/ m4 ?3 i8 u# ? CDCx_Tx_State = 0;\8 j$ o6 N! `2 l; B4 Q: e7 }8 E SetEPTxCount(ENDPx,0);\! h' @4 o# p5 V7 X) y SetEPTxValid(ENDPx);\$ {* G# c% k3 C( ?5 n( y0 M- X& d } else {\ if (VCPx_Rx_length > VIRTUAL_COM_PORT_DATA_SIZE) {\ USB_Tx_length = VIRTUAL_COM_PORT_DATA_SIZE;\ VCPx_Rx_ptr_out += VIRTUAL_COM_PORT_DATA_SIZE;\3 H- y( ~. a6 c7 x VCPx_Rx_length -= VIRTUAL_COM_PORT_DATA_SIZE;\; l1 p9 @, g ^3 R; J8 X } else {\ USB_Tx_length = VCPx_Rx_length;\ VCPx_Rx_ptr_out += VCPx_Rx_length;\ VCPx_Rx_length = 0;\ }\& L6 ^* I# {& R2 J' T USB_SIL_Write(ENDPx, &VCPx_Rx_Buffer[USB_Tx_ptr], USB_Tx_length);\ SetEPTxValid(ENDPx);\. h. F% v! b: @' R }\ }\ }6 a8 Q' V4 C: d5 N, P7 o- E 3 W% @) s* g8 x1 m# C/ ~! @* L /* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(阻塞方式) */- C6 D' E! E. T( k* ] #define EPx_OUT_Callback(ENDPx, USARTx, GPIOx, GPIO_Pin_x) {\" O( F- |. \9 h) X uint32_t i;\+ V4 B& k% W6 L2 i uint16_t USB_Rx_Cnt;\0 h( q( Z1 ~, {* u1 M USB_Rx_Cnt = USB_SIL_Read(ENDPx | 0x00, USB_Rx_Buffer); \ GPIOx->BSRR = GPIO_Pin_x;\! y4 \' e6 C! t5 b" \7 ] for (i = 0; i < USB_Rx_Cnt; i++) {\# ?! U, T4 K' c- z0 v& i& _ USARTx->DR = *(USB_Rx_Buffer + i);\* i' f" `1 q l$ ?' t* W6 Q while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);\ }\; n5 T" ]" I" ^+ S, w* N. u( E SetEPRxValid(ENDPx);\, u& X+ W0 n% M( r) F4 L4 ` while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);\- {7 \' U( E5 z& C/ M! v+ {( ] USART_ClearFlag(USARTx, USART_FLAG_TC);\ GPIOx->BRR = GPIO_Pin_x;\ } : R- m% j5 ?6 s$ J /* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(DMA方式) */: p; O7 b$ L) w$ |( L& n" H #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) {\8 M% {8 S: d: _$ j9 A9 ~0 ~$ ?) g uint16_t USB_Rx_Cnt;\: F$ F# k: A; C5 W2 x z% s. ?; [( E if(Flag_VCPx_Tx_Buf_Use == 0){\* }4 G& ^# R0 c- P% d& t USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\$ v1 }" E9 S2 Q F" N4 S+ H6 V! y PMAToUserBufferCopy(&VCPx_Tx_Buffer1[0], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\ SetEPRxValid(ENDPx);\' B4 S7 f, Q5 k0 S( T2 H- W GPIOx->BSRR = GPIO_Pin_x;\- b" A' ]8 @, t DMA1_Channelx->CNDTR = USB_Rx_Cnt;\ DMA_Cmd(DMA1_Channelx, ENABLE);\3 |+ B5 D: e% d' {9 N: I$ H; V& H' b Flag_VCPx_Tx_Buf_Use = 1;\ VCPx_Tx_Buffer_Cnt = 0;\3 I+ b! e* S- P& ^ } else {\ USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\7 C. x) }+ M* _/ h/ A0 c- i if(VCPx_Tx_Buffer_Cnt < (1024-128)){\ PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\. E7 \+ [7 y: N! } VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\1 A6 u8 G& \4 Q! N( V: p6 D SetEPRxValid(ENDPx);\ } else {\ PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\ VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\7 F" h: I. A& v( w1 a Flag_VCPx_Tx_Buf_Full = 1;\2 v. ^, `8 A+ N$ F, ^ }\ }\ } 9 v0 a8 z7 q5 _ F& v 附录:USB Serial Tools工具软件的特殊功能介绍+ G9 r2 v; g" H2 d1 V3 V 一般的串口调试工具,不会针对USB插拔做专门的检测和处理,比较容易崩溃,例如微软收购的超级终端等。 USB Serial Tools 是本人自2009-2012年,个人业余时间开发的一个带有USB插拔检测的串口调试软件。 和其它串口调试工具相比,是专用软件,值得一提的功能如下: 1 支持高波特率。(支持该功能的串口调试工具屈指可数,大部分串口调试工具仅支持到115200) 2 支持USB插拔检测。(支持该功能的串口调试工具屈指可数,大部分串口调试工具都会因此崩溃) USB Serial Tools 下载地址: USB Serial Tools.zip + [7 Q* p m: G* N z# H& e) a8 h8 d; B 0 ^8 Z% d* ?2 ^! E2 s+ I / v6 l6 v! q. j* S 5 w7 l7 L; F9 m4 R8 t 0 m! G& }5 W! L$ p 1 X' s& H! R) K' n) s! c ?# u 0 o* X3 k3 h3 W Y$ k& o 9 _# Y+ U7 t. D6 b" d |
USB串å£å·¥å ·æ¯æ端ç¹å·æ¾ç¤º
在高容量 STM32F103xx 微控制器中实现 ADPCM 算法
小马哥STM32F103开源小四轴RoboFly全部资料大放送
【经验分享】在进行 USB CDC 类开发时,无法发送 64整数倍的数据
游名科技: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 虚拟多串口
好东西啊!学习学习!