打印
[STM32F1]

STM32使用USB虚拟串口

[复制链接]
1397|48
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
louliana|  楼主 | 2025-1-29 16:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
通常我们使用STM32进行串口通信会选择其硬件串口,但在某些情况下串口会不够用,这个时候就可以选择USB的虚拟串口,这样可以增加一个串口。
USB是非常复杂的一个设备,要想完全搞懂它需要花费不少时间和精力。但去使用它却相对简单。这里我们使用STM32CubeMX构建一个初始工程,然后实现将我们从电脑发下来的东西原封不动地发回电脑,使用的芯片是STM32F103zet6。
USB需要配置两个地方,一个是Connectivity下勾选USB,在Mode下勾选Device,下面的参数保持默认即可。其他芯片类型的选项可能不同,选择有Device字样的就OK。


驱动安装好后,接下来看看如何实现数据的收发。
在usb_device.c文件下实现了USB设备的初始化,只需要调用它就完成了所有的USB初始化工作。


这里可以看到接收用了static关键字,说明它只能在本文件中使用,不可以外部调用。发送我们可以直接调用。这里先介绍发送吧。
发送
如果是发送原始数据,可以直接将数据打包成数组,然后调用函数发送即可。但通常我们用串口打log,所以这里可以构造一个printf函数。


使用虚拟串口波特率不起作用,任何波特率都可以用。
在main中我们还发现有一个USB_Status_Init()函数,这个函数用来复位USB口。如果没有这个函数,每次下载完程序后需要重新插拔usb线电脑才能识别到,有了它就可以不用拔插线了。
原理也很简单,就是让USB的两个Pin都是低电平持续几个毫秒即可。

使用特权

评论回复
沙发
星辰大海不退缩| | 2025-1-30 10:32 | 只看该作者
USB是非常复杂的一个设备,要想完全搞懂它需要花费不少时间和精力。

使用特权

评论回复
板凳
robertesth| | 2025-2-4 18:49 | 只看该作者
在下载新程序到STM32后,有时需要重新插拔USB才能识别到新的虚拟串口设备。这可以通过在代码中添加USB重新枚举函数来解决,如将USB DP引脚拉低一段时间后释放。

使用特权

评论回复
地板
bartonalfred| | 2025-2-4 20:28 | 只看该作者
USB 通信会涉及到各种中断,如 USB 接收中断、发送完成中断等。要合理编写中断处理函数,保证数据的正确接收和发送,避免出现数据丢失或错误。

使用特权

评论回复
5
beacherblack| | 2025-2-5 11:57 | 只看该作者
USB虚拟串口一次最多接收64字节,如果数据量较大,可能会连续调用多次接收函数。

使用特权

评论回复
6
kkzz| | 2025-2-5 13:02 | 只看该作者
使用USBD_CDC_Transmit或类似函数发送数据,使用USBD_CDC_Receive或中断回调函数接收数据。

使用特权

评论回复
7
hudi008| | 2025-2-5 14:29 | 只看该作者
由于USB虚拟串口通信可能会涉及到较多的数据处理和传输,因此需要合理设置堆栈大小,以防止堆栈溢出。

使用特权

评论回复
8
loutin| | 2025-2-5 16:25 | 只看该作者
注意USB DP引脚需要上拉1.5K欧的电阻,以便电脑能检测到USB设备。

使用特权

评论回复
9
houjiakai| | 2025-2-5 17:13 | 只看该作者
USB 通信容易受到电磁干扰,所以要做好 PCB 布线。USB 数据线要尽量短且等长,避免与高速信号或大电流线路平行走线,必要时可使用屏蔽线。

使用特权

评论回复
10
louliana|  楼主 | 2025-2-5 18:04 | 只看该作者
合理分配各端点的缓冲区,避免缓冲区描述表被覆盖,确保USB通信正常运行

使用特权

评论回复
11
cemaj| | 2025-2-5 20:49 | 只看该作者
在数据传输过程中,使用DMA进行数据传输,可以提高通信速度和稳定性。

使用特权

评论回复
12
louliana|  楼主 | 2025-2-6 11:10 | 只看该作者
USB时钟通常需要配置为48MHz,这是USB通信的标准时钟频率。

使用特权

评论回复
13
51xlf| | 2025-2-6 14:16 | 只看该作者
注意USB CDC库函数的调用和USB状态的异常处理

使用特权

评论回复
14
wwppd| | 2025-2-6 14:38 | 只看该作者
USB信号是高速数字信号,容易受到外界干扰。在设计电路时,要考虑PCB布线的合理性,尽量缩短USB走线的长度,减少过孔的使用,以降低信号的反射和干扰。

使用特权

评论回复
15
plsbackup| | 2025-2-6 14:58 | 只看该作者
合理处理错误和中断,优化代码以提升效率

使用特权

评论回复
16
51xlf| | 2025-2-6 16:00 | 只看该作者
USB驱动程序与硬件平台兼容,避免因驱动问题导致的通信异常。

使用特权

评论回复
17
elsaflower| | 2025-2-6 17:07 | 只看该作者
在调试过程中,注意观察USB通信状态,及时发现并解决问题。

使用特权

评论回复
18
backlugin| | 2025-2-6 18:27 | 只看该作者
选择合适的缓冲区大小,防止数据溢出

使用特权

评论回复
19
个是Connectivity下勾选USB,在Mode下勾选Device,下面的参数保持默认即可。

使用特权

评论回复
20
mmbs| | 2025-2-13 17:13 | 只看该作者
虚拟串口的波特率设置实际上不起作用,任何波特率都可以使用。因此,在通信时不需要关注波特率的设置

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

1387

帖子

1

粉丝