使用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复合设备
作者:枯矾柯