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)的更多相关文章

  1. STM32 USB虚拟串口(转)

    源:STM32 USB虚拟串口 串口调试在项目中被使用越来越多,串口资源的紧缺也变的尤为突出.很多本本人群,更是深有体会,不准备一个USB转串口工具就没办法进行开发.本章节来简单概述STM32低端芯片 ...

  2. STM32 USB虚拟串口

    串口调试在项目中被使用越来越多,串口资源的紧缺也变的尤为突出.很多本本人群,更是深有体会,不准备一个USB转串口工具就没办法进行开发.本章节来简单概述STM32低端芯片上的USB虚拟串口的移植.在官方 ...

  3. STM32CUBEF4 实现USB 虚拟串口

    一.stm32cubemx 生成工程后USB转串口出现黄色感叹号的问题 如下图所示,在stm32cubemx工程中选择usb转串口功能Communication Device Class (Virtu ...

  4. STM32F103 USB虚拟串口 驱动例程移植

    1)驱动下载及安装.目前ST公司支持WIN7版本号为:VCP_V1.3.1_Setup.exe (在官网上搜索stsw-stm32102即是了):先安装驱动后再插入USB不然安装不成功. 2)固件下载 ...

  5. USB虚拟串口通信

    https://blog.csdn.net/errorhai/article/details/85333914

  6. USB虚拟串口 使用基于stm32的RT-Thread

    参考我的RT Thread论坛文章 https://www.rt-thread.org/qa/thread-422644-1-1.html

  7. 1900型USB接口扫描枪设置虚拟串口模式提升扫描速度

    在使用扫描枪的过程中,发现扫描二维码速度比较慢,不到100个字符,花了大概2-3秒的时间才完成显示,这个速度不能忍受啊.通过度娘,说是可以将USB键盘模式接收字符转换成虚拟串口接收,这样可以大大提高速 ...

  8. 上位机用USB做虚拟串口,总算抓到一个纯代码的总结了,没有坑的完美解决。

    用libUSB来实现自己的驱动+下位机理论速度.=1M字节每秒. 达到极限速度   WINDOWS已经自带虚拟串口驱动,只不过还需要一个Inf文件 方法1:直接下载一个串口inf,来修改文件.   方 ...

  9. linux虚拟串口及远程访问

    1. 虚拟终端概念 linux中有很多终端,如下简单介绍下各种终端或串口的概念. 1.1 tty:终端设备的统称 tty是Teletype或TeletypeWriter的缩写,中文翻译为电传打字机.电 ...

  10. Windows驱动——虚拟机 虚拟串口 双机调试

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  请通过右侧公告中的“联系邮 ...

随机推荐

  1. AlphaFold2中的残基刚体表示

    技术背景 在前面的这一篇博客中,比较全面的介绍了组成蛋白质的各种氨基酸的三维结构.由于每个氨基酸大小不一,在传统的蛋白质折叠预测的方案中,一般会考虑全原子方案或者是粗粒化方案.对于全原子方案而言,即时 ...

  2. 选择KV数据库最重要的是什么

    本文分享自华为云社区<选择KV数据库最重要的是什么?>,作者:GaussDB 数据库 . 经常有客户提到KV数据库,但却偏偏"不要Redis".比如有个做安全威胁分析平 ...

  3. dart基础---->单例singleton

    At least, there are three ways to create the singleton object with dart. 1. factory constructor clas ...

  4. 一次对pool的误用导致的.net频繁gc的诊断分析

    (最近有读者朋友表示,希望能加一些示意图来描述分析过程中用到的原理知识.好的,之后我会注意,谢谢这位读者) 背景 有位朋友找我,希望我能帮看一下他的一个service.从他的描述看,并没有资源方面的泄 ...

  5. JetBrains 2022全家桶-激活

    ## JetBrains 全家桶 激活教程 https://tech.souyunku.com/?page_id=50199

  6. fastjson很好,但不适合我

    记者:大爷您有什么特长呀? fastjson:我很快. 记者:23423乘以4534等于多少? fastjson:等于2343. 记者:?? fastjson:你就说快不快吧! 这个略显马丽苏的标题, ...

  7. 基于SqlSugar的开发框架循序渐进介绍(25)-- 基于SignalR实现多端的消息通讯

    基于ASP.NET Core SignalR 可以实现客户端和服务器之间进行即时通信.本篇随笔介绍一些SignalR的基础知识,以及结合对SqlSugar的开发框架的支持,实现SignalR的多端处理 ...

  8. [MAUI]模仿微信“按住-说话”的交互实现

    @ 目录 创建页面布局 创建手势控件 创建TalkBox 创建动画 拖拽物动画 按钮激活动画 TalkBox动画 Layout动画 项目地址 .NET MAUI跨平台框架包含了识别平移手势的功能,在之 ...

  9. 绝对强大的三大linux指令:ar, nm, objdump

    前言 如果普通编程不需要了解这些东西,如果想精确控制你的对象文件的格式或者你想查看一下文件对象里的内容以便作出某种判断,刚你可以看一下下面的工具:objdump, nm, ar.当然,本文不可能非常详 ...

  10. [人脸活体检测] 论文:Searching Central Difference Convolutional Networks for Face Anti-Spoofing

    文章目录 Searching Central Difference Convolutional Networks for Face Anti-Spoofing 1 导读 2 简介 3 方法 中心差分卷 ...