野火指南者(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驱动——虚拟机 虚拟串口 双机调试
=================================版权声明================================= 版权声明:原创文章 谢绝转载 请通过右侧公告中的“联系邮 ...
随机推荐
- 通知短信 API 接入全流程(超详细整理)
随着移动互联网和智能手机的普及,短信成为了一种便捷.快速且有效的通信方式,尤其在向用户发送重要信息或提醒方面具有很大的优势. 本文将会深入探讨如何在程序中接入通知短信 API 实现短信通知功能,此外, ...
- H5 visibilityChange事件 --- 监听页面的显示或者隐藏 新开一个webview
mounted() { document.addEventListener('visibilityChange', 事件处理函数) }, destoryed() { document.removeEv ...
- window计时器函数
// 定时器: // 计时器 // 开启:setInterval() // 参数1:回调函数 // 参数2:毫秒数 // 功能:每个指定的毫秒数执行一次回调函数 demo: var t = setIn ...
- 如何在 SpringBoot 项目中接入 ChartGPT
大家好,我是公子骏.最近体验了火爆全网的 ChartGPT,深刻体会了其强大的能力,这让我们程序猿对AI的未来突然有了广大的畅想空间. 我也在网上看到不少大牛通过 ChartGPT 来获取收益,就寻思 ...
- 内网搭建DNS服务器
DNS:Domain Name Service,域名解析服务 监听端口:udp/53,tcp/53 应用程序:bind 根域:. 一级域: 组织域:.com, .org, .net, .mil, .e ...
- Python3.8环境安装PyHook3
Python3.8环境安装PyHook3 1. 安装python对应版本的pyhook3网 址:https://pypi.org/project/PyHook3/#files如果没有对应版本,请下载 ...
- 【树莓派】Docker安装calibre-web搭建在线书城
一.下载docker镜像 sudo docker pull johngong/calibre-web 二.创建calibre-web镜像的映射目录,存放配置文件&书籍 mkdir /home/ ...
- odoo 开发入门教程系列-模块交互
模块交互 在上一章中,我们使用继承来修改模块的行为.在我们的房地产场景中,我们希望更进一步,能够为客户生成发票.Odoo提供了一个开发票模块,因此直接从我们的房地产模块创建发票是很简单的,也就是说,一 ...
- CVE-2015-5254漏洞复现
1.漏洞介绍. Apache ActiveMQ 是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持 Java 消息服务,集群,Spring Framework 等.Apache ...
- C# 禁用窗口激活
如果界面点击时,不想让窗口激活,可以按如下操作: 1 public MainWindow() 2 { 3 InitializeComponent(); 4 SourceInitialized += O ...