(如果对您有帮助记得点赞哦)
与上位机调试软件配合,
QT编写的调试助手:QT HID调试助手
源码:源码链接
QT上位机教程:教程地址
笔者这边硬件是TM32F103RCT6
软件使用CubeMX生成HID设备
首先配置单片机的基本时钟,调试方式等
本文主要讲解USBHID配置
勾选如上图所示
勾选
下面是对这几种模式的简要介绍:
-
IP Audio Device Class(IP音频设备类):
这个类别定义了一种用于在IP网络上传输音频数据的设备。它允许音频设备通过IP协议与计算机或其他设备进行通信,从而实现音频数据的传输和控制。 -
IP Communication Device Class(IP通信设备类):
这个类别定义了一种用于在IP网络上进行通信的设备。它提供了一套标准接口和协议,使设备能够与计算机或其他设备进行数据交换、实时通信和控制。 -
IP Download Firmware Update Class(IP固件下载更新类):
这个类别定义了一种用于通过IP网络下载和更新设备固件的设备。它提供了一套标准协议和接口,使设备能够通过IP协议接收、存储和安装固件更新。 -
IP Human Interface Device Class(IP人机界面设备类):
这个类别定义了一种用于通过IP网络连接人机界面设备的设备。它允许用户通过IP协议与设备进行交互和控制,例如通过远程访问控制计算机的鼠标、键盘或触摸屏等输入设备。 -
IP Custom Human Interface Device Class(IP自定义人机界面设备类):
这个类别定义了一种用于通过IP网络连接自定义人机界面设备的设备。它提供了灵活的接口和协议,使设备能够与计算机或其他设备进行自定义的人机界面交互和控制。 -
IP Mass Storage Device Class(IP大容量存储设备类):
这个类别定义了一种用于通过IP网络连接大容量存储设备的设备。它允许用户通过IP协议访问、传输和管理存储设备上的文件和数据,类似于传统的USB大容量存储设备(如U盘或移动硬盘)的功能。
这些类别定义了一系列标准化的接口和协议,使设备能够在IP网络环境中进行数据传输、通信和控制。每个类别都有特定的功能和行为,适用于不同类型的设备和应用场景。
以下是一些与STM32 Custom Human Interface Device Class相关的参数说明:
-
CUSTOM_HID_FS_BINTERVAL:这是一个用于Full Speed USB传输的间隔时间参数。它定义了数据包之间的时间间隔,以控制数据传输的频率和稳定性。
-
USBD_CUSTOM_HID_REPORT_DESC_SIZE:这是报告描述符的总长度。报告描述符是用于定义设备支持的报告格式和功能的数据结构。该参数定义了报告描述符在输入(IN)端点中的长度。
-
USBD_CUSTOMHID_OUTREPORT_BUF_SIZE:这是输出(OUT)端点的最大报告缓冲区大小。它定义了设备接收来自主机的报告数据的最大容量。
基本参数:
-
USBD_MAX_NUM_INTERFACES:支持的最大接口数量。这定义了设备支持的最大接口数,决定了设备可以提供的功能和服务。
-
USBD_MAX_NUM_CONFIGURATION:支持的最大配置数量。这定义了设备支持的最大配置数,每个配置可以包含一个或多个接口。
-
USBD_MAX_STR_DESC_SIZ:字符串描述符的最大大小。字符串描述符用于提供与设备相关的文本信息,如设备名称、制造商信息等。该参数定义了字符串描述符可以使用的最大字节数,范围在1字节到64K字节之间。
-
USBD_SELF_POWERED:自供电使能标志。设置为1表示设备是自供电的,设置为0表示设备依赖于外部电源。
-
USBD_DEBUG_LEVEL:USBD调试级别。该参数定义了USBD库输出调试信息的详细程度。可以根据需要设置为不同的级别,例如0表示禁用调试输出,1表示基本级别,2表示详细级别。
请注意,这些参数是用于配置和定义STM32 Custom Human Interface Device Class的一些基本特性和行为。在使用和配置设备时,需要根据实际需求和设备规格进行适当的调整和设置。
设备描述符相关的参数说明:
-
VID(供应商标识符):VID是供应商标识符,用于唯一标识设备的制造商。它的取值范围是0到65,535(十六进制为0x0000到0xFFFF)。该参数用于设备描述符中的供应商标识符字段,以标识设备的制造商。
-
LANGID_STRING(语言标识符):LANGID_STRING是语言标识符,用于指定字符串描述符所使用的语言。它表示字符串描述符中使用的语言代码,例如英语、中文等。该参数用于语言标识符字符串描述符。
-
MANUFACTURER_STRING(制造商标识符):MANUFACTURER_STRING是制造商标识符,用于标识设备的制造商名称。它表示制造商的字符串描述符标识符,用于提供设备制造商的名称或标识。该参数用于制造商字符串描述符。
这些参数在设备描述符中用于提供关于设备制造商、供应商标识和语言标识的信息。在配置设备时,需要根据实际需求和制造商的标识来设置这些参数,以确保设备能够正确地被识别和识别。请注意,VID必须是唯一的,并且LANGID_STRING表示字符串描述符所使用的语言代码。
产品描述符相关的参数说明:
-
PID(产品标识符):PID是产品标识符,用于唯一标识设备的产品。它的取值范围是0到65,535(十六进制为0x0000到0xFFFF)。该参数用于设备描述符中的产品标识符字段,以标识设备的产品。
-
PRODUCT_STRING(产品标识符):PRODUCT_STRING是产品标识符,用于标识设备的产品名称或标识。它表示产品字符串描述符标识符,用于提供设备产品的名称或标识。该参数用于产品字符串描述符。
-
CONFIGURATION_STRING(配置标识符):CONFIGURATION_STRING是配置标识符,用于标识设备的配置。它表示配置字符串描述符标识符,用于提供设备配置的名称或标识。该参数用于配置字符串描述符。
-
INTERFACE_STRING(接口标识符):INTERFACE_STRING是接口标识符,用于标识设备的接口。它表示接口字符串描述符标识符,用于提供设备接口的名称或标识。该参数用于接口字符串描述符。
这些参数在产品描述符和相关的字符串描述符中用于提供关于设备产品、配置和接口的信息。在配置设备时,需要根据实际产品和配置的标识来设置这些参数,以确保设备能够正确地被识别和识别。请注意,PID必须是唯一的,并且这些字符串描述符用于提供相应标识的名称或标识。
在usbd_custom_hid_if.c文件中,CUSTOM_HID_ReportDesc_FS定义数组内部添加如下数据
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
/* USER CODE BEGIN 0 */
0x06, 0x00, 0xFF, /* 使用页面 (厂商页面: 0xFF00) */
0x09, 0x01, /* 使用 (演示套件) */
0xa1, 0x01, /* 集合 (应用程序) */
/* 6 */
// 输入报告
0x09, 0x01, /* 使用ID - 厂商自定义 */
0x15, 0x00, /* 逻辑最小值 (0) */
0x26, 0XFF, 0X00, /* 逻辑最大值 (255) */
0x75, 0x08, /* 报告大小 (8位) */
0x95, 0X40, /* 报告计数:发送长度 (64字节) */
0x81, 0x02, /* 输入 (数据,可变,绝对) */
// 19
// 输出报告
0x09, 0x01, /* 使用ID - 厂商自定义 */
0x15, 0x00, /* 逻辑最小值 (0) */
0x26, 0XFF, 0X00, /* 逻辑最大值 (255) */
0x75, 0x08, /* 报告大小 (8位) */
0x95, 0X40, /* 报告计数:接收长度 (64字节) */
0x91, 0x02, /* 输出 (数据,可变,绝对) */
// 32
// 特征报告
/* 45 */
//#endif
/* USER CODE END 0 */
0xC0 /* 结束集合 */
};
打开usbd_desc.c文件找到一下宏定义
#define USBD_VID 1155 // VID (Vendor IDentifier),供应商标识符
#define USBD_LANGID_STRING 1033 // LANGID_STRING (Language Identifier),语言标识符 英文
#define USBD_MANUFACTURER_STRING "STMicroelectronics" // MANUFACTURER_STRING (Manufacturer Identifier),制造商标识符
#define USBD_PID_FS 22352 // PID (Product IDentifier),产品标识符
#define USBD_PRODUCT_STRING_FS "STM32 Custom Human interface" // PRODUCT_STRING (Product Identifier),产品标识符
#define USBD_CONFIGURATION_STRING_FS "Custom HID Config" // CONFIGURATION_STRING (Configuration Identifier),配置标识符
#define USBD_INTERFACE_STRING_FS "Custom HID Interface" // INTERFACE_STRING (Interface Identifier),接口标识符
这里将通过USBD_PRODUCT_STRING_FS 名字改一下便于我们识别设备这里改为test hid
这时编译下载后,插上电脑在其他设备中能看到我们的设备(如果出现叹号或未知设备,检查CUSTOM_HID_ReportDesc_FS数组)
将设备更改为回环模式
代码中封装了发送函数,但是没有接收函数,这里我们在回调函数中添加接收标志位,然后在主函数中强制转换数据类型,然后拿到数据。
打开 **usbd_custom_hid_if.c*,找到 static int8_t CUSTOM_HID_OutEvent_FS(uint8_t event_idx, uint8_t state) 该函数;
注意我这里定义了一个全局变量 uint8_t usb_rx_flag ; 用来标接受标记位。
uint8_t usb_rx_flag ;
/**
* @brief Manage the CUSTOM HID class events
* @param event_idx: Event index
* @param state: Event state
* @retval USBD_OK if all operations are OK else USBD_FAIL
*/
static int8_t CUSTOM_HID_OutEvent_FS(uint8_t event_idx, uint8_t state)
{
/* USER CODE BEGIN 6 */
//strncpy(recv,hhid->Report_buf,64);
usb_rx_flag = 1;
return (USBD_OK);
/* USER CODE END 6 */
}
主函数文章来源:https://www.toymoban.com/news/detail-736834.html
if(usb_rx_flag)
{
// 数据类型强制转换 ,具体数据结构可以查看USB初始化过程
USBD_CUSTOM_HID_HandleTypeDef *hhid;
hhid = (USBD_CUSTOM_HID_HandleTypeDef *)hUsbDeviceFS.pClassData;
//消息回传,并点灯,提示消息
if(USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, hhid->Report_buf, 64) == USBD_OK)
{
//转发至串口 方便查看数据
for(int i =0 ;i< 64 ; i++)
{
printf("%x", hhid->Report_buf[i]);
}
}
}
这里具体转化详情请自行go to define ,发送函数使用的是 USBD_CUSTOM_HID_SendReport 函数 ,接受通过回调函数接受文章来源地址https://www.toymoban.com/news/detail-736834.html
到了这里,关于STM32自定义HID(模拟厂家设备)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!