记录一下 开发STM32 USB HID踩过的坑
Posted haoaoooooo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记录一下 开发STM32 USB HID踩过的坑相关的知识,希望对你有一定的参考价值。
记录一下 开发STM32 USB HID踩过的坑
一、前言
MCU: STM32F103C8T6
CubeMX: STM32CubeMX 5.3.0
二、代码配置
引脚配置
时钟树配置
我是打算做一个游戏控制器的,所以这里选择的是Custom Human Inerface Device Class。
顺便科普一下:
HID类设备是指用于和人类交互的设备,例如鼠标、键盘,游戏手柄、打印机等。
CubeMX代码生成后,是不能直接用的,是因为报文描述符没有进行有效的填充。
可在源码中 user_custom_hid.h中,进行报文描述符的填充。
/** Usb HID report descriptor. */
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
/* USER CODE BEGIN 0 */
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x05, // USAGE (Game Pad)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 0x40, // USAGE_MAXIMUM (Button 64)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x40, // REPORT_COUNT (64)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
/* USER CODE END 0 */
0xc0 /* END_COLLECTION */
;
关于报文描述符,网上有很多资料,官方资料也很全,可自行查看。
坑一:
CubeMX 生成的代码,不作修改默认仅支持2 Byte的数据传输, 害得我测试了半天,后面的数据一直接收不到。
原来需要修改一下配置定义,以64 Bytes 为例:
@file usbd_customhid.h
/** @defgroup USBD_CUSTOM_HID_Exported_Defines
* @
*/
#define CUSTOM_HID_EPIN_ADDR 0x81U
#define CUSTOM_HID_EPIN_SIZE 0x40U
#define CUSTOM_HID_EPOUT_ADDR 0x01U
#define CUSTOM_HID_EPOUT_SIZE 0x40U
坑二:
HID报告描述符的大小设置,设置多了少了都不行,一定要与你的描述符长度相符,不然电脑无法正常的识别USB设备。我这里设置了23,与上述的描述符长度相符。
/*---------- -----------*/
#define USBD_MAX_NUM_INTERFACES 1
/*---------- -----------*/
#define USBD_MAX_NUM_CONFIGURATION 1
/*---------- -----------*/
#define USBD_MAX_STR_DESC_SIZ 512
/*---------- -----------*/
#define USBD_DEBUG_LEVEL 0
/*---------- -----------*/
#define USBD_SELF_POWERED 1
/*---------- -----------*/
#define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE 64
/*---------- -----------*/
#define USBD_CUSTOM_HID_REPORT_DESC_SIZE 23
坑三:
USB设备发送数据给电脑的函数:
USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, buff, 8);
这个函数里的这个参数&hUsbDeviceFS,编辑器会有报错的显示。
原因:cubeMX生成代码后,hUsbDeviceFS并没有全局定义,所以如果在main里使用该参数就会找不到该参数。
解决方法:在usbd_custom_hid_if.h里添加这句代码,并在主函数加入该头文件。
usbd_custom_hid_if.h
/* USER CODE BEGIN EXPORTED_VARIABLES */
extern USBD_HandleTypeDef hUsbDeviceFS;
/* USER CODE END EXPORTED_VARIABLES */
以上内容记录下来,希望能帮助到有需要的伙伴。
该文章如有不对地地方,欢迎指出。
以上是关于记录一下 开发STM32 USB HID踩过的坑的主要内容,如果未能解决你的问题,请参考以下文章