当前位置: 首页 > news >正文

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. 检查缓冲区大小:确保数据缓冲区足够大,避免数据溢出。

 

相关文章:

  • springboot项目文件上传到服务器本机,返回访问地址
  • 省哲学社科基金项目申请书(论证活页)模版框架参考
  • 【Linux】Java 开发者的 Linux 常用命令指南
  • 电子电器架构 -- 汽车零部件DV试验与PV试验的定义及关键差异
  • 力扣面试150题--K 个一组翻转链表
  • Linux0.11引导启动程序:简略过程
  • 深入蜂窝物联网 第三章 LTE-M(Cat-M1)详解:省电机制与移动特性
  • Spring系列六:JdbcTemplate
  • 【Rust通用集合类型】Rust向量Vector、String、HashMap原理解析与应用实战
  • case和字符串操作
  • Elastic Platform 8.18 和 9.0:ES|QL Lookup Joins 功能现已推出,Lucene 10!
  • 泰迪杯实战案例超深度解析:特殊医学用途配方食品数据分析与智能推荐系统设计
  • 零成本AI抠图终极指南:蓝耘元生代AIDC OS+ComfyUI实现商业级效果
  • 检查IBM MQ SSL配置是否成功
  • 比亚迪在智能化上,想再赢一次?
  • 从Flask到智能体:装饰器模式在AI系统中的架构迁移实践
  • 轻舟系列FPGA加速卡:大模型分布式训练中的高效协同者
  • 如何在idea中写spark程序
  • 【现代深度学习技术】循环神经网络07:通过时间反向传播
  • 什么是VR相机?VR相机的发展历史
  • 圆桌|特朗普上台百日未能结束俄乌冲突,若美国“退出”会发生什么?
  • 人民时评:投资于人,促高质量充分就业
  • 一季度规模以上工业企业利润由降转增,国家统计局解读
  • 只在上海!德国剧团新作亚洲首演:一张古典与流行的声音网络
  • 玉渊谭天丨“稀土管制让美国慌了”,美军工稀土储备仅够数月
  • 网贷放款后自动扣除高额会员费,多家网贷平台被指变相收取“砍头息”