你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32实战】基于STM32F1的USB转多路串口(USB-Multiple-CDC)

[复制链接]
wjandsq 发布时间:2014-12-23 16:26
本帖最后由 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串口工具支持端点号显示

USB串口工具支持端点号显示
收藏 5 评论12 发布时间:2014-12-23 16:26

举报

12个回答
沐紫 回答时间:2014-12-23 16:38:11
xiexie
巅峰残狼 回答时间:2014-12-23 18:55:15
好牛逼的样子,赞一个
mini92 回答时间:2015-7-28 19:45:27
楼主你好,请问一下delphi xe4如何安装控件,你的源码我在大虾电子网找到了,卡在了delphi安装Cport控件那一步无法进行下去了,求求楼主可怜一下菜鸟,帮忙解决一下这个问题,谢谢
mini92 回答时间:2015-7-28 20:17:48
我发现,我的问题就是卡在了安装CPort控件的步骤上,然后还有就是生成lib文件的步骤上,大虾电子网上的安装控件教程的帖子被删除了,求求楼主大发慈悲共享一下,
jhon 回答时间:2015-9-23 10:30:38
工程下载链接有问题,能发一份到我邮件么  373981167@qq.com  谢谢!
stary666 回答时间:2015-9-23 10:43:16
好东西,,,,,,
foxglove 回答时间:2015-9-23 10:50:27
实现的USB转多路串口(USB-Multiple-CDC)例程
低级格式化 回答时间:2016-12-30 23:25:20
呃……资料已经下不到了,楼主可否再传一份?
yygkqzh 回答时间:2018-4-13 21:42:12
资源失效了 能重新发一下吗
a14725836900 回答时间:2019-5-2 12:07:11
谢谢分享,您的研究很详细,谢谢了。
pubgnice 回答时间:2019-5-22 17:44:21

好东西啊!学习学习!
tech1222 回答时间:2020-2-11 23:36:35
有参考的作用,谢谢

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版