STM32F103C8T6(Blue Pill) 上移植 USB 虚拟串口(CDC)

简介: STM32F103C8T6(Blue Pill) 上移植 USB 虚拟串口(CDC)

方案 STM32CubeMX + HAL 库 + USB Device CDC 类


一、硬件准备

项目 说明
MCU STM32F103C8T6
USB PA11(DM)、PA12(DP)
上拉电阻 DP 需 1.5kΩ 上拉到 3.3V(多数板子已集成)
晶振 8 MHz 外部晶振(必须)
Boot0 0(从 Flash 启动)

二、CubeMX 关键配置

1、SYS

  • Debug:Serial Wire
  • Timebase Source:SysTick

2、RCC

  • HSE:Crystal/Ceramic Resonator
  • LSE:Disable

3、USB

  • USB Device(FS)
  • Class:Communication Device Class (CDC)

4、USB_DEVICE

  • Class:CDC
  • USBD_CDC_APP:Enabled

5、Clock Configuration

HSE = 8 MHz
PLL Source = HSE
PLL Mul = x9
SYSCLK = 72 MHz
USB Prescaler = PLLCLK / 1.5 = 48 MHz

USB 时钟必须是 48 MHz,否则无法枚举


三、生成代码后必须修改的地方

1、打开 USB 中断

CubeMX 有时不会自动打开 USB 中断:

/* USER CODE BEGIN 2 */
HAL_NVIC_SetPriority(USB_LP_CAN1_RX0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn);
/* USER CODE END 2 */

2、CDC 接收回调函数(核心)

usbd_cdc_if.c 中找到:

static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
   
    /* USER CODE BEGIN 6 */
    extern void USB_CDC_RxHandler(uint8_t *buf, uint32_t len);
    USB_CDC_RxHandler(Buf, *Len);

    USBD_CDC_ReceivePacket(&hUsbDeviceFS);
    return (USBD_OK);
    /* USER CODE END 6 */
}

3、自己封装一个接收处理函数

/* usb_cdc.c */
#include "usbd_cdc_if.h"

void USB_CDC_RxHandler(uint8_t *buf, uint32_t len)
{
   
    if (len == 0) return;

    // 示例:原样返回(回显)
    CDC_Transmit_FS(buf, len);
}

4、发送函数封装

#include "usbd_cdc_if.h"

void USB_CDC_SendString(char *str)
{
   
    CDC_Transmit_FS((uint8_t*)str, strlen(str));
}

四、main.c 初始化

int main(void)
{
   
    HAL_Init();
    SystemClock_Config();

    MX_GPIO_Init();
    MX_USB_DEVICE_Init();   // 初始化 USB CDC

    USB_CDC_SendString("STM32F103 USB CDC Ready!\r\n");

    while (1)
    {
   
        USB_CDC_SendString("Hello USB CDC\r\n");
        HAL_Delay(1000);
    }
}

参考代码 STM32F103C8T6 USB虚拟串口移植 www.youwenfan.com/contentali/69817.html

五、PC 端现象

项目 结果
设备管理 出现 COMx
波特率 任意(忽略)
串口工具 可正常收发
供电 USB 供电即可

不需要 USB 转 TTL


六、常见问题与解决方法

1. 电脑识别不了设备

检查:

  • 晶振是不是 8 MHz
  • USB 时钟是不是 48 MHz
  • PA11 / PA12 是否被复用

2. 枚举失败 / 未知设备

解决:

  • 换 USB 线(很多线只能充电)
  • 加 22Ω 串阻(PA11/PA12)
  • 缩短 USB 线

3. 发送数据卡死

原因:CDC_Transmit_FS 未发送完成又调用
解决:

while (CDC_Transmit_FS(buf, len) != USBD_OK) {
   
    HAL_Delay(1);
}

4. 接收数据不完整

原因:USB 包最大 64 字节
解决:自己拼包(环形缓冲)


七、进阶

USB + printf 重定向

int _write(int fd, char *ptr, int len)
{
   
    CDC_Transmit_FS((uint8_t*)ptr, len);
    return len;
}

USB + 串口共存

  • USB 用于调试
  • USART1 用于模块通信

USB + 上位机协议

  • 自定义帧头 + CRC
  • 用于 Bootloader / 参数配置

八、工程级建议

项目 建议
工程 CubeMX + HAL
调试 先保证 USB 枚举
协议 用长度 + 校验
速度 实测 800Kbps+
目录
相关文章
|
3月前
|
数据采集 人工智能 分布式计算
多Agent集群中的"情报官"设计:为什么系统需要一个RDD
在多Agent系统中,信息采集环节的失误往往是级联错误的根源。本文从行业实践和学术研究两个维度,论证了专职情报采集Agent的必要性,并详细解析了枢衡RDD(资源探测)的五大架构设计原则,包括与CAD的对抗性协作机制等。最后提供了一套可落地的自检清单,帮助开发者判断自己的Agent集群是否需要引入专职情报官角色。
|
3月前
|
人工智能 自然语言处理 安全
多AI聚合的五个常见误区:你以为的“交叉验证”可能只是“重复犯错”
本文剖析多AI聚合系统五大常见误区:盲目追求数量、迷信“少数服从多数”、误信数据天然独立、将分歧视为缺陷、幻想彻底消除幻觉。强调模型独立性、分歧价值与用户主动判别才是发挥聚合效能的关键。
340 5
|
3月前
|
人工智能 自然语言处理 自动驾驶
Goal × Loop搭配指南:长任务自动化落地老金给你讲明白!
本文直击AI使用误区:把“许愿”当“目标”。指出多数人失败源于goal模糊——无读者、无验收、无边界。提出可验收goal五要素(对象、结果、交付物、约束、验收标准),并给出文章、副业、AI助手三大场景的改写范例,辅以state管理、loop设计与prompt自举实操,助你从“求AI帮忙”迈向“精准协同”。
|
3月前
|
数据挖掘 API 数据中心
游戏工作室多开怎么防?IP离线库识别同一网段批量账号
游戏工作室防多开,难点不在设备伪装(如改IMEI),而在识别“假分散、真同源”——账号看似独立,实则共享同一出口IP、数据中心段或ASN。IP离线库通过`is_datacenter`、`asn`、`is_proxy`等维度毫秒画像,精准捕获网络层聚集性,误判率<0.5%,是风控源头可信锚点。(239字)
|
3月前
|
缓存 安全 前端开发
阿里云经销商lingducloud: 基于阿里云 OSS 与 CDN 的高性能、低成本落地实践
本文深度解析阿里云OSS与CDN协同实践:直击外网直连导致的高成本(0.5元/GB)与跨域延迟痛点,详解五步配置、缓存优化、防盗链、熔断告警及成本对账,助你构建安全、极速、省钱的静态资源分发体系。
|
3月前
|
人工智能 自然语言处理 搜索推荐
2026企业级智能客服系统建设方案:以“服务智能体”重构企业增长新引擎
本文阐述2026年企业级智能客服系统建设方案:以“服务智能体”为核心,构建全渠道统一中枢、大模型驱动的Agent化系统、敏捷工单与数据智能运营体系,破解渠道割裂、智能浅层、数据沉睡等挑战,助力企业从成本中心迈向价值中心。(239字)
|
3月前
|
人工智能 自然语言处理 SEO
GEO内容工厂:AI内容流水线实践
生成式搜索崛起,外贸内容生产正从“写文章”转向“建系统”。GEO(生成式引擎优化)要求内容可拆解、可复用、可被AI稳定引用。AB客GEO提出“语义资产工程”,通过问题库→意图拆解→内容组件→页面组装四层架构,实现内容工业化生产。
246 0
|
3月前
|
监控 网络协议 Go
装在内核里的透视镜:云监控 2.0 不改一行代码实现全栈可观测
基于Opentelemetry 无侵入探针,无需改代码、跨语言自动产出符合 OTel 标准的 trace 与 metrics。覆盖 HTTP、gRPC、MySQL、Redis、Kafka、CUDA 等 15+ 协议,并原生支持 OpenAI、通义千问等 GenAI 调用追踪,在云监控2.0 实现可以实现一键接入使用。
769 141
|
2月前
|
缓存 Prometheus 监控
大模型API调用成本控制:Token估算、缓存策略与模型选择实践
本文介绍面向高频查询(日数百次)的大模型成本控制方案,涵盖Token估算、Redis缓存、多模型分级选型(Turbo/Plus/Max)及Prometheus费用监控告警。基于阿里云百炼与DashScope实现,需Python基础及API Key
377 2
|
3月前
|
人工智能 运维 安全
工单闭环从半天到 6 分钟:我们把 AI Agent 编进了组织架构
我们以云原生应用部门为试验田,用商业化产品 AgentTeams 落地一支"数字员工小分队",让它们承接日常研发、工单答疑、开源维护与运营等业务,把原本人肉串联的协作流程,做成 AI Native 的工作方式。
1211 144