使用STM32CubeMX创建一个HID设备
准备工作
STM32CubeMX、keil、一块支持USB外设的ST芯片
一、CubeMX配置
1.1 第一步打开USB外设,参数保持默认即可,内容如下图所示:
1.2 接下来是配置USB_Device相关参数
确认无误后生成代码即可。到这里我们只是有了这个设备,但是直接连到电脑上是不会被识别到的,接下来就要修
改报文描述符等内容。
二、代码修改
1.修改报文描述符内容
描述符内容如下(想了解设备描述符怎么来的可以去看《圈圈教你玩usb》这本书里面说的很详细):
0x06, 0x00, 0xff, // USAGE_PAGE (Vendor Defined Page 1) 表示一个报文标签之类的用途类页
0x09, 0x01, // USAGE (Vendor Usage 1) 表示一个报告ID标志
0xa1, 0x01, // COLLECTION (Application) 表示应用集合,要以下面最后的0xc0结束它
0x09, 0x01, // USAGE (Vendor Usage 1)功能的一个卷标志
0x15, 0x00, // LOGICAL_MINIMUM (0) 表示每个传输数据限定为0
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) 表示每个传输数据的最大值限定为255
0x95, 0x40, // REPORT_COUNT (64) 每次发送的数据长度,这里是64位
0x75, 0x08, // REPORT_SIZE (8) 同下REPORT_SIZE
0x81, 0x02, // INPUT (Data,Var,Abs) 表示USB要输入数据到PC的功能
0x09, 0x01, // USAGE (Vendor Usage 1) 每个功能的一个卷标志
0x15, 0x00, // LOGICAL_MINIMUM (0) 表示每个传输数据限定为0
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) 表示每个传输数据的最大值限定为255
0x95, 0x40, // REPORT_COUNT (64) 每次接收的数据长度,这里是64位
0x75, 0x08, // REPORT_SIZE (8) 传输字段的宽度为8bit,表示每个传输的数据范围为0~ffff ffff
0x91, 0x02, // OUTPUT (Data,Var,Abs) 表示USB设备要接收PC的数据的功能
0xc0 // END_COLLECTION 结束标志
将其复制到usbd_custom_hid_if.c文件中的
CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE]数组内即可,
随后对usbd_conf.h和usbd_customhid.h的以下内容进行修改:
#define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE 64
#define USBD_CUSTOM_HID_REPORT_DESC_SIZE 34
#define CUSTOM_HID_EPIN_SIZE 0x40
#define CUSTOM_HID_EPOUT_SIZE 0x40
修改完之后就已经可以正常使用了,但是有些朋友可能会发现,这通信速率实在是不敢恭维。接下来就说一下如何
修改通信速率打开usbd_customhid.c文件
找到以下内容
其默认位20ms我们只需要将其变小即可,最小可以为0x01。
到这里所有的工作都已经完成了,接下里便是接收和发送部分的内容
2.USB打印功能
在讲解打印功能之前,要先学习一下USB的接收以及发送函数,当USB接收完一包数据之后会自动调用文件
usbd_custom_hid_if.c中的static int8_t CUSTOM_HID_OutEvent_FS(uint8_t event_idx, uint8_t state)函数
这里面的内容需要我们根据实际情况进行调整,其中接收到的数据存放在hhid->Report_buf中;
发送函数uint8_t USBD_CUSTOM_HID_SendReport (USBD_HandleTypeDef *pdev, uint8_t *report, uint16_t len)
存在于usbd_customhid.c文件中。
打印代码的话可以参考以下内容:
#include <stdarg.h>
void usb_printf(const char *format, ...)
{
va_list args;
uint8_t USB_HID_TxBuff[100] = {0};
va_start(args, format);
/* 将参数格式化输出到数组 */
vsnprintf((char *)USB_HID_TxBuff, 64, (char *)format, args);
va_end(args);
USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, USB_HID_TxBuff, 64);
}
到此,USB-HID设备我们已经调试修改完毕,接下来编译下载代码即可。
*觉得有帮助的朋友可以关注一下博主,后续会给大家分享更多有趣的内容。