STM32 CubeMX USB VCP(虚拟串口)示例

背景

STM32的很多系列都带有USB功能,USB的作为通用接口,可以减少一些用户在使用RS232时所用的一根转换线。
但是USB复杂的协议提高了使用USB的入门门槛,一般人要完全了解USB协议就需要花很多时间。实际应用中也不可能在完全学习了USB的所有知识才开始做应用。
不过ST为我们封装好了USB的栈代码,可以使我们在不了解USB的协议的情况,只需使用几个API就可以快速使用USB功能。
这篇我们以VCP(虚拟串口),相当于是一根USB转232的线,展示下VCP的一个DEMO,以STM32F103C8T6为例。

电路

STM32F103C8T6,只能用作设备模式,且工作在全速模式下,D+管脚必须要接一个1.5K的上拉电阻,如下图所示
如果这个电阻没有的话,上电时候设备就不能被主机检测到
于此同时还会对D+,D-两个管脚再加一个ESD芯片进行保护

CubeMX详细操作

创建工程

调试接口

这个调试接口并不是必选的,只是如果没有选择的话,调试接口会被关闭,再用调试接口来修改程序就不能用,相当于第二次就烧录不进去了
此处选择的是SWD接口

选择时钟

添加USB功能

配置USB时钟

USB的工作时钟是48M,虽然文档上面有要求只能HSE倍频使用,但是测试过来用HSI倍频到48M也可以用,只是MX会提示时钟错误。
这个说法只作参考,以实际使用效果为准。
这里我们还是使用8M的HSE倍频到72,再分频到48M作为USB的工作时钟。

添加VCP功能

生成代码

当前使用的是KEIL5,这里的HEAP跟STACK目前来说用默认就好,虽然网上有些说法,要加大一些,不过只是运行的DEMO的话用默认就可以。


将这个工程编译烧录到芯片,USB的VCP功能就可以被主机检测到了,发送与接收的代码需要在后面再加。
对于WIN7的用户需要先安装STM32,VCP的驱动才动保证被识别,而WIN10就不需要装驱动,系统自带驱动了

添加用户代码

发送

在main.c这个文件里面添加如下代码,就可以直接发送数据到VCP,对虚似串口的波特率,对USB口都是一样,随便选择一个即可,这里选择9600
添加头文件

#include "usbd_cdc_if.h"
char str[] = "Hello World!\n";
CDC_Transmit_FS((uint8_t*)str, 13);
HAL_Delay(2000);

接收


我们可以不需要管STM32的USB接口的底层的硬件跟软件是如何实现的。
在CDC_Receive_FS这个函数里面就可以得到VCP发送过来的数据,像如上代码可以实现回传功能(即发送返回什么)。
也可以将接收到的数据,传至我们的解码逻辑进行解码。不过像UART的单字节中断,并开启解码的这种逻辑在这里就不适用了

串口调试助手显示

打印输出

当然也可以把USB作为类似于uart的printf来输出当前需要的log信息。我们只需要把这个函数改就下可以使用USB,VCP来打印输出信息。

int fputc(int ch, FILE *f)
{
	while(CDC_Transmit_FS((uint8_t *)&ch, 1) == USBD_BUSY);
	return ch;
}

总结

STM32MXCube用户提供了一个很方便使用USB(VCP)功能,只需几个操作就可以在工程里面加上VCP的库。通过这个VCP可以完成我们应用的一部分功能。
虽然通过VCP这个DEMO,我们还是不了解USB的具体的底层操作的详细过程及逻辑,肯定也不了解USB的具体协议栈。
这种方式可以将USB的部分功能先用起来,实现我们的一些需求。作为开启了STM32的USB学习之旅也未尝不可。
我们可以站在巨人的肩膀上先使用,在实现的应用中,为了达到更好的性能,解决一些意想不到的问题,就需要更深入的去学习USB的知识,USB协议栈,STM32的底层具体实现。
VCP只是USB的一个功能应用,使用STM32的USB还可以实现更多的其他功能。

posted @ 2022-04-29 10:18  cau_par  阅读(3572)  评论(0编辑  收藏  举报