STM32 HAL库实现USB虚拟串口

1. 引言

在嵌入式系统开发中,USB 虚拟串口是一种非常实用的功能。它允许 STM32 微控制器通过 USB 接口与计算机进行通信,就像使用传统的串口一样。这种方式不仅简化了硬件设计,还提高了通信的灵活性和稳定性。STM32F407 系列微控制器具有强大的处理能力和丰富的外设资源,配合 HAL 库可以方便地实现 USB 虚拟串口功能。

2. 开发环境搭建

2.1 硬件准备
  • STM32F407 开发板:选择一款基于 STM32F407 的开发板,如正点原子的探索者 STM32F407 开发板。
  • USB 数据线:用于连接开发板和计算机。
2.2 软件准备
  • Keil MDK:一款专业的 ARM 微控制器开发工具,用于编写、编译和调试代码。
  • STM32CubeMX:ST 官方提供的图形化配置工具,可用于快速生成 STM32 项目的初始化代码。

 

点击生成代码;

注意几处需要修改的地方:

 

 

 

3. USB 虚拟串口原理

3.1 USB 协议基础

USB(Universal Serial Bus)是一种通用的串行总线标准,具有高速、可靠、易用等特点。USB 协议定义了设备与主机之间的通信方式,包括设备枚举、数据传输等过程。

3.2 CDC 类协议

CDC(Communication Device Class)是 USB 协议中的一种设备类,专门用于实现虚拟串口通信。CDC 类协议定义了两个接口:通信接口(Communication Interface)和数据接口(Data Interface)。通信接口用于发送和接收控制命令,数据接口用于传输实际的数据。

3.3 数据传输过程

4.2 数据接收处理

usbd_cdc_if.c文件中,有一个CDC_Receive_FS回调函数,用于处理接收到的数据。以下是该函数的示例代码:

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);
  // 处理接收到的数据
  for (uint32_t i = 0; i < *Len; i++)
  {
    // 这里可以添加具体的数据处理逻辑
    // 例如将接收到的数据原样发送回去
    CDC_Transmit_FS(&Buf[i], 1);
  }
  return (USBD_OK);
  /* USER CODE END 6 */
}
4.3 数据发送处理

usbd_cdc_if.c文件中,有一个CDC_Transmit_FS函数,用于发送数据。以下是该函数的示例代码:

uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
  uint8_t result = USBD_OK;
  /* USER CODE BEGIN 7 */
  USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
  if (hcdc->TxState != 0)
  {
    return USBD_BUSY;
  }
  USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);
  result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
  /* USER CODE END 7 */
  return result;
}
4.4 主函数代码

main.c文件中,需要对 USB 设备进行初始化,并启动数据接收。以下是主函数的示例代码:

5. 代码编译与下载

5.1 代码编译

打开 Keil MDK,导入 STM32CubeMX 生成的项目代码。在 Keil MDK 中进行编译,确保代码没有错误和警告。

5.2 代码下载

将开发板通过 USB 数据线连接到计算机,使用 ST-Link 或 J-Link 等调试器将编译好的代码下载到开发板中。

6. 测试与验证

6.1 计算机端软件准备

在计算机上安装串口调试助手,如串口调试精灵、SSCOM 等。

6.2 设备识别

将开发板通过 USB 数据线连接到计算机,计算机应该能够识别出一个新的串口设备。

6.3 数据收发测试

打开串口调试助手,选择识别到的串口,设置波特率为 115200(USB 虚拟串口的波特率不影响实际通信速度)。在串口调试助手中发送数据,开发板应该能够接收到数据并将其原样发送回去。

7. 常见问题及解决方法

7.1 设备无法识别

7.2 数据收发异常

8. 扩展功能

8.1 数据解析与处理

CDC_Receive_FS函数中添加更复杂的数据解析逻辑,例如解析特定的命令格式,实现不同的功能。

8.2 多线程处理

使用 STM32 的 RTOS(实时操作系统),如 FreeRTOS,将数据接收和处理任务分配到不同的线程中,提高系统的实时性和稳定性。

9. 总结

通过以上步骤,你可以基于 STM32F407 HAL 库实现 USB 虚拟串口功能。USB 虚拟串口为 STM32 开发板与计算机之间的通信提供了一种方便、高效的方式,在实际应用中具有广泛的用途。

  1. 设备枚举:当 STM32 开发板通过 USB 连接到计算机时,计算机会对设备进行枚举,获取设备的描述符信息,确定设备的类型和功能。
  2. 建立通信:枚举完成后,计算机和 STM32 开发板之间建立起 USB 通信连接。
  3. 数据传输:通过 CDC 类协议,计算机可以向 STM32 开发板发送数据,也可以接收 STM32 开发板发送的数据。

    4. 代码实现

    4.1 生成的代码结构

    使用 STM32CubeMX 生成的代码包含了 USB 虚拟串口的基本框架,主要文件有:

  4. usbd_cdc_if.c:实现了 CDC 类接口的回调函数,负责处理数据的发送和接收。
  5. usbd_cdc.c:实现了 CDC 类的核心功能,包括设备枚举、控制命令处理等。
  6. usbd_core.c:实现了 USB 设备的核心功能,包括设备初始化、数据传输等。
  7. 检查硬件连接:确保 USB 数据线连接正常,开发板的电源正常。
  8. 检查 USB 驱动:在设备管理器中查看是否有未识别的设备,尝试更新 USB 驱动。
  9. 检查代码逻辑:确保CDC_Receive_FSCDC_Transmit_FS函数的实现正确。
  10. 检查缓冲区大小:确保数据缓冲区足够大,避免数据溢出。

 

可能感兴趣的项目设计: USB虚拟串口的资料汇总(包括USB虚拟串口例程) (分享)USB 虚拟串口程序+PC驱动,亲测可用 串口调试在项目中被使用越来越多,串口资源的紧缺也变的尤为突出。很多本本人群,更是深有体会,不准备一个USB串口工具就没办法进行开发。本章节来简单概述STM32低端芯片上的USB虚拟串口的移植。在官方DEMO中已经提供了现成的程序,这里对修改方法做简单说明。 首先打开官方demo我们开始进行移植,第一步复制我们可用的文件,操作如下: Projects\Virtual_COM_Port文件夹下,复制红线部分 我为了方便演示统放在usb/src文件夹下: 现在复制USB文件,这些文件不需要我们修改: 上图中的文件统一放在usb/lib文件夹下: 好了现在所需要的文件我们以复制完了。这里先讲一下DEMO程序的主要工作流程: 由上图可知,PC通过虚拟串口发送数据到STM32 usb口,STM32再通过usart1发送数据到PC串口。我们做项目时,只用USB虚拟串口即可。所以我们现在需要把串口发送部分删除。把USB做为一个COM口来使用。我们要如何使用这个USB口呢?demo中是把USB发送数据做了一个缓存,先把要发送的数据存入缓存中,然后由USB自动发送出去。而接收部分是直接通过串口透传。我们在应用时就需要用到两个FIFO,1是发送,这个和demo方式是样;2是接收,接收也做一个缓存,我们通过查询来判断是否收到新数据。这下大家应该明白为什么使用两个FIFO了。 我这里有写好的FIFO函数可直接使用Queue.c文件。 具体代码修改转至附件内容下载。 官方demo+驱动程序截图:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值