|
本帖最后由 wjandsq 于 2015-9-6 15:08 编辑 $ O" _0 s; x7 v2 } 根据ST英文社区提供的资料,实现的USB转多路串口(USB-Multiple-CDC)例程,利用了STM32F103系列多端点的特性。而STM32F2/F4端点数量较少,不能实现USB-Multiple-CDC,但STM32F2/F4可以外加高速PHY芯片,实现USB2.0高速通讯。应该说F1和F2、F4使用场合不同,所以功能定位有所不同。" ~/ _: O6 f8 D8 F }+ p 4 i' t; A, O* O& a 例程包下载地址:USB-Multiple-CDC & \! J' H0 `! L6 D* s6 w2 ~ S& q' S6 j: ^ 注意事项: 7 n: M8 A- t5 f% U 1.工程包中含有驱动安装引导文件。 2.3CDC工程包,属于USB转多路串口(USB-Multiple-CDC),驱动的安装可参考“USB-Dual-CDC驱动安装说明书”。 3.采用带参数的宏实现3路串口的DMA发送,这个相对于ST官方的阻塞式发送,更具有实用性。& B+ |, G7 u! K USB-Dual-CDC驱动安装说明书下载地址: USB-Dual-CDC驱动安装说明书 USB-Dual-CDC驱动安装说明书是之前USB-Dual-RS485产品的驱动安装说明书,可以参考这个安装步骤,3路的驱动,就是多安装1路而已。 9 w& z" C& O% x/ n 3 z m- ^5 {- S( I4 v, M* E 三路串口的DMA发送代码部分预览如下: /* 带参数的宏功能(预编译展开): USB的IN端点 发送数据到PC主机 */0 J+ v1 Y; e7 A7 T4 ?, ? #define EPx_IN_Callback(ENDPx, CDCx_Tx_State, VCPx_Rx_Buffer, VCPx_Rx_ptr_out, VCPx_Rx_length) {\& z6 c7 \ Q4 g uint16_t USB_Tx_ptr;\ uint16_t USB_Tx_length;\! C# v0 a; v' W( ?9 E: v2 I% ~ if (CDCx_Tx_State == 1) {\1 t+ D6 R, o4 e1 a8 t USB_Tx_ptr = VCPx_Rx_ptr_out;\, \0 X0 k4 f6 }7 r if (VCPx_Rx_length == 0) {\ CDCx_Tx_State = 0;\- M7 {- c: l0 \ SetEPTxCount(ENDPx,0);\ SetEPTxValid(ENDPx);\ } else {\$ {7 h% B9 A$ a9 w8 c if (VCPx_Rx_length > VIRTUAL_COM_PORT_DATA_SIZE) {\+ b. o* z# ?7 L/ \: l2 w; q USB_Tx_length = VIRTUAL_COM_PORT_DATA_SIZE;\ VCPx_Rx_ptr_out += VIRTUAL_COM_PORT_DATA_SIZE;\: O% ^1 D* x5 i# d# ^+ D, |; a VCPx_Rx_length -= VIRTUAL_COM_PORT_DATA_SIZE;\ } else {\ ]5 Y3 v+ u% M# C: b: N) v USB_Tx_length = VCPx_Rx_length;\ VCPx_Rx_ptr_out += VCPx_Rx_length;\ VCPx_Rx_length = 0;\ }\ USB_SIL_Write(ENDPx, &VCPx_Rx_Buffer[USB_Tx_ptr], USB_Tx_length);\7 [; x( t$ U8 i# B/ I SetEPTxValid(ENDPx);\ }\+ D1 K' U+ Q/ g0 w- m- F }\ } 5 \# M. }+ D0 U) ?/ P3 W" M /* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(阻塞方式) */ #define EPx_OUT_Callback(ENDPx, USARTx, GPIOx, GPIO_Pin_x) {\/ G0 p0 @3 m$ U* p0 ] uint32_t i;\+ N; f* K: c3 `4 M/ }; A uint16_t USB_Rx_Cnt;\, i- A4 r4 x1 c: `$ V USB_Rx_Cnt = USB_SIL_Read(ENDPx | 0x00, USB_Rx_Buffer); \6 d1 G) w% ~5 @ GPIOx->BSRR = GPIO_Pin_x;\! k. T8 k: `: \3 l; Q- M for (i = 0; i < USB_Rx_Cnt; i++) {\ USARTx->DR = *(USB_Rx_Buffer + i);\3 H4 N' F" K) G. O: }, s while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);\: C+ H2 x- X, Y. j3 y2 `5 i }\8 v9 M# ] h: S. l K4 {" l SetEPRxValid(ENDPx);\ while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);\ USART_ClearFlag(USARTx, USART_FLAG_TC);\ GPIOx->BRR = GPIO_Pin_x;\ }- @2 g$ |0 Q8 x2 D3 b! ]3 M5 r* [ - d" J$ U8 ~3 [2 I( v4 P /* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(DMA方式) */ #define EPx_OUT_Callback_DMA(Flag_VCPx_Tx_Buf_Use, ENDPx, VCPx_Tx_Buffer1,VCPx_Tx_Buffer2,\" ~% ^- A# s" \% E% e6 c GPIOx, GPIO_Pin_x, DMA1_Channelx, VCPx_Tx_Buffer_Cnt, Flag_VCPx_Tx_Buf_Full) {\5 p7 T% z3 d! x7 a uint16_t USB_Rx_Cnt;\* c5 o8 x9 b$ K3 v if(Flag_VCPx_Tx_Buf_Use == 0){\0 }2 U; d! {2 m1 i2 @* t4 W/ T0 x USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\ PMAToUserBufferCopy(&VCPx_Tx_Buffer1[0], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\( j/ @# {6 W i* @5 l SetEPRxValid(ENDPx);\* P' o+ f+ ^( H GPIOx->BSRR = GPIO_Pin_x;\% p! y& X4 z; N) D3 V DMA1_Channelx->CNDTR = USB_Rx_Cnt;\" `& A5 u; v! s8 u6 C( } u" _( } DMA_Cmd(DMA1_Channelx, ENABLE);\+ F' w' j: A% F2 R8 t" L, O Flag_VCPx_Tx_Buf_Use = 1;\ VCPx_Tx_Buffer_Cnt = 0;\& \# U; t; V+ X0 n. M. B) F7 T! d } else {\ USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\( Q, }6 ~* P8 [! ^$ o, P: w" } if(VCPx_Tx_Buffer_Cnt < (1024-128)){\' |6 U: e y- q( h I" p PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\, C! @. K# ~: B. `& g! U VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\ SetEPRxValid(ENDPx);\ } else {\- A0 S# I$ l+ a- e1 V" E PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\ VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\ R, l5 u: I+ Z Flag_VCPx_Tx_Buf_Full = 1;\2 G2 l/ y' g( K }\6 [2 v, {1 X" x" T ~) t }\5 `/ x' a1 l$ [' ~# G, @. l4 c+ t } * z5 u# i2 J; N c# L6 ?" O 附录:USB Serial Tools工具软件的特殊功能介绍 一般的串口调试工具,不会针对USB插拔做专门的检测和处理,比较容易崩溃,例如微软收购的超级终端等。 USB Serial Tools 是本人自2009-2012年,个人业余时间开发的一个带有USB插拔检测的串口调试软件。 和其它串口调试工具相比,是专用软件,值得一提的功能如下:( R8 f4 A& y/ o' l; D 1 支持高波特率。(支持该功能的串口调试工具屈指可数,大部分串口调试工具仅支持到115200)" n% A7 K" s. `3 P. J# ~ D3 A6 K 2 支持USB插拔检测。(支持该功能的串口调试工具屈指可数,大部分串口调试工具都会因此崩溃): [5 u$ e2 I6 u; G2 V1 U' c USB Serial Tools 下载地址: USB Serial Tools.zip " U5 w& W/ [" v , G" j/ f& L, a4 P1 C + a/ B$ F) u. \/ N0 p k h/ R& v2 I6 O2 r! h; m) W ) u" K& t$ b; p. o 4 V) [. _# O! p# V T J: n' Q6 Y: O4 ~5 c & n4 D* j* }" @. B7 @2 n! w ' N% `; g4 X3 e4 q6 i7 u) x: [ T' L 5 d5 M+ O3 A6 U' R# u8 t |
USB串å£å·¥å ·æ¯æç«¯ç¹å·æ¾ç¤º
DMA 原理从 0 到 1:为什么它能解放 CPU?一文讲透 DMA 的工作流程
【福利三:雨露均沾·逢7狂欢】之五:STM32系统时钟PLL故障排除1例
【福利三:雨露均沾·逢7狂欢】之三:AI帮我查BUG
福利三:雨露均沾·逢7狂欢】之二:STM32F407VG串口通信乱码故障的排除
基于STM32F103的I2C主从机通信
最全USB HID开发资料,悉心整理一个月,亲自测试
【源码】STLINK-V3MINI 高速USB仿真器,成功改刷【高速CMSIS-DAP】
OpenBLT移植到STM32F103战舰开发板上适用于所有STM32F103系列的Bootloader
TFT LCD 与 FSMC 的硬件连接大容量 STM32F10xxx FSMC 接口
单片机:初学者该了解的STM32F103基础知识
微信公众号
手机版
好东西啊!学习学习!