
前言 客户在 STM32F401RET6 中使用到了 USB 的虚拟串口功能。要求提供一个在 STM32Cube 中实现虚拟串口进行数据环回测试功能的范例程序。因为在我们目前所提供范例程序中,并没有适合客户需求的范例,所以我们在 STM32CubeMX 中创建一个范例程序给客户进行参考。 环境需求如下: 硬件环境:STM32F401C-Dicovery 电脑操作系统:window 7.x 集成开发环境:MDK、IAR 驱动:ST VCP Driver STM32CubeMX:4.12.0 STM32CubeF4:1.10.0 STM32CubeMX 中配置流程 实现步骤如下: 首先,打开 STM32CubeMX 软件,选择 STM32F401C-Discovery 板子。 ![]() 在 PinOut 列中选择 USB OTG FS 的 Device Only 选项 ![]() 使能 USB 中间件的虚拟串口功能 ![]() 直接生成代码,这里我们选择 MDK 的 IDE,工程名字叫 VCP_Test ![]() 在生成的工程代码中的 usbd_cdc_if.c 文件中添加如下几行代码:
这个定义本来就有的,只是建议将定义的值修改为 1024,这样效果更好。这个值的默认值是 4,但是在实际的操作中发现,如果你上位机传输的数据大于 4,且并不是 4 的整数倍的时候,会出现丢数据或者数据不返回的问题。其根本原因是因为虚拟串口的数据是以数据流的方式发送出来的,接收数据不知道每次接收到的数据大小是多少,所以使用了循环队列,但是一旦你的循环队列很小,很容易出现溢出的问题。比如你设置这个值为 5,你发一个 123456 的数据给 MCU,那么 MCU 就会返回 123451这六个数据。最后的一个数据就是溢出了,所以只能被第一个数据所代替。
上边这部分代码是用来做串口参数设置的。下边的代码中会用到。 在 CDC_Control_FS 函数中的对应位置添加如下 code
在 CDC_Receive_FS 函数中的对应位置添加如下代码
这是用来接收 USB 传输的数据,并缓存到 UserTxBufferFS 这个数组中。 在最后添加如下函数
这个函数实现了一个简单的数据队列操作,一旦有数据收到,就将该数据发送到 PC 端,实现数据的环回功能。 在 main.c 的主循环中,调用 Main_loop 这个函数即可。
最后修改一下堆栈的大小: 在 MDK 中修改堆栈: ![]() IAR 中配置堆栈大小 ![]() 编译后直接下载到 MCU 中即可以运行查看结果。 注意:硬件需要一根 Micro USB 线来连接板子的 USB 端口和 PC 机。 PC 端需要已经安装好 ST 提供 VCP 驱动程序。 ![]() ![]() 问题总结: STM32CubeMX 会使 STM32 全系列中的软件移植工作变得更方便。在一些以前看起来比较复杂的程序,在 Cube 中可以很简的完成。 |
【经验分享】STM32CubeIDE汉化
手把手教你VSCode搭建STM32开发环境
RTOS在STM32中的应用
【下载有礼】STM32 Finder华为应用商店正式上线!移动选型工具助力开发效率升级
【2025·STM32峰会】GUI解决方案实训分享5-调通板载的NRF24L01 SPI接口并使用模块进行无线通信(发送和接收)
【2025·STM32峰会】GUI解决方案实训分享2-编译运行TouchGFX咖啡机例程(含桌面仿真)
实战经验 | Keil工程使用NEAI库的异常问题
STM32 ISP IQTune:真正零门槛的免费ISP调整软件
【经验分享】STM32 新建基于STM32F40x 固件库的MDK5 工程
意法半导体MCU双供应链策略,打消中国客户后顾之忧