USB Device Custom HID 基本输入输出功能
目标平台: STM32F103ZET / STM32F072RBH
CubeMX版本: STM32CubeMX 5.5.0
CubeMX FW版本:STM32Cube_FW_F1_V1.8.0 / STM32Cube_FW_F0_V1.11.0
两个平台在USB Middleware 这个层面上的代码是一致的。
不作赘述,参考 STM32 USB HID-Mouse 基本功能
参考代码详见
GitHub: Custom_HID
注意: STM32F072的工程中带有Bootloader的配置,因此如需测试此功能需要手动把Bootloader配置关闭。
关闭的方法为在Main函数中屏蔽 IAP_Set() 这个API , 同时将IROM1的起始地址设置为0x0800 0000
CUBE生成的代码并不能直接使用,是因为报文描述符没有进行有效的填充。
报文描述符的编写参考源码中 user_custom_hid.h中的宏定义即可,HID的报文描述符涉及的内容比较广泛,此处不作展开。
#define HID_DESC_IN 0x81
#define HID_DESC_OUT 0x91
#define CUSTOM_HID_ReportDesc_Module(ReportID, Direction) 0x85,ReportID, /* REPORT ID */ \
0x09,ReportID+1, /* USAGE */ \
0x15,0x00, /* LOGICAL_MINIMUM(0)*/ \
0x26,0xff,0x00, /* LOGICAL_MAXIMUM(255)*/\
0x75,0x08, /* REPORT SIZE(8) 8BIT*/ \
0x95,0x3F, /* REPORT COUNT(63)8BIT*/\
0xb1,0x82, /* FEATURE(Data,Var,Abs,Vol)*/\
0x85,ReportID, /* REPORT ID */ \
0x09,ReportID+1, /* USAGE */ \
Direction,0x82 /* IN OUT(Data,Var,Abs,Vol)*/
CubeMX 生成的代码,不作修改默认仅支持2 Byte的数据传输, 如果我们需要双向64 Bytes的数据传输,就需要修改一下配置定义,以64 Bytes 为例:
usbd_customhid.h
#define CUSTOM_HID_EPIN_SIZE 0x40
#define CUSTOM_HID_EPOUT_SIZE 0x40
#define CUSTOM_HID_FS_BINTERVAL 1 //最小传输间隔 1ms
usbd_conf.h
#define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE 0x40
#define USBD_CUSTOM_HID_REPORT_DESC_SIZE 50 //根据报文描述符填写 实际长度
特别注意 USB_CUSTOM_HID_CONFIG_DESC_SIZ 和 USBD_CUSTOM_HID_REPORT_DESC_SIZE 分别指的是USB的配置描述符和 HID的报文描述符,不可混淆。
接口函数,同样需要修改, 将原来的两个字节的接口函数,修改为指针类型。