STM32 USB HID 源码方案

STM32 USB HID 源码方案,以 STM32F407 + CubeMX + HAL + USB HID(Custom HID) 为标准示例,适合做 自定义 HID 设备(非键盘/鼠标),比如:

上下位机通信

数据采集合

替代串口


一、推荐方案

STM32 CubeMX + USB Custom HID + HAL

  • MCU:STM32F407
  • USB:Full Speed Device
  • HID:Custom HID(Vendor Defined)
  • 传输方式:Interrupt IN / OUT
  • 包大小:64 Bytes(FS)

二、CubeMX 关键配置

1 USB_OTG_FS

参数 设置
Mode Device_Only
Speed Full Speed (12 MHz)
VBUS Sensing ❌ 关闭
SOF

2 Middleware → USB_DEVICE

参数 设置
Class Custom Human Interface Device Class (HID)
HID Report Descriptor Custom
Endpoint IN 0x81
Endpoint OUT 0x01
Packet Size 64
Polling Interval 1 ms

三、HID 描述符

文件路径:

复制代码
USB_DEVICE/App/usbd_desc.c

自定义 HID 报告描述符(64 字节双向)

c 复制代码
__ALIGN_BEGIN static uint8_t HID_ReportDesc[] __ALIGN_END =
{
    0x06, 0x00, 0xFF,   // Usage Page (Vendor Defined)
    0x09, 0x01,         // Usage (Vendor Usage 1)
    0xA1, 0x01,         // Collection (Application)

    // Input Report (Device → PC)
    0x09, 0x02,         // Usage
    0x15, 0x00,         // Logical Min (0)
    0x26, 0xFF, 0x00,   // Logical Max (255)
    0x75, 0x08,         // Report Size (8 bits)
    0x95, 0x40,         // Report Count (64 bytes)
    0x81, 0x02,         // Input (Data,Var,Abs)

    // Output Report (PC → Device)
    0x09, 0x03,         // Usage
    0x15, 0x00,
    0x26, 0xFF, 0x00,
    0x75, 0x08,
    0x95, 0x40,
    0x91, 0x02,         // Output (Data,Var,Abs)

    0xC0                // End Collection
};

作用

  • PC ↔ STM32 每次最多 64 字节
  • 不走键盘/鼠标协议,免驱

四、USB HID 收发源码

1 发送数据(STM32 → PC)

文件:usbd_custom_hid_if.c

c 复制代码
#include "usbd_customhid.h"

extern USBD_HandleTypeDef hUsbDeviceFS;

void USB_HID_Send(uint8_t *data, uint16_t len)
{
    if (len > 64) len = 64;
    USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, data, len);
}

使用示例:

c 复制代码
uint8_t tx_buf[64] = {0xAA, 0x55};
USB_HID_Send(tx_buf, 64);

2 接收数据(PC → STM32)

USBD_CUSTOM_HID_DataOut() 回调中接收:

c 复制代码
extern USBD_HandleTypeDef hUsbDeviceFS;

static int8_t USBD_CUSTOM_HID_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum)
{
    uint8_t *rx_buf = ((USBD_CUSTOM_HID_HandleTypeDef *)(pdev->pClassData))->Report_buf;

    // rx_buf[0] ~ rx_buf[63]
    // 在这里处理 PC 下发的数据

    // 重新开启 OUT 端点
    USBD_LL_PrepareReceive(pdev, CUSTOM_HID_EPOUT_ADDR,
                           ((USBD_CUSTOM_HID_HandleTypeDef *)(pdev->pClassData))->Report_buf,
                           CUSTOM_HID_EPOUT_SIZE);

    return USBD_OK;
}

五、main.c 初始化

c 复制代码
int main(void)
{
    HAL_Init();
    SystemClock_Config();

    MX_GPIO_Init();
    MX_USB_DEVICE_Init();

    uint8_t hid_tx[64] = {0x01,0x02,0x03};

    while (1)
    {
        USB_HID_Send(hid_tx, 64);
        HAL_Delay(1000);
    }
}

参考代码 stm32 usb hid全套程序源代码 www.youwenfan.com/contentcst/182668.html

六、PC 端测试工具

工具 用途
HIDAPI PC 上位机(C/C++/Python)
Bus Hound USB 抓包
USBlyzer 描述符分析
PyUSB / hidapitester Python 通信

Python 示例(HIDAPI)

python 复制代码
import hid

dev = hid.device()
dev.open(0x0483, 0x5750)

dev.write([0x00] + [i for i in range(64)])
print(dev.read(64))

七、常见 PID / VID(STM32 默认)

项目
VID 0x0483
PID 0x5750
Manufacturer STMicroelectronics

可在 usbd_desc.c 中修改。


八、常见问题速查

问题 解决
电脑不识别 检查 USB DP 上拉、时钟 48MHz
只能发一次 OUT 端点未重新 PrepareReceive
枚举失败 描述符 Report Count 错
Windows 不认 不要用键盘 Usage Page

相关推荐
芯岭技术2 小时前
Wi-Fi+BLE双模无线芯片 BK7238,低功耗、高性能,集成MCU和Flash
单片机·嵌入式硬件
云空2 小时前
《ARM Cortex‑M 系列完整梳理》
stm32·单片机·嵌入式硬件·mcu
Dr.kangder3 小时前
嵌入式处理器仿真技术——Hypervisor 原理与实践
服务器·嵌入式硬件·架构·嵌入式
Hello_Damon_Nikola5 小时前
TM1637芯片从入门到精通
单片机·嵌入式硬件
智购科技自动售卖机厂家9 小时前
从STM32到RK3588——自动售货机嵌入式主控方案的架构演进~YH
stm32·嵌入式硬件·物联网·架构·lua·零售·symfony
振南的单片机世界10 小时前
2MHz/50MHz玄机:GPIO速度档选错,信号直接“烂尾”
arm开发·stm32·单片机·嵌入式硬件
Run_Teenage10 小时前
嵌入式:理解STM32文档和社区生态,工具链的选择与安装
stm32·单片机·嵌入式硬件
ACP广源盛1392462567310 小时前
DeepSeek‑V4‑Flash 公测@ACP#昇腾 950 国产算力组合落地,国产 PCIe 交换芯片 IX9104 有哪些硬件机会
大数据·数据库·人工智能·分布式·单片机·嵌入式硬件·microsoft
铅笔小新z10 小时前
【stm32】RCC 与时钟树
stm32·单片机·嵌入式硬件
时空自由民.11 小时前
STM32 IIC HAL库,LL库
stm32·单片机·嵌入式硬件