使用STM32 HAL库实现游戏手柄Joystick功能及USB协议通信

自制游戏手柄joystick stm32 hal usb协议

STM32cubeMX生成代码

USBD_CUSTOM_HID_REPORT_DESC_SIZE是报告描述符大小

添加报告描述符

修改usbd_custom_hid_if.c

  /* USER CODE BEGIN 0 */
  0x05, 0x01,       // Usage Page (Generic Desktop Ctrls)//通用桌面控件
  0x09, 0x05,       // Usage (Game Pad)
  0xA1, 0x01,       // Collection (Application)
  /*  */            //
  0xA1, 0x00,       //   Collection (Physical)
  0x09, 0x30,       //     Usage (X)//摇杆X轴
  0x09, 0x31,       //     Usage (Y)//摇杆Y轴
  0x16, 0x18, 0xFC, //     Logical Minimum (-1000)//输入逻辑参数最小值
  0x26, 0xE8, 0x03, //     Logical Maximum (1000)//输入逻辑参数最大值
  0x36, 0x18, 0xFC, //     Physical Minimum (-1000)//物理输入参数最小值
  0x46, 0xE8, 0x03, //     Physical Maximum (1000)//物理输入参数最大值
  0x95, 0x02,       //     Report Count (2)//两个对象,X和Y
  0x75, 0x10,       //     Report Size (16)//每个对象大小为16位
  0x81, 0x02,       //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)//是输入数据,上面的参数是这个输入数据的描述
  0xC0,             //   End Collection
  /*  */            //
  0xA1, 0x00,       //   Collection (Physical)
  0x09, 0x33,       //     Usage (Rx)
  0x09, 0x34,       //     Usage (Ry)
  0x16, 0x18, 0xFC, //     Logical Minimum (-1000)
  0x26, 0xE8, 0x03, //     Logical Maximum (1000)
  0x36, 0x18, 0xFC, //     Physical Minimum (-1000)
  0x46, 0xE8, 0x03, //     Physical Maximum (1000)
  0x95, 0x02,       //     Report Count (2)
  0x75, 0x10,       //     Report Size (16)
  0x81, 0x02,       //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
  0xC0,             //   End Collection
  /*  */            //
  0xA1, 0x00,       //   Collection (Physical)
  0x09, 0x32,       //     Usage (Z)
  0x09, 0x35,       //     Usage (Rz)
  0x16, 0x18, 0xFC, //     Logical Minimum (-1000)
  0x26, 0xE8, 0x03, //     Logical Maximum (1000)
  0x36, 0x18, 0xFC, //     Physical Minimum (-1000)
  0x46, 0xE8, 0x03, //     Physical Maximum (1000)
  0x95, 0x02,       //     Report Count (2)
  0x75, 0x10,       //     Report Size (16)
  0x81, 0x02,       //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
  0xC0,             //   End Collection
  /*  */            //
  0x05, 0x09,       //   Usage Page (Button)//对象为按钮
  0x19, 0x01,       //   Usage Minimum (0x01)//从按钮1开始
  0x29, 0x05,       //   Usage Maximum (0x05)//到按钮5结束
  0x95, 0x05,       //   Report Count (5)//5个对象,5个按钮
  0x75, 0x01,       //   Report Size (1)//每个按钮占1位大小
  0x81, 0x02,       //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)//数据类型为输入,上面的参数是这个输入参数的描述
  /*  */            //
  0x05, 0x01,       //   Usage Page (Generic Desktop Ctrls)
  0x09, 0x39,       //   Usage (Hat switch)
  0x15, 0x01,       //   Logical Minimum (1)
  0x25, 0x08,       //   Logical Maximum (8)
  0x35, 0x00,       //   Physical Minimum (0)
  0x46, 0x3B, 0x10, //   Physical Maximum (4155)
  0x66, 0x0E, 0x00, //   Unit (None)
  0x75, 0x04,       //   Report Size (4)
  0x95, 0x01,       //   Report Count (1)
  0x81, 0x42,       //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,Null State)
  /*  */            //	 X输入占16位,Y输入占16位,rX,输入占16位rY输入占16位,Z输入占16位,rZ输入占16位,Button输入占5位,switch输入占4位,剩下7位用空输入补齐
  0x75, 0x07, 		//   Report Size (7)
  0x95, 0x01, 		//   Report Count (1)
  0x81, 0x03, 		//   Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
  /* USER CODE END 0 */
  0xC0    /*     END_COLLECTION	             */ //结束符,总共122个描述符

以下为main.c中内容

加入头文件,以及相关句柄

#include "usbd_customhid.h"
extern USBD_HandleTypeDef hUsbDeviceFS;

创建相关结构体

一定注意顺序,这里的顺序要和报告符中的描述一致

struct joystick_T
{
  int16_t x;//Usage (X)//摇杆X轴
  int16_t y;//Usage (Y)//摇杆Y轴
  int16_t rx;//Usage (Rx)
  int16_t ry;//Usage (Ry)
  int16_t l;//Usage (Z)
  int16_t r;//Usage (Rz)
  int16_t k;//Usage Page (Button)//对象为按钮,占5位。Usage (Hat switch)占4位。Report Size (7)剩下7位空输入补齐
};

struct joystick_T joystick;

运行实例

在主循环

  /* USER CODE BEGIN WHILE */
  while (1)
  {
    USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&joystick, sizeof(struct joystick_T));
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

使用


参考文章:

HID调试工具大全
USB标准请求及描述符在线分析
HID报表描述符大全及实例分析
使用CubeMX 生成 USB从机 Custom HID 工程
自制游戏手柄joystick stm32 hal usb协议
基于STM32 HAL库实现鼠标键盘摇杆的USB复合设备

作者:枯矾柯

物联沃分享整理
物联沃-IOTWORD物联网 » 使用STM32 HAL库实现游戏手柄Joystick功能及USB协议通信

发表回复