【STM32】STM32H750 CubeMX 配置 USB CDC 虚拟串口笔记_stm32 cube配置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
)
2
1
512
0
(USB 供电)/ 1
(外部电源)1
0
0
2048
2048
五、USB_OTG_FS 配置参数详解
六、发送/接收数据接口
1. 发送数据
CubeMX 自动生成 CDC_Transmit_FS()
:
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)回调:
uint8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len){ // 这里处理接收到的数据 CDC_Transmit_FS(Buf, *Len); // 回显 return USBD_OK;}
七、推荐的 usbPrintf
实现
为方便调试,可以写一个格式化打印函数:
#include #include 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) { // 可以加个超时机制,避免死等 }}
八、常见问题排查
- 设备无法枚举 → 检查 USB 时钟是否为 48MHz,VBUS sensing 是否开启。
- 数据丢失 → 增大
APP_RX_DATA_SIZE
/APP_TX_DATA_SIZE
。 - 死机 → 注意
CDC_Transmit_FS()
不能在中断里调用。 - 波特率设置无效 → CDC 虚拟串口不受串口助手波特率影响,它是 USB Bulk 传输。
📌 总结:
CubeMX 下配置 H750 的 CDC 虚拟串口关键是 USB 时钟 48MHz、接口数 2、缓冲区足够大、禁用 LPM/低功耗,这样配置后就能稳定实现虚拟串口通信。