[STM32F4] STM32实现USB转串口功能(含源码)

[复制链接]
2267|7
 楼主| zhang062061 发表于 2021-1-31 19:58 | 显示全部楼层 |阅读模式
本帖最后由 zhang062061 于 2021-1-31 20:01 编辑

之前的**中介绍过STM32的USB接口虚拟串口的功能。《STM32CubeMX之USB从机》。本篇**在此基础上,以STM32F407为例,介绍USB转串口功能的实现。
要实现USB转串口的功能,需要将单片机真实串口(这里以USART1为例)的收发数据与USB口进行交互。用过USB虚拟串口的朋友可能知道,要实现该功能,还存在以下问题:
1.电脑上设置的串口波特率不影响USB接口传输的速率。
2.怎样获取电脑上串口助手设置的波特率,以设置USART1使其波特率与串口助手一致。
波特率设置
其实STM32CubeMX生成的程序中已经提供了相关的接口,只需要用户自己实现即可。打开usbd_cdc_if.c文件,CDC_Control_FS函数中,添加如下程序。
1.png

其中上面的注释是系统生成的,根据注释添加相应的红框中的程序。LineCoding是一个结构体:

  1. USBD_CDC_LineCodingTypeDef LineCoding =
  2. {
  3.     115200, /* 波特率*/
  4.     0x00,   /* 停止位-1*/
  5.     0x00,   /* 校验 - none*/
  6.     0x08    /* 数据位 8*/
  7. };

USBD_CDC_LineCodingTypeDef的格式也是系统定义好的。
添加完成后,在电脑的串口助手上更改波特率时,系统会调用这段程序,重新配置USART1的波特率,使两者保持一致。
剩下的功能就是数据转发,即将USB接收的数据通过USART1发送出去,将USART1接收的数据发送到USB接口。
USB数据转发到USART1
同样是在usbd_cdc_if.c文件中,修改USB接收函数CDC_Receive_FS。将原来的程序屏蔽,添加串口发送的程序。
2.png

添加串口发送完成中断回调函数(前提是使能串口发送中断):

  1. void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
  2. {
  3.   USBD_CDC_ReceivePacket(&hUsbDeviceFS);
  4. }

USART1数据转发到USB
本例程是通过中断方式接收USART1数据,并通过接收超时时间来判断一帧数据接收完成。当然也可以通过其它方式实现转发,例程只是简单实现功能。
添加串口中断回调函数:
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  2. {
  3.   UserTxBufPtrIn++;
  4.   if(UserTxBufPtrIn == APP_RX_DATA_SIZE)//防止溢出
  5.   {
  6.     UserTxBufPtrIn = 0;
  7.   }
  8.   UR_Tick = 0;//接收计时器清零
  9.   UR_Flag = 1;//正在接收
  10.   HAL_UART_Receive_IT(huart, (uint8_t *)(UserTxBufferFS + UserTxBufPtrIn), 1);
  11. }

判断一帧数据接收完成后,通过USB接口转发出去。

  1. if(UR_Flag == 2)
  2. {
  3.   UR_Flag = 0;
  4.   CDC_Transmit_FS(UserTxBufferFS, UserTxBufPtrIn);
  5.   UserTxBufPtrIn = 0;
  6. }


通过以上设置,即可实现类似CH340等USB转串口芯片的功能。但STM32的USB接口功能更强大,可以实现USB复合设备,比如同时虚拟多个串口。以后有时间再做研究和大家分享。

源码下载(公众号不支持链接,需要复制出来):
链接:https://pan.baidu.com/s/1Xhb80g0a-H1uVpfdhyT5cw
提取码:swyl


欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。

3.png


评论

好玩儿。。。  发表于 2021-3-5 13:39
eefas 发表于 2021-3-4 23:45 | 显示全部楼层
这个比较可以。        
123654789 发表于 2021-3-6 16:47 | 显示全部楼层
顶顶顶顶顶顶顶顶顶顶顶顶
jcky001 发表于 2021-3-7 14:28 | 显示全部楼层
很不错的,了解了
sfd123 发表于 2021-3-9 16:05 | 显示全部楼层
有USB host cdc吗?
 楼主| zhang062061 发表于 2021-3-9 20:59 | 显示全部楼层
sfd123 发表于 2021-3-9 16:05
有USB host cdc吗?

有时间写一篇**,可以关注我的公众号
tangsun 发表于 2021-11-11 16:49 | 显示全部楼层
很荣幸能看到这样的精华帖子,感谢楼主!我最近也在用STM32F407的FS虚拟串口,需要虚拟出三个串口来;首先使用cubeMX生成标准的VCP工程 ,调试好一路串口的数据传输,也解决了不能发送64byte整数倍的问题;然后进行复合设备修改,目前已经枚举成功了,能够在PC上识别到3个COM端口,收发数据的时候遇到一个问题:CDC_IN_EP1发送数据到PC端正常,使用其他两路端点时(CDC_IN_EP3和CDC_IN_EP5)只能发送一次数据到PC端,后续就不能成功了,总是返回USBD_BUSY,请教一下楼主可能是什么原因呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

41

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部