以下是基于 STM32F103C8T6 的 USB 接口测试程序开发指南,以 USB虚拟串口(CDC) 为例:

1. 硬件准备

  • STM32F103C8T6 开发板(需支持 USB,如 Blue Pill 核心板)。
  • USB接口:连接 PA11 (D-)PA12 (D+) 到 USB 插座的 D-/D+。
  • 外部晶振:确保使用 8MHz 外部晶振(USB 需精确的 48MHz 时钟)。

在这里插入图片描述

2. 开发环境配置

  • IDE:Keil MDK、STM32CubeIDE 或 PlatformIO。
  • 库支持:STM32CubeMX + HAL 库(推荐)。

3. 使用 STM32CubeMX 配置 USB

  1. 时钟配置

    • HSE:8MHz 外部晶振。
    • PLL 配置:HSE → PLL ×9 → 72MHz 系统时钟。
    • USB 时钟:从 PLL 分频得到 48MHz(需精确)。
  2. USB 外设配置

    • 启用 USB Device 模式,选择 CDC (Virtual COM Port)
    • 自动生成描述符文件(usbd_cdc.c/h)。
  3. 生成代码

    • 生成初始化代码并导入到 IDE。

4. 关键代码实现

4.1 USB 初始化(main.c
#include "usbd_cdc.h"
USBD_HandleTypeDef husb; // USB 设备句柄

int main(void) {
    HAL_Init();
    SystemClock_Config(); // 确保时钟配置正确(包含 USB 48MHz)
    MX_USB_DEVICE_Init(); // 初始化 USB CDC
    while (1) {
        // 主循环(USB 中断驱动)
    }
}
4.2 发送数据到 PC(示例)
void USB_SendData(uint8_t *data, uint16_t len) {
    CDC_Transmit_FS(data, len); // 通过 USB CDC 发送数据
}

// 示例:发送字符串
USB_SendData((uint8_t*)"Hello USB!\n", 11);
4.3 接收 PC 数据(回调函数)
// 在 `usbd_cdc_if.c` 中实现接收回调
static int8_t CDC_Receive_FS(uint8_t* buf, uint32_t len) {
    // 处理接收到的数据(如回显)
    CDC_Transmit_FS(buf, len);
    return USBD_OK;
}

5. 测试步骤

  1. 编译并烧录程序
  2. 连接 USB:通过 USB 线将开发板连接到 PC。
    • 确保 PA11 (D-)PA12 (D+) 正确连接。
  3. 驱动安装
    • PC 将识别为 虚拟串口(如未自动安装,需手动安装 STM32 CDC 驱动)。
  4. 串口调试
    • 使用 PuTTY串口助手 打开虚拟串口(波特率可任意设置,CDC 协议自适应)。
    • 发送数据到 MCU,检查回显是否正常。

6. 常见问题解决

  1. USB 设备未被识别

    • 检查时钟配置(必须生成精确的 48MHz USB 时钟)。
    • 确认 PA11/PA12 引脚连接正确,USB插座未损坏。
    • 确保描述符配置正确(可通过 STM32CubeMX 重新生成)。
  2. 数据传输不稳定

    • 在 USB D+/D- 信号线上添加 22Ω 串联电阻
    • 缩短 USB 数据线长度,避免干扰。
  3. 驱动安装失败


7. 扩展功能

  • 自定义 HID 设备:修改 USB 配置为 HID 类,实现键盘/鼠标功能。
  • 大容量存储(MSC):挂载外部 Flash 或 SD 卡为 U 盘。
  • USB 音频:传输音频数据流(需外部 DAC)。

通过以上步骤,可快速验证 STM32F103C8T6 的 USB 接口功能。如需完整代码或进一步调试,请参考 STM32CubeMX 生成的示例工程。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐