“ USB接口是我们生活中使用非常广泛的一种接口,在嵌入式中使用也很广泛,相比于UART口,USB的通信协议要复杂的多。本篇文章不介绍底层协议的内容,感兴趣的读者可以自行查找相关资料,本文主要介绍如何使用STM32CubeMX工具快速实现USB虚拟串口通讯。”简单来说,USB有主机(Host)和设备(Device)之分。一般电脑的USB接口为主机接口,而键盘、鼠标、U盘等则为设备。部分型号的STM32芯片有1~2个USB接口。像STM32F103系列的有一个USB Device接口,STM32F407系列的有2个USB接口,既可以作为HOST,又可以作为Device,还可以作为OTG接口。STM32的USB接口支持USB2.0协议,内部集成了全速PHY,速度可达12Mbps,直接外接USB接口即可实现USB通信。高端系列的芯片还支持USB高速接口(480Mbps),一般需要外接高速PHY芯片。而STM32F723芯片则内置了高速USB-PHY,不需要外部PHY就可以实现USB高速通讯。以STM32F072为例,该单片机有一个USB Device接口,为PA11、PA12引脚,外部只需要直接连接USB接口即可。电路图如下图所示。另外,USB通讯需要48MHz的时钟,且对于时钟精度要求较高,F072内部有高精度的48MHz的时钟,可以满足USB通讯的要求,不需要再使用外部晶振。需要注意的是F103系列的单片机必须使用外部晶振,且DP(D )引脚必须外接1.5K的上拉电阻,上拉到3.3V。STM32的USB接口支持多种模式,包括音频设备、虚拟串口、DFU模式、HID、自定义HID以及大容量存储设备:以USB虚拟串口为例,首先使能USB接口,参数配置默认即可,中断也是默认打开的。USB Device模式配置如下,选择虚拟串口,参数配置默认,设备描述符(Device Descriptor)也默认即可。也可以根据自己需要进行修改。初始化与中断的代码已经自动生成,用户发送和接收数据只需调用两个函数即可,有时候也需要对两个函数进行修改,以实现自己的通讯协议和功能。
int8_t CDC_Receive_FS(uint8_t* pbuf, uint32_t *Len)
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
电路板上电后,插入USB线,并连接电脑,电脑会弹出安装驱动的提示,安装STM32虚拟串口的驱动,打开串口调试助手,可以当做普通串口使用,进行发送和接收的测试。此时波特率的设置是无效的,理论上虚拟串口的通信速率可达12Mbps。