STM32F1与STM32CubeIDE快速入门-USB虚拟串口(CDC)

USB虚拟串口(CDC)

文章目录

STM32F1 USB外设实现了USB2.0全速总线和APB1总线间的接口。USB 提供的串行接口,具有以下特点:

  • 1)简单性和灵活性(即插即用);
  • 2)双向性;
  • 3)提高速度;
  • 4)低成本。

STM32F103自带的USB符合USB2.0规范。但是STM32F1的USB只支持作为设备,不能作为主机。

本文将详细介绍如何使用STM32CubeIDE中如何配置USB虚拟串口。

1、USB虚拟串口配置

STM32CubeIDE创建工程、系统配置、调试配置,在这里不再做介绍,请参考:

1)开启USB功能

在这里插入图片描述

2)配置USB时钟

在这里插入图片描述

3)USB上拉引脚配置

STM32F1的USB符合USB2.0规范,本实例使用的USB硬件接线如下,其中引脚PC13作为USB的上拉引脚,需要配置。

在这里插入图片描述

上拉引脚配置如下:

在这里插入图片描述

注意:如果没有配置上拉引脚,上位机将不会识别USB设备。请根据所使用的开发板或设计需求配置。

4)配置USB串口功能

在这里插入图片描述

5)配置系统堆栈

默认堆栈大小可能不能满足USB虚拟串口使用需求,因此需要调整。设置如下:

在这里插入图片描述

最后,保存配置,并生成代码。

在这里插入图片描述

2、USB虚拟串口驱动实现

下面实现USB虚拟串口回环测试功能。

1)虚拟串口回环测试功能实现

文件usbd_cdc_if_.husbd_cdc_if.c文件为USB虚拟串口实现代码。实现虚拟串口回环测试功能,只需要在usbd_cdc_if.c文件中的CDC_Receive_FS函数中,添加如下代码:

1
2
3
4
5
6
7
8
9
10
static int8\_t CDC\_Receive\_FS(uint8\_t\* Buf, uint32\_t \*Len)
{
/\* USER CODE BEGIN 6 \*/
USBD\_CDC\_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
USBD\_CDC\_ReceivePacket(&hUsbDeviceFS);
CDC\_Transmit\_FS(Buf, \*Len);
return (USBD_OK);
/\* USER CODE END 6 \*/
}

CDC_Receive_FS函数添加:

1
2
CDC\_Transmit\_FS(Buf, \*Len);

即,将接收到的数据,直接发送回去。

2)主程序

main.c文件中添加如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/\* Private includes ----------------------------------------------------------\*/
/\* USER CODE BEGIN Includes \*/
#include <stdio.h>
#include "usbd\_cdc.h"
#include "usbd\_cdc\_if.h"
#include "usb\_device.h"
/\* USER CODE END Includes \*/

/\* USER CODE BEGIN PV \*/
uint8\_t buffer[] = "Hello, World!\r\n";
/\* USER CODE END PV \*/

int main(void)
{
/\* USER CODE BEGIN 1 \*/

/\* USER CODE END 1 \*/

/\* MCU Configuration--------------------------------------------------------\*/

/\* Reset of all peripherals, Initializes the Flash interface and the Systick. \*/
HAL\_Init();

/\* USER CODE BEGIN Init \*/

/\* USER CODE END Init \*/

/\* Configure the system clock \*/
SystemClock\_Config();

/\* USER CODE BEGIN SysInit \*/

/\* USER CODE END SysInit \*/

/\* Initialize all configured peripherals \*/
MX\_GPIO\_Init();
MX\_USB\_DEVICE\_Init();
/\* USER CODE BEGIN 2 \*/
// USB上拉引脚,设置低电平,开启虚拟串口
HAL\_GPIO\_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
/\* USER CODE END 2 \*/

/\* Infinite loop \*/
/\* USER CODE BEGIN WHILE \*/
while (1) {
/\* USER CODE END WHILE \*/

/\* USER CODE BEGIN 3 \*/
CDC\_Transmit\_FS(buffer, sizeof(buffer));
HAL\_Delay(1000);
}
/\* USER CODE END 3 \*/
}

注意:在USB设备初始化完成后,必须将USB上拉引脚设置为低电平,否则上位将无法识别USB

1
2
3
// USB上拉引脚,设置低电平,开启虚拟串口
HAL\_GPIO\_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);

3、运行结果

在这里插入图片描述

4、STM32F1与STM32CubeIDE系列文章

4.1 STM32F1与STM32CubeIDE快速入门

4.2 STM32F1与STM32CubeIDE编程实例

文章来源: https://iotsmart.blog.csdn.net/article/details/124766631