应用场景:

本次在项目中,由于对方的上位机软件比较老旧。
该软件只能通过串口通讯。而我们的设备只引出了USB口。还好STM32 的USB类型可以设置成虚拟串口。所以可以通过把USB枚举成虚拟串口(virtual com port设备)来与该上位机软件通讯。
本来是想直接移植STM32 的USB_FS库。奈何移植失败。(给跪了orz orz orz…)
又想起CubeMX也可以配置的。就用CubeMX配置工程,效果出奇的好。PC能够正常的枚举和通讯。所以趁热和大家分享分享,自己也做个记录。
以下内容就是如何一步一步通过CubeMX,把STM32的USB配置成虚拟串口的过程。
文章最后放上了本次CubeMX的工程和对应的虚拟串口代码。

配置过程:

1、点开CubeMX,新建工程,选择MCU。我用的是STM32F103VCT6。你们根据自己实际的MCU选择对应的型号以及封装格式。


2、选择系统时钟源。这边必须要配置,没配置系统时钟,不能生成正确的代码。
这里我使用的是外部晶振。(根据实际配置)

3、配置USB的上拉PIN脚。我这边的上拉PIN是PA13(根据实际情况配置)。注意硬件上DP要接个1.5K的上拉。用以表示高速设备以及枚举控制。

4、选上USB FS功能

5、继续“去中间层”,设置USB的识别类型。我们是虚拟口,所以选VCP设备。

6、配置系统时钟树参数。我的外部晶振是12M,所以要得到72M时钟,要选择倍频系数为6倍频。(晶振是8M则选择9倍频)
注意USB时钟要为48M。所以选1.5分频。

7、配置结束,去设置工程保存的位置。注意工具和版本。

8、生成工程。


9、打开工程,已经直接生成好了USB虚拟串口的代码。并可以直接编译不报错。

int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USB_DEVICE_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

10、这个时候载入生成的文件到MCU里,是不枚举的。因为自动生成的代码里,只完成初始化等一些基本功能。

PA13上拉以及收、发函数还需要我们自己完善才可以。

11、加入PA13上拉。编译载入,可以看到枚举出了com12虚拟口。

  /* Initialize all configured peripherals */MX_GPIO_Init();MX_USB_DEVICE_Init();/* USER CODE BEGIN 2 */HAL_GPIO_WritePin(GPIOA, GPIO_PIN_13, GPIO_PIN_SET);


12、调用发送函数。发送使用的是CDC_Transmit_FS函数。
所以我们在系统运行时,直接扔出个信息查看。编译并运行。发现确实有扔出信息(USB SYSTEM ON)。

13、调用接收函数CDC_Receive_FS。在CDC_Receive_FS里,把收到的数据进行计数以及保存。

static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{/* USER CODE BEGIN 6 */if(*Len<0x100){uint16_t i;receive_len = *Len;for(i=0;i<*Len;i++)receivebuf[i] = Buf[i];}USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);USBD_CDC_ReceivePacket(&hUsbDeviceFS);return (USBD_OK);/* USER CODE END 6 */
}

14、做好了接收,我们在main里判断,接收的数据非空,则直接输出收到的数据。到此工程结束。

int main(void)
{/* USER CODE BEGIN 1 */uint32_t i;/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USB_DEVICE_Init();/* USER CODE BEGIN 2 */HAL_GPIO_WritePin(GPIOA, GPIO_PIN_13, GPIO_PIN_SET);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */for(i = 0;i < 5;i++){HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);delay_1000ms();HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);delay_1000ms();}CDC_Transmit_FS("USB SYSTEM ON\r\n",15);while (1){if(receive_len!=0){CDC_Transmit_FS(receivebuf,receive_len);receive_len = 0;memset(receivebuf,0,sizeof(receivebuf));}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

运行测试:

PC往STM32 USB虚拟口输入什么,则STM32通过USB返回刚刚收到的内容。试验成功。

小结:

CubeMX确实是个挺好的工具。给大家提供了更多更简单的使用选项。

工程及源码:

CubeMX和程序源码链接: link.

使用STM32CubeMX把USB配置成虚拟串口(virtual com port)相关推荐

  1. STM32 USB 虚拟串口 Virtual COM Port

    简单粗暴,直接上操作 第一步,设备接口中的USB,完全默认即可: 第二步,配置中间件中的"USB_DEVICE". 然后生成代码. 在要使用虚拟串口发送数据的模块文件内,要包含发送 ...

  2. vspd 虚拟串口 Virtual Serial Port Driver 7.2+破解补丁

    安装说明: Virtual Serial Port Driver 7.2英文版 1.运行vspd.exe安装软件. 2.复制vspdctl.dll到安装目录,覆盖原文件. 3.启动vspdconfig ...

  3. USB转串口与虚拟串口相关

    不是原创,网上查询整理. 目录 一.串口与并口 二.USB转串口.虚拟串口概念 三.串口占用问题 四.其他:多个程序共享一个串口数据 五.COM.COM+和DCOM与COM端口无关 一.串口与并口 ( ...

  4. STM32 USB复合设备(VCP虚拟串口+HID键盘)详解

    USB复合设备 介绍 USB复合设备与组合设备区别 USB描述符修改 修改CustomHID_Reset 修改CustomHID_Data_Setup 介绍 本次使用的是Keil 5+STM32F10 ...

  5. USB协议学习笔记 - 虚拟串口Virtual Port Com LED控制

    前言 STM32 的USB 可以虚拟成一个串口,功能还挺强,感觉比HID好用 这里使用USB 虚拟的串口,做个控制LED的小程序 控制LED这里使用自定义的AT命令方式,如红灯亮:AT+LEDR_ON ...

  6. USB协议学习笔记 - 虚拟串口Virtual Port Com用于LOG打印

    前言 上一篇讲了STM32 USB 虚拟串口的功能实现,可以通过STM32输出信息到PC端 这篇简单的做个应用:打印LOG(日志)信息到虚拟串口 操作方法 基于上篇的STM32 USB Virtual ...

  7. STM32F107——OTG模块之USB设备之虚拟串口移植(四)

    第一次移植的时候,可能由于对这个USB库还是太了解,可能改动了底层的我一个关键值,当移植完成之后,在测试的过程发现,总是会出现某一次的数据只发送了一小段,而剩下的部分只有在我再次获取的时候会被发送,且 ...

  8. STM32 USB使用记录:使用CDC类虚拟串口(VCP)进行通讯

    文章目录 目的 基础说明 使用STM32CubeIDE配置生成代码 用户代码分析 回环测试 串口参数设置 USB HS使用与演示 通讯速率测试 测试代码 USB FS测试 USB HS测试 影响速度的 ...

  9. vsport 虚拟串口 控件 Virtual Serial Port ActiveX注册码

    使用VSport.dll 开发了虚拟串口工具 在开发电脑上 安装好驱动后 可以运行 正常创建虚拟串口 Virtual Serial Port ActiveX 提供 vsport注册码,该注册码可以正常 ...

最新文章

  1. 阅读Book: MultiObjective using Evolutionary Algorithms (2) -- Multi-Objective Optimization: 各种解释多目标
  2. SUN StorEdge 3320更改磁盘状态
  3. Python中知识点笔记
  4. vs显示堆栈数据分析_什么是“数据分析堆栈”?
  5. network怎么断点调试_Windows 网络编程:调试 API
  6. 计数方法应用于PTB数据集
  7. 容器编排技术 -- Kubernetes kubectl create service clusterip 命令详解
  8. poj 2255 Tree Recovery
  9. B4.Java web部分
  10. python day11
  11. C语言基础教程之递归
  12. quick code ide设置分辨率
  13. SCI论文写作常用表达整理
  14. 微信小程序开发工具下载及AppID查找
  15. librdkafka 封装的C++类
  16. matlab流体力学分析,matlab流体力学
  17. matlab zmax 光学仿真,基于ZEMAX的光栅干涉仪仿真
  18. 测试用例设计方法-思维导图
  19. 物联网+安防在智慧社区建设中的发展与深度应用
  20. C++模版与特化与偏特化

热门文章

  1. Vision Transformer在CV任务中的速度如何保证?
  2. 利用Google在线翻译引擎制作自己的多国语言翻译机
  3. 出现java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher错误
  4. 全屋智能方案与智能单品有什么区别?看完你就懂了
  5. 百度网盘BaiduYunCacheFileV0.db数据库研究
  6. 【真实用】将json数据转化为mysql表
  7. Mandiant对APT1组织的***行动的情报分析报告
  8. python手机代码编辑器_Python怎么打开代码编辑器
  9. 浅谈网页设计中的黄金分割
  10. Kindle 2.3发布了!