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

相关推荐
23124_8017 小时前
【无标题】
单片机·嵌入式硬件
ytttr87317 小时前
STM32 读写 SD 卡源码(SPI 模式 + FATFS 文件系统)
stm32·单片机·嵌入式硬件
Quinn2718 小时前
正点原子 STM32MP257 修复异核 FreeRTOS+OpenAMP 例程里 SysTick 延时异常的问题
stm32·嵌入式硬件·正点原子·arm linux
Deitymoon18 小时前
STM32——OLED显示图片
stm32·单片机·嵌入式硬件
深圳英康仕18 小时前
龙芯2K3000嵌入式工控机的技术拆解:算力、接口与国产系统适配
嵌入式硬件·工控机·工业计算机·国产工控机·龙芯2k3000
山木嵌入式18 小时前
STM32 UART串口通信协议与3种底层驱动实现(寄存器/标准库/HAL库)
stm32·单片机·串口·uart
Heartache boy18 小时前
野火STM32_HAL库版课程笔记-I2C介绍
笔记·stm32·单片机
Deitymoon18 小时前
STM32——OLED显示汉字
stm32·单片机·嵌入式硬件
狮驼岭的小钻风18 小时前
单片机启动流程与 .s 文件详解
单片机·嵌入式硬件
金色光环18 小时前
【DSP学习笔记】 F28335中断系统理解-基于普中DSP28335开发攻略
笔记·单片机·学习·dsp开发