描述

  • USB 的功能还是比较的复杂,这里主要了解USB CDC类(Communication Device Class)实现的虚拟串口 【Virtual Port Com】
  • 学习的思路依旧是先用起来,再去针对性的熟悉USB相关的协议
  • USB转串口,是的,本篇就是实现这个功能

平台搭建

  • STM32平台:STM32L475,当然其他的STM32系列拥有USB接口的依旧可以拿来验证
  • 这里使用 STM32CubeMX 快速搭建USB的学习环境
  • 这里主要为:USB Device, 选择USB组件:【Virtual Port Com】
    USB协议学习笔记 - CDC类虚拟串口Virtual Port Com_USB
  • 这里生成Keil MDK5的功能,不用改代码,就可以编译成功,下载到开发板,发现枚举了一个USB的虚拟串口出来

USB协议学习笔记 - CDC类虚拟串口Virtual Port Com_虚拟串口_02

USB协议学习笔记 - CDC类虚拟串口Virtual Port Com_STM32_03

功能验证

  • 既然是串口,我就使用串口助手,打开这个【虚拟串口】,发送数据,没响应,通过看代码,发现,接收串口数据的API为:usbd_cdc_if.c 中的:CDC_Receive_FS
  • 在:CDC_Receive_FS 函数打上【断点】,进入调试模式,看看是否可以接收到 PC端通过串口助手发送的串口数据

USB协议学习笔记 - CDC类虚拟串口Virtual Port Com_串口_04

  • 实测发现接收到了全局的数组:UserRxBufferFS 中了,并且,PC端波特率随便设置,发送的数据,都能正确的接收到

验证发送

  • 看代码,STM32端发送串口数据的函数为:CDC_Transmit_FS,这里不需要设置波特率之类的
#include "main.h"
#include "usb_device.h"
#include "usbd_cdc_if.h"

void SystemClock_Config(void);
static void MX_GPIO_Init(void);

#define VCP_BUF_MAX_LEN         128

void vcp_send_test(uint8_t ch)
{
    uint8_t temp_buf[VCP_BUF_MAX_LEN];
    for (uint16_t i = 0; i < VCP_BUF_MAX_LEN; i++)
    {
        temp_buf[i] = 0x41;
    }
    temp_buf[0] = ch;

    CDC_Transmit_FS(temp_buf, sizeof(temp_buf));
}

int main(void)
{
    uint8_t ch = 0x00;
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_USB_DEVICE_Init();

    while (1)
    {
        HAL_Delay(5000);
        vcp_send_test(ch);
        ch++;
    }
}

  • 验证发现,STM32 虚拟串口发送出来的数据,是正确的

USB协议学习笔记 - CDC类虚拟串口Virtual Port Com_数据_05

小结

  • 初步通过ST官方提供的STM32CubeMX,快速搭建了USB【虚拟串口】工程,但是CDC类的使用细节,还需要进一步了解
  • USB协议比较的庞大,需要不断的学习研究,加上不断的【使用】与【实践】,才能真正的掌握起来