首页 > 其他分享 >野火指南者(STM32F103VET6)应用:实现USB虚拟串口(CDC_VPC)

野火指南者(STM32F103VET6)应用:实现USB虚拟串口(CDC_VPC)

时间:2023-06-06 17:15:08浏览次数:45  
标签:BEGIN CODE END USB CDC USER 串口 GPIO

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那样使用了,实测过是正常的!

 

时代越来越好,开发效率越来越高,希望能帮助到你!!!

还有就是,开源万岁。 

标签:BEGIN,CODE,END,USB,CDC,USER,串口,GPIO
From: https://www.cnblogs.com/couvrir/p/17461078.html

相关文章

  • 8种品牌PLC单片机实现自由格式协议串口通信主站视频教程
    8种品牌PLC单片机实现自由格式协议串口通信主站视频教程一、罗克韦尔ABMicro850​系列PLC实现自由格式协议串口通信主站视频教程:罗克韦尔ABMicro850系列PLC做ASCII串口通信主站、串口调试助手做从站,程序实现PLC和串口调试助手相互发送和接收8个字节数据功能,视频详细讲解了ASCII......
  • 8种品牌PLC单片机实现自由格式协议串口通信从站视频教程
    8种品牌PLC单片机实现自由格式协议串口通信从站视频教程一、罗克韦尔ABMicro850​系列PLC实现自由格式协议串口通信从站视频教程:罗克韦尔ABMicro850系列PLC做ASCII串口通信从站、串口调试助手做主站,程序实现PLC和串口调试助手相互发送和接收8个字节数据功能,视频详细讲解了ASCII......
  • Spyglass的CDC检查
    接着前面Lint检查之后需要对RTL进行CDC检查,以下是简单的步骤。1.在完成lint检查后,也就是确保没有语法错误之后,点击GoalSetup,然后勾选主窗口下cdc_setup_check,然后点击RunGoal(s) ,当运行完成,会自动弹出AnalyzeResult窗口。2.得到分析结果后,cdc/cdc_setup_check......
  • Linux 下串口驱动头文件之tty.h
    linux-2.6.29/include/linux#ifndef_LINUX_TTY_H#define_LINUX_TTY_H/**'tty.h'definessomestructuresusedbytty_io.candsomedefines.*/#ifdef__KERNEL__#include<linux/fs.h>#include<linux/major.h>#include<linux/termi......
  • Linux 下串口驱动头文件之termios.h
    在linux-2.6.29/include/asm-generic下的termios.h/*termios.h:generictermios/termiousercopying/translation*/#ifndef_ASM_GENERIC_TERMIOS_H#define_ASM_GENERIC_TERMIOS_H#include<asm/uaccess.h>#ifndef__ARCH_TERMIO_GETPUT/**Translatea"t......
  • Flink CDC
    第1章CDC简介1.1什么是CDCCDC是ChangeDataCapture(变更数据获取)的简称。核心思想是,监测并捕获数据库的变动(包括数据或数据表的插入、更新以及删除等),将这些变更按发生的顺序完整记录下来,写入到消息中间件中以供其他服务进行订阅及消费。1.2CDC的种类CDC主要分为基于查询......
  • 关于荣耀X40打开USB调试之后仍然无法连接adb
    解决方案:1-打开开发者选项关于手机-多次点击版本号-提示您正处于开发者选项模式2-进入系统和更新-点击开发人员选项-开启USB调试备注:此时输出adbdevices可能无法连接,需要进一步进行设置3-选择USB配置,勾选RNDIS(USB以太网),会弹出......
  • 解决串口接收数据不完整
    C#解决串口接收数据不完整1. 使用缓存机制完成:首先通过定义一个成员变量List<byte>buffer=newList<byte>(4096);用来存放所有的数据,在接收函数里,通过buffer.AddRange()方法不断将接收到的数据加入到buffer中,并同时对buffer的数据进行校验,如果达到一定的长度并且校验结果正......
  • 串口(PL011)在Linux启动运行过程中扮演的角色
    关键词:PL011、earlyprintk、AMBA、UART、tty、console等等。串口虽然是一种简单的工具,但是在Linux启动、运行、调试中扮演了重要角色。其稳定、易用、高效(某些场景)。串口依赖的模块少,在FPGA初期调试中扮演重要角色。往往是CPU基本功能可用后,即可使能串口进行功能调试。下面记......
  • 38 KVM管理设备-管理虚拟机USB
    38KVM管理设备-管理虚拟机USB为了方便在虚拟机内部使用USBkey设备、USB海量存储设备等USB设备,openEuler提供了USB设备直通的功能。用户可以通过USB直通和热插拔相关接口给虚拟机配置直通USB设备、或者在虚拟机处于运行的状态下热插/热拔USB设备。38.1配置USB控制器38.1.1概述......