自学内容网 自学内容网

STM32 -- USB CDC 虚拟串口通信

在嵌入式系统中,经常需要单片机与上位机(如PC)进行数据通信。传统的串口通信虽然方便,但数据传输速度有限。USB通信作为一种高速数据传输方式,其在STM32单片机上的应用越来越广泛。本文将详细介绍如何使用STM32F103C8T6单片机结合HAL库实现USB CDC(Communication Device Class)虚拟串口通信。

1. 硬件准备

  • STM32F103C8T6开发板
  • USB数据线
  • 电脑安装有STM32虚拟串口驱动(Win10及以上系统通常自带)

2. 软件配置

使用STM32CubeMX配置STM32F103C8T6的USB功能,步骤如下:

2.1 新建工程

在STM32CubeMX中新建工程,选择STM32F103C8T6芯片。

2.2 配置时钟

推荐使用外部时钟源,对于USB_FS,总线时钟一般设置为48MHz。

2.3 启用USB接口

在接口配置中启用USB,选择Device Only模式。

2.4 使用USB设备库

在中间件配置中启用USB_DEVICE库,并选择CDC类(Communication Device Class Virtual Port Com)。

3. 代码实现

3.1 包含USB接口头文件

main.c文件中包含USB接口的头文件:

#include "usbd_cdc_if.h"
3.2 模拟USB插拔

为了避免调试时频繁插拔USB线,可以通过代码模拟USB拔出动作:

void HAL_PCD_MspInit(PCD_HandleTypeDef* hpcd)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    __HAL_RCC_GPIOA_CLK_ENABLE();
    GPIO_InitStruct.Pin = GPIO_PIN_12;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_PULLDOWN;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    HAL_Delay(5);
}
3.3 发送数据

使用CDC_Transmit_FS函数发送数据:

char str[] = "Hello World!\r\n";
while (1)
{
    CDC_Transmit_FS((uint8_t*)str, strlen(str));
    HAL_Delay(2000);
}
3.4 接收数据

usbd_cdc_if.c中,可以实现一个回调函数来处理接收到的数据:

static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
    // 处理接收到的数据
    return 0;
}

4. 测试通信

编译并烧录代码到STM32F103C8T6开发板。使用串口助手打开对应的虚拟串口,设置正确的波特率(通常为115200)。在串口助手中发送数据,应该能在STM32开发板的串口上看到相应的数据回显。

5. 注意事项

  • 确保USB驱动已正确安装,特别是在Win7及以下系统中。
  • 在调试过程中,如果遇到通信问题,尝试重新插拔USB线或重启开发板。
  • 在实际应用中,可以根据需要调整USB通信的参数,如波特率、数据包大小等。

通过上述步骤,我们可以在STM32F103C8T6上使用HAL库成功实现USB CDC虚拟串口通信,为嵌入式系统的数据传输提供了一种高速、便捷的解决方案。

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料


原文地址:https://blog.csdn.net/weixin_66608063/article/details/143031675

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!