【STM32】STM32H750 CubeMX 配置 USB CDC 虚拟串口笔记

一、前提条件

  • 芯片:STM32H750 (Cortex-M7)
  • 工具:STM32CubeMX + Keil / IAR / GCC
  • USB 外设:USB_OTG_FS (全速 12Mbps)
  • 关键条件:USB 时钟必须为 48 MHz

二、时钟配置 (SystemClock_Config)

USB 外设要求 精确的 48 MHz

CubeMX → Clock Configuration 里检查:

  • USB Clock Mux = 48 MHz

  • 在 时钟 配置中:

    • `USB选择 RC48输出48 MHz 给 USB_OTG_FS
  • ⚠️ 注意:如果时钟不是 48 MHz,USB 枚举会失败(设备可能直接无法被识别)。


三、CubeMX 外设配置

1. USB_OTG_FS

  • Mode: Device_Only
  • Speed : Full Speed

2. USB_DEVICE

四、关键宏参数配置(usbd_conf.h / usbd_cdc_if.c

参数 说明 推荐值 注意事项
USBD_MAX_NUM_INTERFACES 最大接口数 2 CDC 需要 1 控制 + 1 数据接口
USBD_MAX_NUM_CONFIGURATION 最大配置数 1 单配置足够
USBD_MAX_STR_DESC_SIZ 字符串描述符长度 512 足够放厂商/产品/序列号
USBD_SELF_POWERED 自供电 0(USB 供电)/ 1(外部电源) 根据实际供电方式
USBD_DEBUG_LEVEL 调试信息 1 发布时改回 0
USBD_LPM_ENABLED 低功耗模式 0 禁用,避免兼容性问题
APP_RX_DATA_SIZE CDC 接收缓冲区 2048 可按数据量调整
APP_TX_DATA_SIZE CDC 发送缓冲区 2048 缓冲区过小会丢数据

五、USB_OTG_FS 配置参数详解

参数 说明 推荐配置 注意事项
Speed USB 通信速度 Full Speed (12 Mbps) H750 仅支持 FS,需 48MHz 时钟
Enable internal IP DMA 内部 DMA Disabled 若启用需配置 DMA 中断,复杂应用才需要
Low power 低功耗 Disabled Suspend/Resume 场景下才用
Battery charging USB 充电协议 Disabled 需要硬件支持
Link Power Management (LPM) 链路电源管理 Disabled 兼容性差
Use dedicated EP1 interrupt 独立 EP1 中断 Disabled 默认全局中断足够
VBUS sensing VBUS 检测 Enabled 必须开启,否则无法检测插拔
Signal start of frame SOF 中断 Disabled 一般不需要

六、发送/接收数据接口

1. 发送数据

CubeMX 自动生成 CDC_Transmit_FS()

c 复制代码
char msg[] = "Hello USB CDC!\r\n";
CDC_Transmit_FS((uint8_t*)msg, strlen(msg));

2. 接收数据

CubeMX 生成的 CDC_Receive_FS() (USB_DEVICE\App\usbd_cdc_if.c)回调:

c 复制代码
uint8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
    // 这里处理接收到的数据
    CDC_Transmit_FS(Buf, *Len); // 回显
    return USBD_OK;
}

七、推荐的 usbPrintf 实现

为方便调试,可以写一个格式化打印函数:

c 复制代码
#include <stdarg.h>
#include <stdio.h>

void usbPrintf(const char *format, ...)
{
    va_list args;
    int length;

    va_start(args, format);
    length = vsnprintf((char *)UserTxBufferFS, APP_TX_DATA_SIZE, format, args);
    va_end(args);

    if (length > APP_TX_DATA_SIZE) {
        length = APP_TX_DATA_SIZE; // 避免溢出
    }

    // 等待直到发送成功
    while (CDC_Transmit_FS(UserTxBufferFS, length) == USBD_BUSY) {
        // 可以加个超时机制,避免死等
    }
}

八、常见问题排查

  1. 设备无法枚举 → 检查 USB 时钟是否为 48MHz,VBUS sensing 是否开启。
  2. 数据丢失 → 增大 APP_RX_DATA_SIZE / APP_TX_DATA_SIZE
  3. 死机 → 注意 CDC_Transmit_FS() 不能在中断里调用。
  4. 波特率设置无效 → CDC 虚拟串口不受串口助手波特率影响,它是 USB Bulk 传输。

📌 总结

CubeMX 下配置 H750 的 CDC 虚拟串口关键是 USB 时钟 48MHz接口数 2缓冲区足够大禁用 LPM/低功耗,这样配置后就能稳定实现虚拟串口通信。

相关推荐
LCG元15 分钟前
STM32项目实战:基于STM32F103的智能农业监控系统
stm32·单片机·嵌入式硬件
ACP广源盛1392462567317 分钟前
IX8024与科学大模型的碰撞@ACP#筑牢科研 AI 算力高速枢纽分享
运维·服务器·网络·数据库·人工智能·嵌入式硬件·电脑
OBiO201343 分钟前
Cell | 突破AAV载体容量限制!路中华/姜玉武/刘太安团队开发AAVLINK系统实现大基因递送
笔记
智者知已应修善业2 小时前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
一起搞IT吧2 小时前
Android性能系列专题理论之十:systrace/perfetto相关指标知识点细节含义总结
android·嵌入式硬件·智能手机·性能优化
sakiko_2 小时前
UIKit学习笔记5-使用UITableView制作聊天页面
笔记·学习·swift·uikit
Truffle7电子2 小时前
STM32CubeIDE/Programmer/Touch GFX 应用
stm32·单片机·嵌入式硬件
Alice-YUE3 小时前
【js高频八股】防抖与节流
开发语言·前端·javascript·笔记·学习·ecmascript
constant_LDX3 小时前
步进电机开发(一、硬件设计)
单片机·嵌入式硬件
北山有鸟4 小时前
修改源码法和插件法
嵌入式硬件·学习