
本帖最后由 wjandsq 于 2015-9-6 15:08 编辑 5 }9 L F$ ?+ j: u; j 5 H. S/ k4 r$ m4 X 根据ST英文社区提供的资料,实现的USB转多路串口(USB-Multiple-CDC)例程,利用了STM32F103系列多端点的特性。而STM32F2/F4端点数量较少,不能实现USB-Multiple-CDC,但STM32F2/F4可以外加高速PHY芯片,实现USB2.0高速通讯。应该说F1和F2、F4使用场合不同,所以功能定位有所不同。: r/ S& I3 l0 P5 o( b' S B. K0 ~ 例程包下载地址:USB-Multiple-CDC + M1 E# T( J; y1 r- ] {8 C7 n, f z , y, v3 V% Z, E2 \ 注意事项: 1.工程包中含有驱动安装引导文件。 2.3CDC工程包,属于USB转多路串口(USB-Multiple-CDC),驱动的安装可参考“USB-Dual-CDC驱动安装说明书”。 3.采用带参数的宏实现3路串口的DMA发送,这个相对于ST官方的阻塞式发送,更具有实用性。" w5 F5 F* H6 m" a ) S7 m- s. n% B; m% m ; e/ H1 Z8 ?& }8 {' F! ], b0 O USB-Dual-CDC驱动安装说明书下载地址: USB-Dual-CDC驱动安装说明书 USB-Dual-CDC驱动安装说明书是之前USB-Dual-RS485产品的驱动安装说明书,可以参考这个安装步骤,3路的驱动,就是多安装1路而已。. y' F& z& H5 D, F5 D D: d & E( L: m6 {* ^/ @" J+ z' f 三路串口的DMA发送代码部分预览如下:. @ r/ {- p; k& C5 v( p/ k /* 带参数的宏功能(预编译展开): USB的IN端点 发送数据到PC主机 */- Y3 K" @! F* l* {/ G) R! ]* | #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;\7 a# e6 x+ k* e$ V if (CDCx_Tx_State == 1) {\/ ^" P3 E7 l3 H- s9 Y" e6 s USB_Tx_ptr = VCPx_Rx_ptr_out;\9 { j6 v( ]' {; Z* C if (VCPx_Rx_length == 0) {\, a5 M Y# A8 e. }+ } CDCx_Tx_State = 0;\; L" \! m7 }7 w/ H0 D SetEPTxCount(ENDPx,0);\: N: @0 b; Y* L SetEPTxValid(ENDPx);\" H+ N$ q/ S, E } else {\ if (VCPx_Rx_length > VIRTUAL_COM_PORT_DATA_SIZE) {\ USB_Tx_length = VIRTUAL_COM_PORT_DATA_SIZE;\; H0 T0 {6 L. E" r1 n5 z5 J2 w VCPx_Rx_ptr_out += VIRTUAL_COM_PORT_DATA_SIZE;\ VCPx_Rx_length -= VIRTUAL_COM_PORT_DATA_SIZE;\ } else {\ USB_Tx_length = VCPx_Rx_length;\ VCPx_Rx_ptr_out += VCPx_Rx_length;\& W& H8 q( @( _ VCPx_Rx_length = 0;\0 b+ G6 H3 N& k9 K }\; w9 g* Y8 s4 Z! _ USB_SIL_Write(ENDPx, &VCPx_Rx_Buffer[USB_Tx_ptr], USB_Tx_length);\ SetEPTxValid(ENDPx);\ }\/ q7 w+ e/ g+ V- o) i+ X }\ } /* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(阻塞方式) */ #define EPx_OUT_Callback(ENDPx, USARTx, GPIOx, GPIO_Pin_x) {\6 V0 U+ O9 r1 p: S. I uint32_t i;\9 a1 K3 A% Y% A7 c, B0 x1 { uint16_t USB_Rx_Cnt;\ USB_Rx_Cnt = USB_SIL_Read(ENDPx | 0x00, USB_Rx_Buffer); \ GPIOx->BSRR = GPIO_Pin_x;\ for (i = 0; i < USB_Rx_Cnt; i++) {\2 ^! D% X- Q/ `6 X0 k1 J; g USARTx->DR = *(USB_Rx_Buffer + i);\ while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);\ }\ SetEPRxValid(ENDPx);\8 ^# @+ U1 t- y( R' j while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);\ USART_ClearFlag(USARTx, USART_FLAG_TC);\. Y- s2 N' y5 E& A! z GPIOx->BRR = GPIO_Pin_x;\ } /* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(DMA方式) */$ [: R+ x' [) N! ~7 i& y #define EPx_OUT_Callback_DMA(Flag_VCPx_Tx_Buf_Use, ENDPx, VCPx_Tx_Buffer1,VCPx_Tx_Buffer2,\; K: m: y e8 M* V2 k5 U GPIOx, GPIO_Pin_x, DMA1_Channelx, VCPx_Tx_Buffer_Cnt, Flag_VCPx_Tx_Buf_Full) {\ uint16_t USB_Rx_Cnt;\ if(Flag_VCPx_Tx_Buf_Use == 0){\! H. q- L- W( ?0 X6 i Z USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\ PMAToUserBufferCopy(&VCPx_Tx_Buffer1[0], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\4 j% u8 f( | l2 ~# R. | SetEPRxValid(ENDPx);\ GPIOx->BSRR = GPIO_Pin_x;\ DMA1_Channelx->CNDTR = USB_Rx_Cnt;\5 D/ [' |0 U1 ^: `$ Z( i6 |3 _ DMA_Cmd(DMA1_Channelx, ENABLE);\: C4 s; x0 [% {% a3 @, k: e+ [ Flag_VCPx_Tx_Buf_Use = 1;\# k+ E) b! j1 H4 |9 r: o% q! L6 { VCPx_Tx_Buffer_Cnt = 0;\. Z" h' M$ O6 B. q' R } else {\) _8 m, \$ U2 ^: h0 |/ ?. ^. p! v1 B: h USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\ 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);\/ y+ b1 l" P1 O } else {\ PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\0 K3 L- ~3 m9 u- M4 S; @# w VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\: t9 S: w4 f' S7 B' y Flag_VCPx_Tx_Buf_Full = 1;\: m" q& ]2 V0 B2 _ }\ }\; Z8 d7 G5 S" o( N S/ Q1 v. s }' \3 M5 b9 J% V8 a$ Y3 w; Y! y0 K J/ U 附录:USB Serial Tools工具软件的特殊功能介绍4 x2 W8 _. \( v' o1 j' A 一般的串口调试工具,不会针对USB插拔做专门的检测和处理,比较容易崩溃,例如微软收购的超级终端等。 USB Serial Tools 是本人自2009-2012年,个人业余时间开发的一个带有USB插拔检测的串口调试软件。 和其它串口调试工具相比,是专用软件,值得一提的功能如下:3 X- n9 L; N# W7 K, ^ 1 支持高波特率。(支持该功能的串口调试工具屈指可数,大部分串口调试工具仅支持到115200) 2 支持USB插拔检测。(支持该功能的串口调试工具屈指可数,大部分串口调试工具都会因此崩溃) USB Serial Tools 下载地址: USB Serial Tools.zip / A! m" H% j( s8 r . g. o6 Q$ ~. ?) y5 \% U4 H / b$ ? Q3 J: l+ }1 D/ v t' ^ 0 I4 M+ z r! r) i 4 {* `3 b' }) W6 T) E1 p : W a# ], W7 P |
USB串å£å·¥å ·æ¯æ端ç¹å·æ¾ç¤º
小马哥STM32F103开源小四轴RoboFly全部资料大放送
STM32固件库分享,超全系列整理
STM32 USB HID键盘例程
STM32F10xxx 正交编码器接口应用笔记 及源代码
分享一个STM32F103的硬件IIC代码库,完美解决IIC问题!
OpenBLT移植到STM32F103战舰开发板上适用于所有STM32F103系列的Bootloader
MultiButton移植到STM32F103战舰开发板
UDS诊断服务
使用Nano板验证驱动SPI串口屏的颜色显示
使用STM32F103制作的无线下载器
好东西啊!学习学习!