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

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

 

http://www.xdnf.cn/news/2508.html

相关文章:

  • 蓝桥杯算法实战分享
  • Lua 第13部分 位和字节
  • 《Science》观点解读:AI无法创造真正的智能体(AI Agent)
  • Python中的Walrus运算符分析
  • HikariCP 6.3.0 完整配置与 Keepalive 优化指南
  • 1.1 道路结构特征
  • 【博通芯片方案】调试指令详解版一(无线)
  • Docker容器跑定时任务脚本
  • 分布式一致性算法起源思考与应用
  • 4.2.2 MySQL索引原理以及SQL优化
  • Bolt.diy 一键部署,“一句话”实现全栈开发
  • GAMES202-高质量实时渲染(homework1)
  • 【Redis】初识Redis
  • Java : GUI
  • MySQL(聚合函数)
  • 动态规划算法题1
  • 如何搭建行业社区?----以装修行业为例
  • 迷你世界UGC3.0脚本Wiki角色模块管理接口 Actor
  • 函数的使用
  • 诗词软件开发实战:从零开始构建现代诗歌应用
  • 北极花深度融合DeepSeek大模型,全面助力生物多样性智能分析图片生物多样性智能分析
  • Spring的Bean和自动配置
  • linux两个特殊的宏 _RET_IP_ 和_THIS_IP_ 实现
  • GPUStack昇腾Atlas300I duo部署模型DeepSeek-R1【GPUStack实战篇2】
  • 单片机-89C51部分:5、点亮LED
  • 纳米级形貌快速测量,白光干涉仪助力摩擦磨损学科发展
  • Vue Router ——路由基础详解(一)
  • Qt中的全局函数讲解集合(全)
  • 软件模块依赖关系管理与优化
  • 基于 STM32 与 RFID 技术的医院医疗器械数字化精细管理系统设计