本帖最后由 wjandsq 于 2015-9-6 15:08 编辑 , }/ V( o/ v4 p2 r" A* T 根据ST英文社区提供的资料,实现的USB转多路串口(USB-Multiple-CDC)例程,利用了STM32F103系列多端点的特性。而STM32F2/F4端点数量较少,不能实现USB-Multiple-CDC,但STM32F2/F4可以外加高速PHY芯片,实现USB2.0高速通讯。应该说F1和F2、F4使用场合不同,所以功能定位有所不同。 例程包下载地址:USB-Multiple-CDC # {) E' y* ]8 ] S! N / O1 A6 z8 J6 p- W/ ]7 c' H + G7 g1 g, A8 E0 E o: [7 O: W- ~3 _7 C/ T; u 注意事项: 1.工程包中含有驱动安装引导文件。 2.3CDC工程包,属于USB转多路串口(USB-Multiple-CDC),驱动的安装可参考“USB-Dual-CDC驱动安装说明书”。 3.采用带参数的宏实现3路串口的DMA发送,这个相对于ST官方的阻塞式发送,更具有实用性。 USB-Dual-CDC驱动安装说明书下载地址: USB-Dual-CDC驱动安装说明书 USB-Dual-CDC驱动安装说明书是之前USB-Dual-RS485产品的驱动安装说明书,可以参考这个安装步骤,3路的驱动,就是多安装1路而已。 8 J. Q# c" c% \4 P! ]* G3 o1 _: E 三路串口的DMA发送代码部分预览如下:5 h7 w" U w( [ /* 带参数的宏功能(预编译展开): 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;\ if (CDCx_Tx_State == 1) {\$ i0 B$ k% y4 ~# i USB_Tx_ptr = VCPx_Rx_ptr_out;\ if (VCPx_Rx_length == 0) {\: E4 C+ ^7 Z3 h# n3 ? CDCx_Tx_State = 0;\ SetEPTxCount(ENDPx,0);\ SetEPTxValid(ENDPx);\ } else {\5 y/ u* u; B& `" e \7 v if (VCPx_Rx_length > VIRTUAL_COM_PORT_DATA_SIZE) {\ USB_Tx_length = VIRTUAL_COM_PORT_DATA_SIZE;\# J) F. j0 @; O, _2 g! T/ Y q! _ VCPx_Rx_ptr_out += VIRTUAL_COM_PORT_DATA_SIZE;\ VCPx_Rx_length -= VIRTUAL_COM_PORT_DATA_SIZE;\ } else {\ USB_Tx_length = VCPx_Rx_length;\$ A7 N+ |- N" p9 `3 @ R VCPx_Rx_ptr_out += VCPx_Rx_length;\" X9 K, t1 I6 h0 ]) k r+ b$ S VCPx_Rx_length = 0;\ o# l: e; v" N1 M# l }\ USB_SIL_Write(ENDPx, &VCPx_Rx_Buffer[USB_Tx_ptr], USB_Tx_length);\ SetEPTxValid(ENDPx);\ }\ }\ }8 |4 \ A; s3 H: w+ } $ R2 I% U) i- X6 i /* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(阻塞方式) */ #define EPx_OUT_Callback(ENDPx, USARTx, GPIOx, GPIO_Pin_x) {\9 }) a: N* W: k uint32_t i;\ uint16_t USB_Rx_Cnt;\: R* f$ v! F2 u9 y0 S USB_Rx_Cnt = USB_SIL_Read(ENDPx | 0x00, USB_Rx_Buffer); \* b4 P5 Q# u! U: f2 R' r GPIOx->BSRR = GPIO_Pin_x;\ for (i = 0; i < USB_Rx_Cnt; i++) {\% \+ _! p, Q! I- I. Z* y USARTx->DR = *(USB_Rx_Buffer + i);\* N7 `. x7 \* G$ \9 O while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);\8 M/ O4 i+ l U0 z }\( D. S+ N5 Q0 x# i2 j& o- l SetEPRxValid(ENDPx);\ while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);\5 _0 N: A5 s, K USART_ClearFlag(USARTx, USART_FLAG_TC);\ GPIOx->BRR = GPIO_Pin_x;\ }0 p# F; L, \ t& I( ? " _* K; F- ]9 p! ^* E& A# \ /* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(DMA方式) */ #define EPx_OUT_Callback_DMA(Flag_VCPx_Tx_Buf_Use, ENDPx, VCPx_Tx_Buffer1,VCPx_Tx_Buffer2,\) s4 [5 Z" a, D. F" F& @6 u- E* x GPIOx, GPIO_Pin_x, DMA1_Channelx, VCPx_Tx_Buffer_Cnt, Flag_VCPx_Tx_Buf_Full) {\, O; S0 z* O/ y uint16_t USB_Rx_Cnt;\0 I( B" O7 H/ W1 D* J if(Flag_VCPx_Tx_Buf_Use == 0){\ USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\* }! o- \# y. m- v4 e$ m, \ PMAToUserBufferCopy(&VCPx_Tx_Buffer1[0], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\9 X2 C& {8 z9 k- [9 c8 c! I) F SetEPRxValid(ENDPx);\ GPIOx->BSRR = GPIO_Pin_x;\ DMA1_Channelx->CNDTR = USB_Rx_Cnt;\: ]9 [, a% r! _" C; t5 c- C; c DMA_Cmd(DMA1_Channelx, ENABLE);\ Flag_VCPx_Tx_Buf_Use = 1;\ VCPx_Tx_Buffer_Cnt = 0;\ } else {\ USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\ if(VCPx_Tx_Buffer_Cnt < (1024-128)){\3 j7 N' M0 W. s% n PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\ VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\1 l! S9 [. ~9 W1 X, Z7 y SetEPRxValid(ENDPx);\% M# c8 o* P" c+ z9 D5 H% D } 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;\4 V( V5 s( b# t9 o0 a+ H }\ }\ }( v) S" e, H# n( N% ~2 R$ ]4 I 附录:USB Serial Tools工具软件的特殊功能介绍 一般的串口调试工具,不会针对USB插拔做专门的检测和处理,比较容易崩溃,例如微软收购的超级终端等。+ I# q- R0 g o3 r USB Serial Tools 是本人自2009-2012年,个人业余时间开发的一个带有USB插拔检测的串口调试软件。 和其它串口调试工具相比,是专用软件,值得一提的功能如下: 1 支持高波特率。(支持该功能的串口调试工具屈指可数,大部分串口调试工具仅支持到115200)% l& C" N1 k$ a8 @9 V! } 2 支持USB插拔检测。(支持该功能的串口调试工具屈指可数,大部分串口调试工具都会因此崩溃) USB Serial Tools 下载地址: USB Serial Tools.zip 6 f+ p- E- u) l5 G 7 T+ r- d. m5 G0 z, F& i& A , p# j$ S( v, t6 T) ~5 \$ w 1 k; b& V+ X& z. v2 R9 c' c+ J - Y* _1 L* Z; O) P; U @9 n- ?/ I; \$ d% z7 l$ k! d7 n & ?3 M* ]* W* a# k0 z' C- w 8 A. I, _/ ?8 H4 e0 Z: H 1 u! Q8 n1 z7 Q! t1 w4 h |
USB串å£å·¥å ·æ¯æ端ç¹å·æ¾ç¤º
小马哥STM32F103开源小四轴RoboFly全部资料大放送
STM32F103移植LittlevGUI代码
【MCU实战经验】+自制MP3使用STM32F103ZET6和ch375读取u盘,vs1003解码,音质超棒
最全USB HID开发资料,悉心整理一个月,亲自测试
串口通信波特率异常的解决办法
刘氓兔的杂谈【001】-片上USB 高速PHY
【MCU实战经验】+STM32F103的uCOSII详细移植
游名科技:STM32F103+TMC2160:86步进电机和驱动一体原理图/PCB...
在高容量 STM32F103xx 微控制器中实现 ADPCM 算法
【经验分享】在进行 USB CDC 类开发时,无法发送 64整数倍的数据
好东西啊!学习学习!