STM32自定义HID(模拟厂家设备)

(如果对您有帮助记得点赞哦)

与上位机调试软件配合,
QT编写的调试助手:QT HID调试助手
源码:源码链接
QT上位机教程:教程地址
笔者这边硬件是TM32F103RCT6
软件使用CubeMX生成HID设备
首先配置单片机的基本时钟,调试方式等
本文主要讲解USBHID配置
勾选如图所示
勾选如上图所示
在这里插入图片描述
勾选
在这里插入图片描述
下面是对这几种模式的简要介绍:

  1. IP Audio Device Class(IP音频设备类):
    这个类别定义了一种用于在IP网络上传输音频数据的设备。它允许音频设备通过IP协议与计算机或其他设备进行通信,从而实现音频数据的传输和控制。

  2. IP Communication Device Class(IP通信设备类):
    这个类别定义了一种用于在IP网络上进行通信的设备。它提供了一套标准接口和协议,使设备能够与计算机或其他设备进行数据交换、实时通信和控制。

  3. IP Download Firmware Update Class(IP固件下载更新类):
    这个类别定义了一种用于通过IP网络下载和更新设备固件的设备。它提供了一套标准协议和接口,使设备能够通过IP协议接收、存储和安装固件更新。

  4. IP Human Interface Device Class(IP人机界面设备类):
    这个类别定义了一种用于通过IP网络连接人机界面设备的设备。它允许用户通过IP协议与设备进行交互和控制,例如通过远程访问控制计算机的鼠标、键盘或触摸屏等输入设备。

  5. IP Custom Human Interface Device Class(IP自定义人机界面设备类):
    这个类别定义了一种用于通过IP网络连接自定义人机界面设备的设备。它提供了灵活的接口和协议,使设备能够与计算机或其他设备进行自定义的人机界面交互和控制。

  6. IP Mass Storage Device Class(IP大容量存储设备类):
    这个类别定义了一种用于通过IP网络连接大容量存储设备的设备。它允许用户通过IP协议访问、传输和管理存储设备上的文件和数据,类似于传统的USB大容量存储设备(如U盘或移动硬盘)的功能。

这些类别定义了一系列标准化的接口和协议,使设备能够在IP网络环境中进行数据传输、通信和控制。每个类别都有特定的功能和行为,适用于不同类型的设备和应用场景。

在这里插入图片描述
以下是一些与STM32 Custom Human Interface Device Class相关的参数说明:

  1. CUSTOM_HID_FS_BINTERVAL:这是一个用于Full Speed USB传输的间隔时间参数。它定义了数据包之间的时间间隔,以控制数据传输的频率和稳定性。

  2. USBD_CUSTOM_HID_REPORT_DESC_SIZE:这是报告描述符的总长度。报告描述符是用于定义设备支持的报告格式和功能的数据结构。该参数定义了报告描述符在输入(IN)端点中的长度。

  3. 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的一些基本特性和行为。在使用和配置设备时,需要根据实际需求和设备规格进行适当的调整和设置。
在这里插入图片描述
设备描述符相关的参数说明:

  1. VID(供应商标识符):VID是供应商标识符,用于唯一标识设备的制造商。它的取值范围是0到65,535(十六进制为0x0000到0xFFFF)。该参数用于设备描述符中的供应商标识符字段,以标识设备的制造商。

  2. LANGID_STRING(语言标识符):LANGID_STRING是语言标识符,用于指定字符串描述符所使用的语言。它表示字符串描述符中使用的语言代码,例如英语、中文等。该参数用于语言标识符字符串描述符。

  3. MANUFACTURER_STRING(制造商标识符):MANUFACTURER_STRING是制造商标识符,用于标识设备的制造商名称。它表示制造商的字符串描述符标识符,用于提供设备制造商的名称或标识。该参数用于制造商字符串描述符。

这些参数在设备描述符中用于提供关于设备制造商、供应商标识和语言标识的信息。在配置设备时,需要根据实际需求和制造商的标识来设置这些参数,以确保设备能够正确地被识别和识别。请注意,VID必须是唯一的,并且LANGID_STRING表示字符串描述符所使用的语言代码。

产品描述符相关的参数说明:

  1. PID(产品标识符):PID是产品标识符,用于唯一标识设备的产品。它的取值范围是0到65,535(十六进制为0x0000到0xFFFF)。该参数用于设备描述符中的产品标识符字段,以标识设备的产品。

  2. PRODUCT_STRING(产品标识符):PRODUCT_STRING是产品标识符,用于标识设备的产品名称或标识。它表示产品字符串描述符标识符,用于提供设备产品的名称或标识。该参数用于产品字符串描述符。

  3. CONFIGURATION_STRING(配置标识符):CONFIGURATION_STRING是配置标识符,用于标识设备的配置。它表示配置字符串描述符标识符,用于提供设备配置的名称或标识。该参数用于配置字符串描述符。

  4. 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 */
}

主函数

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 函数 ,接受通过回调函数接受

  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,以下是一个基于STM32自定义HID通信示例程序,使用HAL库进行驱动,代码注释中有详细的说明: ```c #include "main.h" #include "usbd_core.h" #include "usbd_desc.h" #include "usbd_hid.h" #include "usbd_hid_if.h" // USB Device Handle USBD_HandleTypeDef hUsbDeviceFS; // HID Report Descriptor __ALIGN_BEGIN static uint8_t HID_ReportDesc_FS[USBD_HID_REPORT_DESC_SIZE] __ALIGN_END = { 0x06, 0x00, 0xFF, // USAGE_PAGE (Vendor Defined Page 1) 0x09, 0x01, // USAGE (Vendor Usage 1) 0xA1, 0x01, // COLLECTION (Application) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x26, 0xFF, 0x00, // LOGICAL_MAXIMUM (255) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x40, // REPORT_COUNT (64) 0x09, 0x01, // USAGE (Vendor Usage 1) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x09, 0x01, // USAGE (Vendor Usage 1) 0x91, 0x02, // OUTPUT (Data,Var,Abs) 0xC0 // END_COLLECTION }; // USB Device Descriptor __ALIGN_BEGIN static uint8_t USBD_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = { 0x12, // bLength USB_DESC_TYPE_DEVICE, // bDescriptorType 0x00, // bcdUSB 0x02, // bcdUSB 0xFF, // bDeviceClass 0x00, // bDeviceSubClass 0x00, // bDeviceProtocol USB_MAX_EP0_SIZE, // bMaxPacketSize LOBYTE(USB_VID), // idVendor HIBYTE(USB_VID), // idVendor LOBYTE(USB_PID), // idProduct HIBYTE(USB_PID), // idProduct 0x00, // bcdDevice rel. 2.00 0x02, // bcdDevice rel. 2.00 USBD_IDX_MFC_STR, // Index of manufacturer string USBD_IDX_PRODUCT_STR, // Index of product string USBD_IDX_SERIAL_STR, // Index of serial number string USBD_MAX_NUM_CONFIGURATION // bNumConfigurations }; // USB HID Configuration Descriptor __ALIGN_BEGIN static uint8_t USBD_HID_Desc[USB_HID_DESC_SIZ] __ALIGN_END = { 0x09, // bLength: HID Descriptor size HID_DESCRIPTOR_TYPE, // bDescriptorType: HID 0x11, 0x01, // bcdHID: HID Class Spec release number 0x00, // bCountryCode: Hardware target country 0x01, // bNumDescriptors: Number of HID class descriptors to follow 0x22, // bDescriptorType sizeof(HID_ReportDesc_FS), // wItemLength: Total length of Report descriptor 0x00 }; // USB HID Configuration __ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_END = { 0x09, // bLength: Configuration Descriptor size USB_DESC_TYPE_CONFIGURATION, // bDescriptorType: Configuration USB_HID_CONFIG_DESC_SIZ, 0x00, // wTotalLength: Total length of the configuration 0x01, // bNumInterfaces: Number of interfaces 0x01, // bConfigurationValue: Configuration value 0x00, // iConfiguration: Index of string descriptor describing the configuration 0xC0, // bmAttributes: Bus powered and no remote wakeup 0x32, // MaxPower 100 mA: this current is used for detecting Vbus // Interface Descriptor 0x09, // bLength: Interface Descriptor size USB_DESC_TYPE_INTERFACE, // bDescriptorType: Interface 0x00, // bInterfaceNumber: Number of Interface 0x00, // bAlternateSetting: Alternate setting 0x02, // bNumEndpoints 0x03, // bInterfaceClass: HID 0x00, // bInterfaceSubClass: 1=BOOT, 0=no boot 0x00, // bInterfaceProtocol: 0=none, 1=keyboard, 2=mouse 0x00, // iInterface: Index of string descriptor // HID Descriptor 0x09, // bLength: HID Descriptor size HID_DESCRIPTOR_TYPE, // bDescriptorType: HID 0x11, 0x01, // bcdHID: HID Class Spec release number 0x00, // bCountryCode: Hardware target country 0x01, // bNumDescriptors: Number of HID class descriptors to follow 0x22, // bDescriptorType sizeof(HID_ReportDesc_FS), // wItemLength: Total length of Report descriptor 0x00, // Endpoint Descriptor 0x07, // bLength: Endpoint Descriptor size USB_DESC_TYPE_ENDPOINT, // bDescriptorType: Endpoint HID_EPIN_ADDR, // bEndpointAddress: Endpoint Address (IN) USBD_EP_TYPE_INTR, // bmAttributes: Interrupt endpoint LOBYTE(HID_EPIN_SIZE), // wMaxPacketSize: 64 bytes max HIBYTE(HID_EPIN_SIZE), HID_FS_BINTERVAL, // bInterval: Polling Interval (10 ms) // Endpoint Descriptor 0x07, // bLength: Endpoint Descriptor size USB_DESC_TYPE_ENDPOINT, // bDescriptorType: Endpoint HID_EPOUT_ADDR, // bEndpointAddress: Endpoint Address (OUT) USBD_EP_TYPE_INTR, // bmAttributes: Interrupt endpoint LOBYTE(HID_EPOUT_SIZE), // wMaxPacketSize: 64 bytes max HIBYTE(HID_EPOUT_SIZE), HID_FS_BINTERVAL // bInterval: Polling Interval (10 ms) }; // USB Device Initialization Function static void MX_USB_DEVICE_Init(void) { // Init Device Library USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS); // Add Supported Class USBD_RegisterClass(&hUsbDeviceFS, &USBD_HID); // Add HID Interface USBD_HID_RegisterInterface(&hUsbDeviceFS, &USBD_HID_fops); // Start Device Process USBD_Start(&hUsbDeviceFS); } int main(void) { // Initialize HAL Library HAL_Init(); // Configure the System Clock SystemClock_Config(); // Initialize USB Device MX_USB_DEVICE_Init(); while (1) { // Main Loop } } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { // Handle EXTI Interrupts if (GPIO_Pin == GPIO_PIN_13) { // Send HID Report uint8_t data[64] = {0}; // HID Report Data data[0] = 0x01; // Report ID data[1] = HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13); // Button State USBD_HID_SendReport(&hUsbDeviceFS, data, 64); } } // USB Interrupt Handler void OTG_FS_IRQHandler(void) { HAL_PCD_IRQHandler(&hUsbDeviceFS.pcd); } ``` 使用该示例程序时,需要先在CubeMX中配置USB Device和HID功能,然后生成代码并添加相应的驱动文件,具体操作可以参考ST官方文档。在本示例程序中,我们通过PC13引脚的状态来控制HID Report的发送,当PC13引脚被按下时,就会发送一个包含Report ID和Button State的HID Report。你也可以根据自己的需求来修改此处的代码。注意,该示例程序只是一个简单的示例,实际应用中需要根据自己的需求来编写相应的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点灯大神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值