野火指南者(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驱动——虚拟机 虚拟串口 双机调试
=================================版权声明================================= 版权声明:原创文章 谢绝转载 请通过右侧公告中的“联系邮 ...
随机推荐
- Java面试——架构设计与分布式
更多内容,移步 IT-BLOG 一.用 Java 自己实现一个 LRU LRU(Least Recently Used:最近最少使用):简单的说,就是保证基本的 Cache容量,如果超过容量则必须丢掉 ...
- vue之混入(mixins)的使用方法
特点:1.方法和参数在各组件中不共享 2.值为对象的选项,如methods,components等,选项会被合并,键冲突的组件会覆盖混入对象的 混入对象中的方法 3.值为函数的选项,如created, ...
- SpringBoot进阶教程(七十五)数据脱敏
无论对于什么业务来说,用户数据信息的安全性无疑都是非常重要的.尤其是在数字经济大火背景下,数据的安全性就显得更加重要.数据脱敏可以分为两个部分,一个是DB层面,防止DB数据泄露,暴露用户信息:一个是接 ...
- 明解STM32—GPIO理论基础知识篇之寄存器原理
一.前言 在之前的STM32的GPIO理论基础知识中,分别对基本结构和工作模式进行了详细的介绍.GPIO基本结构中主要对GPIO内部的各个功能电路逐一的进行的分析:GPIO工作模式中主要介绍GPI ...
- JVM的垃圾收集算法
介绍分代收集理论和几种垃圾收集算法的思想及其发展过程. 分代收集理论 当前商业虚拟机的垃圾收集器,大多数都遵循了 "分代收集"(Generational Collection)的理 ...
- 一个 OpenTiny,Vue2 Vue3 都支持!
大家好,我是 Kagol,OpenTiny 开源社区运营,TinyVue 跨端.跨框架组件库核心贡献者,专注于前端组件库建设和开源社区运营. 今天给大家介绍如何同时在 Vue2 和 Vue3 项目中使 ...
- SSL CA 证书生成shell
gencert ssl证书生成 要保证Web浏览器到服务器的安全连接,HTTPS几乎是唯一选择.HTTPS其实就是HTTP over SSL,也就是让HTTP连接建立在SSL安全连接之上. SSL使用 ...
- 创建SVN和设置密码以及SVN自动更新
重新创建版本库: svnadmin create /usr/local/svn/month_exam //创建一个svn版本仓库month_exam(month_exam可以随便起名字) cd ...
- FreeSWITCH添加iLBC编码及转码
操作系统 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 一.安装ilbc库 从第三方库里下载指定版本: git clone https://freeswitch.org/s ...
- Java学习笔记04
1. 循环进阶 1.1 无限循环 概念 循环一直停不下来,又叫死循环. for格式 for (;;) { 循环语句; } while格式 while (true) { 循环语句; } do...w ...