使用STM32CubeMX把USB配置成虚拟串口(virtual com port)
应用场景:
本次在项目中,由于对方的上位机软件比较老旧。
该软件只能通过串口通讯。而我们的设备只引出了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)相关推荐
- STM32 USB 虚拟串口 Virtual COM Port
简单粗暴,直接上操作 第一步,设备接口中的USB,完全默认即可: 第二步,配置中间件中的"USB_DEVICE". 然后生成代码. 在要使用虚拟串口发送数据的模块文件内,要包含发送 ...
- vspd 虚拟串口 Virtual Serial Port Driver 7.2+破解补丁
安装说明: Virtual Serial Port Driver 7.2英文版 1.运行vspd.exe安装软件. 2.复制vspdctl.dll到安装目录,覆盖原文件. 3.启动vspdconfig ...
- USB转串口与虚拟串口相关
不是原创,网上查询整理. 目录 一.串口与并口 二.USB转串口.虚拟串口概念 三.串口占用问题 四.其他:多个程序共享一个串口数据 五.COM.COM+和DCOM与COM端口无关 一.串口与并口 ( ...
- STM32 USB复合设备(VCP虚拟串口+HID键盘)详解
USB复合设备 介绍 USB复合设备与组合设备区别 USB描述符修改 修改CustomHID_Reset 修改CustomHID_Data_Setup 介绍 本次使用的是Keil 5+STM32F10 ...
- USB协议学习笔记 - 虚拟串口Virtual Port Com LED控制
前言 STM32 的USB 可以虚拟成一个串口,功能还挺强,感觉比HID好用 这里使用USB 虚拟的串口,做个控制LED的小程序 控制LED这里使用自定义的AT命令方式,如红灯亮:AT+LEDR_ON ...
- USB协议学习笔记 - 虚拟串口Virtual Port Com用于LOG打印
前言 上一篇讲了STM32 USB 虚拟串口的功能实现,可以通过STM32输出信息到PC端 这篇简单的做个应用:打印LOG(日志)信息到虚拟串口 操作方法 基于上篇的STM32 USB Virtual ...
- STM32F107——OTG模块之USB设备之虚拟串口移植(四)
第一次移植的时候,可能由于对这个USB库还是太了解,可能改动了底层的我一个关键值,当移植完成之后,在测试的过程发现,总是会出现某一次的数据只发送了一小段,而剩下的部分只有在我再次获取的时候会被发送,且 ...
- STM32 USB使用记录:使用CDC类虚拟串口(VCP)进行通讯
文章目录 目的 基础说明 使用STM32CubeIDE配置生成代码 用户代码分析 回环测试 串口参数设置 USB HS使用与演示 通讯速率测试 测试代码 USB FS测试 USB HS测试 影响速度的 ...
- vsport 虚拟串口 控件 Virtual Serial Port ActiveX注册码
使用VSport.dll 开发了虚拟串口工具 在开发电脑上 安装好驱动后 可以运行 正常创建虚拟串口 Virtual Serial Port ActiveX 提供 vsport注册码,该注册码可以正常 ...
最新文章
- 阅读Book: MultiObjective using Evolutionary Algorithms (2) -- Multi-Objective Optimization: 各种解释多目标
- SUN StorEdge 3320更改磁盘状态
- Python中知识点笔记
- vs显示堆栈数据分析_什么是“数据分析堆栈”?
- network怎么断点调试_Windows 网络编程:调试 API
- 计数方法应用于PTB数据集
- 容器编排技术 -- Kubernetes kubectl create service clusterip 命令详解
- poj 2255 Tree Recovery
- B4.Java web部分
- python day11
- C语言基础教程之递归
- quick code ide设置分辨率
- SCI论文写作常用表达整理
- 微信小程序开发工具下载及AppID查找
- librdkafka 封装的C++类
- matlab流体力学分析,matlab流体力学
- matlab zmax 光学仿真,基于ZEMAX的光栅干涉仪仿真
- 测试用例设计方法-思维导图
- 物联网+安防在智慧社区建设中的发展与深度应用
- C++模版与特化与偏特化
热门文章
- Vision Transformer在CV任务中的速度如何保证?
- 利用Google在线翻译引擎制作自己的多国语言翻译机
- 出现java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher错误
- 全屋智能方案与智能单品有什么区别?看完你就懂了
- 百度网盘BaiduYunCacheFileV0.db数据库研究
- 【真实用】将json数据转化为mysql表
- Mandiant对APT1组织的***行动的情报分析报告
- python手机代码编辑器_Python怎么打开代码编辑器
- 浅谈网页设计中的黄金分割
- Kindle 2.3发布了!