STM32 Customed HID开发流程

本文介绍的是STM32的cubeMX自定义HID的开发流程

  1. cubeMX配置customed HID模式。更多详细配置壳查看代码CubeMX的配置文件。

  2. 修改usbd_custome_hid_if.c 里面的CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] 数组。根据填入的数组内容修改宏USBD_CUSTOM_HID_REPORT_DESC_SIZE尺寸为34
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
/* USER CODE BEGIN 0 */ //#ifdef usga
//0x05, 0x8c, /* USAGE_PAGE (ST Page) */
0x06, 0xFF, 0x00, /* USAGE_PAGE (Vendor Page: 0xFF00) */
0x09, 0x01, /* USAGE (Demo Kit) */
0xa1, 0x01, /* COLLECTION (Application) */
/* 6 */ // The Input report
0x09,0x03, // USAGE ID - Vendor defined
0x15,0x00, // LOGICAL_MINIMUM (0)
0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255)
0x75,0x08, // REPORT_SIZE (8)
0x95,64, // REPORT_COUNT :SendLength
0x81,0x02, // INPUT (Data,Var,Abs)
//19
// The Output report
0x09,0x04, // USAGE ID - Vendor defined
0x15,0x00, // LOGICAL_MINIMUM (0)
0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255)
0x75,0x08, // REPORT_SIZE (8)
0x95,64, // REPORT_COUNT:ReceiveLength
0x91,0x02, // OUTPUT (Data,Var,Abs)
//32
// The Feature report /* 45 */
0xc0 /* END_COLLECTION */
//#endif /* USER CODE END 0 */ /* END_COLLECTION */
};

3.修改usbd_customhid.c 中的如下数组.

__ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_CfgDesc[USB_CUSTOM_HID_CONFIG_DESC_SIZ] __ALIGN_END =
{
0x09, /* bLength: Configuration Descriptor size */
USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */
USB_CUSTOM_HID_CONFIG_DESC_SIZ,
/* wTotalLength: Bytes returned */
0x00,
0x01, /*bNumInterfaces: 1 interface*/
0x01, /*bConfigurationValue: Configuration value*/
0x00, /*iConfiguration: Index of string descriptor describing
the configuration*/
0xC0, /*bmAttributes: bus powered */
0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/ /************** Descriptor of CUSTOM HID interface ****************/
/* 09 */
0x09, /*bLength: Interface Descriptor size*/
USB_DESC_TYPE_INTERFACE,/*bDescriptorType: Interface descriptor type*/
0x00, /*bInterfaceNumber: Number of Interface*/
0x00, /*bAlternateSetting: Alternate setting*/
0x02, /*bNumEndpoints*/
0x03, /*bInterfaceClass: CUSTOM_HID*/
0x00, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
0x00, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
0, /*iInterface: Index of string descriptor*/
/******************** Descriptor of CUSTOM_HID *************************/
/* 18 */
0x09, /*bLength: CUSTOM_HID Descriptor size*/
CUSTOM_HID_DESCRIPTOR_TYPE, /*bDescriptorType: CUSTOM_HID*/
0x11, /*bCUSTOM_HIDUSTOM_HID: CUSTOM_HID Class Spec release number*/
0x01,
0x00, /*bCountryCode: Hardware target country*/
0x01, /*bNumDescriptors: Number of CUSTOM_HID class descriptors to follow*/
0x22, /*bDescriptorType*/
USBD_CUSTOM_HID_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/
0x00,
/******************** Descriptor of Custom HID endpoints ********************/
/* 27 */
0x07, /*bLength: Endpoint Descriptor size*/
USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/ CUSTOM_HID_EPIN_ADDR, /*bEndpointAddress: Endpoint Address (IN)*/
0x03, /*bmAttributes: Interrupt endpoint*/
CUSTOM_HID_EPIN_SIZE, /*wMaxPacketSize: 2 Byte max */
0x00,
0x05, /*bInterval: Polling Interval (5ms)*/ //这边修改的是IN通信的速率,数值越小,速率越快。最快1000hz。
/* 34 */ 0x07, /* bLength: Endpoint Descriptor size */
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: */
CUSTOM_HID_EPOUT_ADDR, /*bEndpointAddress: Endpoint Address (OUT)*/
0x03, /* bmAttributes: Interrupt endpoint */
CUSTOM_HID_EPOUT_SIZE, /* wMaxPacketSize: 2 Bytes max *///这边修改的是OUT通信的速率,数值越小,速率越快。最快1000hz。
0x00,
0x05, /* bInterval: Polling Interval (5 ms) */
/* 41 */
} ; /* USB CUSTOM_HID device Configuration Descriptor */
__ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_Desc[USB_CUSTOM_HID_DESC_SIZ] __ALIGN_END =
{
/* 18 */
0x09, /*bLength: CUSTOM_HID Descriptor size*/
CUSTOM_HID_DESCRIPTOR_TYPE, /*bDescriptorType: CUSTOM_HID*/
0x11, /*bCUSTOM_HIDUSTOM_HID: CUSTOM_HID Class Spec release number*/
0x01,
0x00, /*bCountryCode: Hardware target country*/
0x01, /*bNumDescriptors: Number of CUSTOM_HID class descriptors to follow*/
0x22, /*bDescriptorType*/
USBD_CUSTOM_HID_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/
0x00,
};

5.修改

   #define CUSTOM_HID_EPIN_SIZE                 0x40
#define CUSTOM_HID_EPOUT_SIZE 0x40
#define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE 64
#define USBD_CUSTOM_HID_REPORT_DESC_SIZE 34

6.这个时候全局编译,下载程序到控制板。接着将控制板USB查到PC电脑端,顺利的话会看到“设备管理器”里面的“人体输入学设备”识别到了“hid-compliant device”。

好!到此为止说明我们的USB HID枚举部分修改成功。下面进行发送和接收的操作。

7.发送数据

发送数据包是最简单的,只要调用USBD_CUSTOM_HID_SendReport函数即可。

8.接收数据

接收数据相对发送要复杂一点。HAL库已经封装了底层的接收数据处理,所以用户主要知道:当芯片完成一组数据接收的时候,中断会调用CUSTOM_HID_OutEvent_FS这样一个回调函数。那本文就在这个回调函数里面设置了一个falg。如下:

static int8_t CUSTOM_HID_OutEvent_FS(uint8_t event_idx, uint8_t state)
{
/* USER CODE BEGIN 6 */
//flag设置成SET,代表有数据到来
USB_Out_Flag=SET;
return (USBD_OK);
/* USER CODE END 6 */
}

而在main主循环函数中,我实时判断这个flag是否set了。如果set了就表示中断接收到一组数据,然后我们就可以读数据了。本文读数据函数如下:

/**
* @brief 接收从USB获取的数据
* @param data 数据存储首地址
* @param dataNum 准备读取的数据字节数
* @retval 读取的字节数
*/
uint32_t USB_GetData(uint8_t *data,uint32_t dataNum)
{
uint32_t len=0;
USBD_CUSTOM_HID_HandleTypeDef *hhid;
hhid = (USBD_CUSTOM_HID_HandleTypeDef*)hUsbDeviceFS.pClassData;//得到接收的地址 for(len=0;len<dataNum;len++){
*data=hhid->Report_buf[len];
data++;
}
return dataNum;
}

9.到此,自定义HID基本讲解完毕,本文在main函数中实现一个USB_Mission应用。大体思路如下:判断有没有上位机发送过来的数据,如果有则解码数据,根据解析的数据回送上位机需要的数据。详情请查看代码。完整的代码GitHub地址

-----------------本文作者“智御电子”,期待与电子爱好者交流学习。----------------

STM32利用CUBEMX建立自定义HID工程,并且完成64字节的IN,OUT传输功能。的更多相关文章

  1. 转载 STM32 使用Cubemx 建一个USB(HID)设备下位机,实现数据收发

    STM32 使用Cubemx 建一个USB(HID)设备下位机,实现数据收发  本文转载自 https://www.cnblogs.com/xingboy/p/9913963.html 这里我主要说一 ...

  2. STM32 使用Cubemx 建一个USB(HID)设备下位机,实现数据收发

    这里我主要说一下如何做一个USB下位机,这里主要分3部分:1.建立工程:2.添加报文描述符:3.数据的传输.这里就不讲USB的理论知识了,有想要了解的自行百度一下就可以了. 建立工程:工程建立参考:h ...

  3. USB自定义HID设备实现-STM32

    该文档使用USB固件库,在其基础上进行了自己的定制,完成了一个USB-HID设备,首先是usb_desc.c文件,里面存放了usb各种描述符的存在 #include "usb_desc.h& ...

  4. STM32 USB开发(三) 基于F105RBT6核心板开发的自定义HID收发(FS)

    硬件设计 该核心板的USB插口有两个,一个是用于USB Slave的,可以用来做HID设备,把模拟STM32模拟为U盘等:另一个是USB Host设备,可以对插上的U盘的数据进行读写. 图中J2是Mi ...

  5. 利用STM32CubeMX来生成USB_HID_Mouse工程【添加ADC】(1)

    现在原来的基础上添加ADC的功能. 现在(利用STM32CubeMX来生成USB_HID_Mouse工程)基础上新增硬件 JoyStick Shield 游戏摇杆扩展板 与STM32F103C8的连接 ...

  6. STM32利用TIM3产生一个1--100Hz可调频率

    目标:利用TIM3结合普通GPIO实现一个1--100HZ的可控频率,误差在0.5HZ以内 核心:要实现该功能首先要明确频率的定义,频率就是1秒内发生周期性变化的次数,例如一个正弦波,1S内,走了15 ...

  7. 如何利用 Visual Studio 自定义项目或工程模板

    在开发项目的时候,由其是商业性质的大型项目时,往往需要在每个代码文件上都加上一段关于版权.开发人员的信息,并且名称空间上都需要带有公司的标志.这个时候,是选择在开发的时候手动添加还是自动生成呢? 我们 ...

  8. 利用connect建立前端开发服务器

    利用connect建立前端开发服务器 对于前后端完全分离的系统,开发时候我们需要给前端配置服务器,当然我们可以选择Nginx之类的服务器进行配置,但我们也能使用NodeJS构建高自由度的前端开发服务器 ...

  9. 利用WPF建立自己的3d gis软件(非axhost方式)(十)SDK中一些自带的展示面板应用

    原文:利用WPF建立自己的3d gis软件(非axhost方式)(十)SDK中一些自带的展示面板应用 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV ...

随机推荐

  1. 【 PostgreSQL】十条实用数据库SQL优化建议

    基于PostgreSQL,总结几条常用的查询操作的优化建议,部分也适用于Oracle等数据库. 1.选择合适的分布键 分布键选择不当会导致重分布.数据分布不均等,而数据分布不均会使SQL集中在一个se ...

  2. ext3 转 ext4 操作

    先关闭相关服务 cd / umount /dev/vg_nosql/nosql tune2fs -O has_journal,extents,huge_file,flex_bg,uninit_bg,d ...

  3. Java学习---Pinyin4j使用手册

    一般用法 pinyin4j的使用很方便,一般转换只需要使用PinyinHelper类的静态工具方法即可: String[] pinyin = PinyinHelper.toHanyuPinyinStr ...

  4. iOS开发之UIView

    在iPhone里你能看到的.摸到的,都是UIView. 视图坐标系统: UIKit中的坐标都是基于这样的坐标系统:以左上角为坐标的原点,原点向下和向右为坐标轴方向. 坐标值由浮点数来表示,内容的布局和 ...

  5. 转 linux设置开机服务自动启动/关闭自动启动命令 chkconfig

    原文连接http://blog.csdn.net/jiangguilong2000/article/details/8259360 chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行 ...

  6. javaservlet处理四种常用api请求get,put,post,delete

    一般在网站搭建中servlet只需处理post,get请求便足已.本篇注重使用javaweb编写restful风格api,在servlet中对四种常用请求进行处理. 在api中对于一个请求要做的通常是 ...

  7. Java类修饰符的使用与作用以及常见问题

    首先明确,类是放在文件里的,在文件里面的不同位置就有不同的作用,就是不同类型的类. 1, 顶级类or外部类:包括两种,一个文件中与文件名同名称的类我们称作顶级类(也是外部类),如果在一个文件中的一个类 ...

  8. pushlet服务端推送——多播

    版权声明:本文为博主牟云飞原创文章.未经博主同意不得转载. https://blog.csdn.net/myfmyfmyfmyf/article/details/36364337 ---------- ...

  9. Inno Setup 安装

    Inno Setup 安装 一.软件下载:http://www.jrsoftware.org/isdl.php#qsp 二.下载后,双击进行安装(包括inno Setup Compiler和Inno ...

  10. Selenium封装

    import os from selenium import webdriver from selenium.webdriver.common.by import By from selenium.w ...