实用指南:STM32H743-ARM例程25-USB_VCP

实验平台

硬件:银杏科技GT7000双核心开发板-ARM-STM32H743XIH6,银杏科技iToolXE仿真器
软件:最新版本STM32CubeH7固件库STM32CubeMX v6.10.0,开发板环境MDK v5.35,串口工具UartAssit

USB虚拟串口简介

  USB虚拟串口,简称VCP,是VirtualCOMPort的简写,它是利用USB的CDC类来实现的一种通信接口。
  USB虚拟串口属于USB通信设备类。在物理层通过USB总线,采用虚拟串口的方式为主机提供一个物理串口。在系统内部,USB控制器提供了一个批量传输IN端点和一个批量传输的OUT端点,用于数据的接收和发送,模拟串口的RX和TX线。另外USB控制器还提供中断IN端点,发送当前串口的状态,实现对串口传输的控制。串口设备的数据,由系统的串口采集,在芯片内完成USB包的封装,通过USB总线上传至主机,再由相应的串口应用程序进行处理。对用户来说,看到的是基于串口的数据采集和传输,而实际上实现的是基于USB协议包的数据传输。
  我们可以利用STM32自带的USB功能,来实现一个USB虚拟串口,从而通过USB,实现电脑与STM32的数据互传。上位机无需编写专门的USB程序,只需要一个串口调试助手即可调试,非常实用。
  本实验利用STM32自带的USB功能,连接电脑USB,虚拟出一个USB串口,实现电脑和开发板的数据通信。

USB CDC协议简介

  在前面章节STM32H743-ARM例程22-USB_CDC我们详细介绍过CDC通信协议,有兴趣的读者可以阅读前面章节
  本小节我们来介绍下实验流程
  主要修改usbd_cdc_if.c和main.c,会使用这四个函数,就可以用单片机与PC进行USB基本通信:
(1) CDC_Control_FS()
  来自主机请求的回调函数;CDC控制命令处理,列举了主机有可能向设备发送的一些命令。没有具体的处理过程,需要用户自己编写。其中包括串口参数的设置,要做串口转USB通信的话需要修改这里。只是为了用USB与PC通信则不用管这里。每个命令具体的意思需要查询CDC类手册。
(2) CDC_Receive_FS()
  接收数据回调函数;Buf为接收缓存。这个缓存实际上就是CDC_Init_FS()中设置的UserRxBufferFS[]数组。这个全局数组的定义在usbd_cdc_if.c文件中。Len为接收到数据的长度。这个变量不是全局的,需要用户声明变量把这个传出去。
(3) CDC_Transmit_FS()
  用来发送数据。
(4)CDC_TransmitCplt_FS()
  回调函数。

实验程序

1. 主函数

int main(void)
{
MPU_Config();
SystemClock_Config();
MX_GPIO_Init();
MX_USB_DEVICE_Init();
while (1)
{
len=sprintf(USB_TxBuf,"Hello! I am GT7000!\r\n");
CDC_Transmit_HS((uint8_t*)USB_TxBuf,len); //用来发送数据
HAL_Delay(1000);
}
}

2. CDC_Control_FS()函数

static int8_t CDC_TransmitCplt_HS(uint8_t *Buf, uint32_t *Len, uint8_t epnum)
{
uint8_t result = USBD_OK;
UNUSED(Buf);
UNUSED(Len);
UNUSED(epnum);
return result;
}

3. USB_printf函数,方便直接输出字符串

#include <stdarg.h>
  void usb_printf(const char *format, ...)
  {
  va_list args;
  uint32_t length;
  va_start(args, format);
  length = vsnprintf((char *)UserTxBufferHS, APP_TX_DATA_SIZE, (char *)format, args);
  va_end(args);
  CDC_Transmit_HS(UserTxBufferHS, length);
  }

实验现象

在这里插入图片描述

posted @ 2026-02-01 21:49  yangykaifa  阅读(0)  评论(0)    收藏  举报