之前使用kingst的逻辑分析仪,打开上位机软件,插上带usb的硬件就可以通信,也不需要打开串口什么的,感觉很方便,于是借用一个周末研究下这个技术。本文主要是用于记录自己学习的过程,顺便分享下学习感悟。
首秀初略说下大体是怎么回事,就是单片机使用hid功能需要配置VID PID,这两个相当于设备地址,配置好之后上位机根据这两个地址找到你的单片机,就可以通信了,就这么简单。
1.通过CUBEMX配置stm32的usb功能
图1
图2
2.填写HID报告描述符,USB_DEVICE/App/下打开usbd_custom_hid_if.c文件中。这个地方有很多要说的,先直接上单片机配置的代码。
__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, 0x02, // USAGE (Mouse)
0xa1, 0x01, // COLLECTION (Application)
0x09, 0x01, // USAGE (Pointer)
0xa1, 0x00, // COLLECTION (Physical)
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 0x03, // USAGE_MAXIMUM (Button 3)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x03, // REPORT_COUNT (3)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x05, // REPORT_SIZE (5)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x30, // USAGE (X)
0x09, 0x31, // USAGE (Y)
0x15, 0x81, // LOGICAL_MINIMUM (-127)
0x25, 0x7f, // LOGICAL_MAXIMUM (127)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x02, // REPORT_COUNT (2)
0x81, 0x06, // INPUT (Data,Var,Rel)
0xc0, // END_COLLECTION
/* USER CODE END 0 */
0xC0 /* END_COLLECTION */
};
结构体中的参数个数就是图1中红色圈起来的50,这个要保持一致。然后说下这段代码怎么来的。
自己写报告描述符有点困难,这个不用怕官方会提供工具的。工具截图如下:下载链接
图3
这个工具的使用说明:下载这个工具之后里面有各种报告描述符参考,我是直接拿一个鼠标的来用的。然后另存为.h格式
图4
图5
打开mouse.h文件,拷贝这个文件到你的STM32工程里面即可。
图6
然后下载程序到单片机,在电脑上就可以看到你的hid设备.设备VID 和PID都是之前设置的。
图7
3.上位机实现HID功能,我用的时qt,参考这个大神的Qt USB HID通讯文章,就可以实现通信。上位机部分还在调试。以后调通的再来更新。
4.在这期间遇到一个好用的工具。USB_HID 工具。这个可以和指定的VID PID通信,但是通信内容是固定的,只能用来测试的链路是否是正确的。