|
本帖最后由 wjandsq 于 2015-9-6 15:08 编辑 根据ST英文社区提供的资料,实现的USB转多路串口(USB-Multiple-CDC)例程,利用了STM32F103系列多端点的特性。而STM32F2/F4端点数量较少,不能实现USB-Multiple-CDC,但STM32F2/F4可以外加高速PHY芯片,实现USB2.0高速通讯。应该说F1和F2、F4使用场合不同,所以功能定位有所不同。 例程包下载地址:USB-Multiple-CDC 注意事项: 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路而已。 三路串口的DMA发送代码部分预览如下: /* 带参数的宏功能(预编译展开): 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) {\ USB_Tx_ptr = VCPx_Rx_ptr_out;\ if (VCPx_Rx_length == 0) {\ CDCx_Tx_State = 0;\ SetEPTxCount(ENDPx,0);\ SetEPTxValid(ENDPx);\ } 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;\ VCPx_Rx_length -= VIRTUAL_COM_PORT_DATA_SIZE;\ } else {\ 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);\ SetEPTxValid(ENDPx);\ }\ }\ } /* 带参数的宏功能(预编译展开): USB的OUT端点 通过物理串口向外发送数据(阻塞方式) */ #define EPx_OUT_Callback(ENDPx, USARTx, GPIOx, GPIO_Pin_x) {\ uint32_t i;\ 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++) {\ USARTx->DR = *(USB_Rx_Buffer + i);\ while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);\ }\ SetEPRxValid(ENDPx);\ while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);\ USART_ClearFlag(USARTx, USART_FLAG_TC);\ GPIOx->BRR = GPIO_Pin_x;\ } /* 带参数的宏功能(预编译展开): 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;\ if(Flag_VCPx_Tx_Buf_Use == 0){\ USB_Rx_Cnt = GetEPRxCount(ENDPx & 0x7F);\ PMAToUserBufferCopy(&VCPx_Tx_Buffer1[0], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\ SetEPRxValid(ENDPx);\ GPIOx->BSRR = GPIO_Pin_x;\ DMA1_Channelx->CNDTR = USB_Rx_Cnt;\ 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)){\ PMAToUserBufferCopy(&VCPx_Tx_Buffer2[VCPx_Tx_Buffer_Cnt], GetEPRxAddr(ENDPx & 0x7F), USB_Rx_Cnt);\ VCPx_Tx_Buffer_Cnt += USB_Rx_Cnt;\ SetEPRxValid(ENDPx);\ } 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;\ }\ }\ } 附录:USB Serial Tools工具软件的特殊功能介绍 一般的串口调试工具,不会针对USB插拔做专门的检测和处理,比较容易崩溃,例如微软收购的超级终端等。 USB Serial Tools 是本人自2009-2012年,个人业余时间开发的一个带有USB插拔检测的串口调试软件。 和其它串口调试工具相比,是专用软件,值得一提的功能如下: 1 支持高波特率。(支持该功能的串口调试工具屈指可数,大部分串口调试工具仅支持到115200) 2 支持USB插拔检测。(支持该功能的串口调试工具屈指可数,大部分串口调试工具都会因此崩溃) USB Serial Tools 下载地址: USB Serial Tools.zip |
USB串口工具支持端点号显示
xiexie |
好牛逼的样子,赞一个 |
| 楼主你好,请问一下delphi xe4如何安装控件,你的源码我在大虾电子网找到了,卡在了delphi安装Cport控件那一步无法进行下去了,求求楼主可怜一下菜鸟,帮忙解决一下这个问题,谢谢 |
| 我发现,我的问题就是卡在了安装CPort控件的步骤上,然后还有就是生成lib文件的步骤上,大虾电子网上的安装控件教程的帖子被删除了,求求楼主大发慈悲共享一下, |
| 工程下载链接有问题,能发一份到我邮件么 373981167@qq.com 谢谢! |
| 好东西,,,,,, |
| 实现的USB转多路串口(USB-Multiple-CDC)例程 |
| 呃……资料已经下不到了,楼主可否再传一份? |
| 资源失效了 能重新发一下吗 |
STM32
超强工具——STM32CubeMX 你会用吗?
集结出发! STM32全国研讨会系列之一:ST智能门铃中国首秀
关于STM32启动文件的几个小问题
【银杏科技ARM+FPGA双核心应用】STM32H7系列35——USB_VCP_FS
【银杏科技ARM+FPGA双核心应用】STM32H7系列28——USB_HID
粉丝分享 | 图说CRC原理应用及STM32硬件CRC外设
STM32L151进入低功耗,并由RTC唤醒的故事
[转]stm32控制NFC模块(PN532)源码(P2P,模拟卡,读写卡等
STM32G070RB+LVGL移植
微信公众号
手机版