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)!