野火指南者(STM32F103VET6)应用:实现USB虚拟串口(CDC_VPC)
MCU:STM32F103VET6
开发环境:STM32CubeMX+MDK5
实现USB的虚拟串口不需要去理解USB的底层驱动,只需要STM32CubeMX去配置生成工程即可。在野火的指南者中,是没有这一类的视频和示例的,博主使用这款开发板实现USB虚拟串口。
首先需要打开STM32CubeMX工具。输入开发板MCU对应型号,找到开发板对应封装的MCU型号,双击打开(图中第三)。

此时,双击完后会关闭此界面,然后打开一个新界面。

然后,我们开始基本配置。

现在我们选择一个LED作为系统LED,该步骤可以忽略,只是本人喜欢这样子。以硬件原理图的绿灯为例子。

基本配置除了时钟树外,基本上已经配置好了。
现在来配置USB_Device。STM32F1系列USB只支持USB_Device。

选中USB类型后,还需要细化其中的类型。

一切配置都是基于硬件原理图的。硬件配置除常规配置外,还是需要看硬件原理图的。在硬件原理图中,可以看到只有PD6拉低时,USB才使能。(针对野火指南者开发板)

现在配置时钟树

配置完成,完善工程,生成工程。

到此,STM32CubeMX工具的使用结束!可以发现在桌面已经生成了USB_VPC工程。
USB虚拟串口还需要装驱动才能被是识别到,在Win7、Win8机型PC中需要到ST官网下载。win10及以上机型在本地已有驱动,无需安装。
使用MDK5打开USB_VPC工程打开。点击魔法棒,勾选微库。选择对应的下载器,勾选下载完复位允许。USB线一端接开发板USB_Device,一端接PC。

现在可以开始实验了,实现VPC的发送与回传,并重定向printf函数。
在此之前,简单描述一下生成的USB文件以及重要函数。

然后再插播一条,看帖子说是,刚下载完程序时,是识别不出端口的。需要在上电的情况下从PC那拔插一次USB线。然后可以使用一个函数解决这个问题。可以在gpio.c中写入函数,然后记得在头文件声明。使用要在MX_USB_DEVICE_Iint()之前。
(我没遇到这个问题,但是我还是放到工程了,但是我没用这函数。)
1 /* USER CODE BEGIN 2 */
2 /*USB 重新枚举函数*/
3 void USB_Reset(void)
4 {
5 GPIO_InitTypeDef GPIO_InitStruct = {0};
6
7 __HAL_RCC_GPIOA_CLK_ENABLE();
8
9 GPIO_InitStruct.Pin = GPIO_PIN_12;
10 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
11 GPIO_InitStruct.Pull = GPIO_NOPULL;
12 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
13 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
14
15 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_RESET);
16 HAL_Delay(100);
17 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_SET);
18 }
19 /* USER CODE END 2 */
实验环节:发送与回传
在main.c中(截取片段,修改部分)
1 /* Private includes ----------------------------------------------------------*/
2 /* USER CODE BEGIN Includes */
3 #include "usbd_cdc_if.h"
4 /* USER CODE END Includes */
5
6 /* Private typedef -----------------------------------------------------------*/
7 /* USER CODE BEGIN PTD */
8
9 /* USER CODE END PTD */
10
11 /* Private define ------------------------------------------------------------*/
12 /* USER CODE BEGIN PD */
13 /* USER CODE END PD */
14
15 /* Private macro -------------------------------------------------------------*/
16 /* USER CODE BEGIN PM */
17
18 /* USER CODE END PM */
19
20 /* Private variables ---------------------------------------------------------*/
21
22 /* USER CODE BEGIN PV */
23
24 /* USER CODE END PV */
25
26 /* Private function prototypes -----------------------------------------------*/
27 void SystemClock_Config(void);
28 /* USER CODE BEGIN PFP */
29
30 /* USER CODE END PFP */
31
32 /* Private user code ---------------------------------------------------------*/
33 /* USER CODE BEGIN 0 */
34
35 /* USER CODE END 0 */
36
37 /**
38 * @brief The application entry point.
39 * @retval int
40 */
41 int main(void)
42 {
43 /* USER CODE BEGIN 1 */
44 char str[] = "Hello World!\r\n";
45 /* USER CODE END 1 */
46
47 /* MCU Configuration--------------------------------------------------------*/
48
49 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
50 HAL_Init();
51
52 /* USER CODE BEGIN Init */
53
54 /* USER CODE END Init */
55
56 /* Configure the system clock */
57 SystemClock_Config();
58
59 /* USER CODE BEGIN SysInit */
60 // USB_Reset();
61 /* USER CODE END SysInit */
62
63 /* Initialize all configured peripherals */
64 MX_GPIO_Init();
65 MX_USB_DEVICE_Init();
66 /* USER CODE BEGIN 2 */
67
68 /* USER CODE END 2 */
69
70 /* Infinite loop */
71 /* USER CODE BEGIN WHILE */
72 while (1)
73 {
74 /* USER CODE END WHILE */
75 CDC_Transmit_FS((uint8_t*)str, 14);
76 HAL_Delay(2000);
77 /* USER CODE BEGIN 3 */
78 }
79 /* USER CODE END 3 */
80 }
在usbd_cdc_if.c中(截取片段,修改部分)
1 /**
2 * @brief Data received over USB OUT endpoint are sent over CDC interface
3 * through this function.
4 *
5 * @note
6 * This function will issue a NAK packet on any OUT packet received on
7 * USB endpoint until exiting this function. If you exit this function
8 * before transfer is complete on CDC interface (ie. using DMA controller)
9 * it will result in receiving more data while previous ones are still
10 * not sent.
11 *
12 * @param Buf: Buffer of data to be received
13 * @param Len: Number of data received (in bytes)
14 * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
15 */
16 static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
17 {
18 /* USER CODE BEGIN 6 */
19 CDC_Transmit_FS(Buf, *Len);
20
21 USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
22 USBD_CDC_ReceivePacket(&hUsbDeviceFS);
23 return (USBD_OK);
24 /* USER CODE END 6 */
25 }
实验结果(波特率随意选)

实验环节:打印重定向
在usbd_cdc_if.c中(截取片段,修改部分),声明在usbd_cdc_if.h文件。
1 /* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */
2 #include "stdarg.h"
3 #include "stdio.h"
4
5 uint8_t usbtemp[64];
6 void usbvcom_printf(const char *format,...)
7 {
8 uint16_t len;
9 va_list args;
10
11 va_start(args, format);
12 len = vsnprintf((char *)usbtemp, sizeof(usbtemp)+1, (char *)format, args);
13 va_end(args);
14
15 CDC_Transmit_HS(usbtemp, len);
16 }
17
18 /* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */
然后就可以像printf那样使用了,实测过是正常的!
时代越来越好,开发效率越来越高,希望能帮助到你!!!
还有就是,开源万岁。
野火指南者(STM32F103VET6)应用:实现USB虚拟串口(CDC_VPC)的更多相关文章
- STM32 USB虚拟串口(转)
源:STM32 USB虚拟串口 串口调试在项目中被使用越来越多,串口资源的紧缺也变的尤为突出.很多本本人群,更是深有体会,不准备一个USB转串口工具就没办法进行开发.本章节来简单概述STM32低端芯片 ...
- STM32 USB虚拟串口
串口调试在项目中被使用越来越多,串口资源的紧缺也变的尤为突出.很多本本人群,更是深有体会,不准备一个USB转串口工具就没办法进行开发.本章节来简单概述STM32低端芯片上的USB虚拟串口的移植.在官方 ...
- STM32CUBEF4 实现USB 虚拟串口
一.stm32cubemx 生成工程后USB转串口出现黄色感叹号的问题 如下图所示,在stm32cubemx工程中选择usb转串口功能Communication Device Class (Virtu ...
- STM32F103 USB虚拟串口 驱动例程移植
1)驱动下载及安装.目前ST公司支持WIN7版本号为:VCP_V1.3.1_Setup.exe (在官网上搜索stsw-stm32102即是了):先安装驱动后再插入USB不然安装不成功. 2)固件下载 ...
- USB虚拟串口通信
https://blog.csdn.net/errorhai/article/details/85333914
- USB虚拟串口 使用基于stm32的RT-Thread
参考我的RT Thread论坛文章 https://www.rt-thread.org/qa/thread-422644-1-1.html
- 1900型USB接口扫描枪设置虚拟串口模式提升扫描速度
在使用扫描枪的过程中,发现扫描二维码速度比较慢,不到100个字符,花了大概2-3秒的时间才完成显示,这个速度不能忍受啊.通过度娘,说是可以将USB键盘模式接收字符转换成虚拟串口接收,这样可以大大提高速 ...
- 上位机用USB做虚拟串口,总算抓到一个纯代码的总结了,没有坑的完美解决。
用libUSB来实现自己的驱动+下位机理论速度.=1M字节每秒. 达到极限速度 WINDOWS已经自带虚拟串口驱动,只不过还需要一个Inf文件 方法1:直接下载一个串口inf,来修改文件. 方 ...
- linux虚拟串口及远程访问
1. 虚拟终端概念 linux中有很多终端,如下简单介绍下各种终端或串口的概念. 1.1 tty:终端设备的统称 tty是Teletype或TeletypeWriter的缩写,中文翻译为电传打字机.电 ...
- Windows驱动——虚拟机 虚拟串口 双机调试
=================================版权声明================================= 版权声明:原创文章 谢绝转载 请通过右侧公告中的“联系邮 ...
随机推荐
- Centos7安装配置MySQL 5.6
Centos7安装配置MySql 5.6 首先下载MySql5.6的安装包,具体安装方式分为yum安装与离线安装.在新版本的CentOS7中,默认的数据库已更新为了Mariadb,而非 MySQL. ...
- selenium验证码处理-获取验证码图片二进流数据转成原图保存
1.因为视频的作者给的代码不完整,只有核心部分的代码. 2.视频作者示例使用的第三方破解12306的脚本网页(失效了) 所以本人无法复现,此次截取部分代码作为理解核心意思(思想方法最重要) 1.面向对 ...
- ChatGPT 与 Midjourney 强强联手,让先秦阿房宫重现辉煌!
Midjourney 是一款非常特殊的 AI 绘画聊天机器人,它并不是软件,也不用安装,而是直接搭载在 Discord 平台之上,所有的功能都是通过调用 Discord 的聊天机器人程序实现的.要想使 ...
- [数据库/ORALCE]导入/导出数据
ORACLE数据导入/导出 工具介绍:EXP/IMP | EXPDP/IMPDP EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用. EXPDP和IMPDP是服务端的工具程序 ...
- 开源项目audioFlux: 针对音频领域的深度学习工具库
目录 时频变换 频谱重排 倒谱系数 解卷积 谱特征 音乐信息检索 audioFlux是一个Python和C实现的库,提供音频领域系统.全面.多维度的特征提取与组合,结合各种深度学习网络模型,进行音频领 ...
- Java设计模式 —— 单例模式
6 单例模式 6.1 单例模式概述 Singleton Patter:确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例. 单例模式有3个要点: 该类只能有一个实例 该类必须自行创建这个实 ...
- 升级:In-Place Upgrade升级MySQL5.6.26
升级需谨慎,事前先备份 MySQL升级的实质是对数据字典的升级,数据字典有:sys.mysql.information_schema.performance_schema . MySQL升级的两种方式 ...
- Semantic Kernel 入门系列:🥑Memory内存
了解的运作原理之后,就可以开始使用Semantic Kernel来制作应用了. Semantic Kernel将embedding的功能封装到了Memory中,用来存储上下文信息,就好像电脑的内存一样 ...
- RDIFramework.NET开发框架在线表单设计整合工作流程的使用
1.概述 在RDIFramework.NET开发框架在线表单设计助力可视化快速开发文章中,我们介绍了不使用编码的方式进行表单的在线设计并挂接在对应的模块下,加速应用的落地与实现.同样,通过在线设计的表 ...
- 用 Gaussian Process 建模 state-action 空间相关性,加速 Multi-Fidelity RL
目录 全文快读 1 intro 3 背景 4 method 4.1 model-based 算法:GP-VI-MFRL 4.2 model-free 算法:GPQ-MFRL 5 experiment ...