使用STM32CubeMX生成HID工程

  • 1. 使用STM32CubeMX生成USB HID工程
  • 2. 修改新建的工程
    • 修改报告描述表
    • 修改端点大小
  • 3. 上下传数据
    • EP1上传数据
    • EP2下传数据
    • Feature Report上下传数据
  • 4. 小结

1. 使用STM32CubeMX生成USB HID工程

这里使用的是STM32F072 Discovery开发板,在MCU型号选中对应的STM32F072RBTx。

接下来配置USB外设,需设置PA11和PA12为USB的DP DM功能,选择USB_Device Class为 Custom Human Interface Device Class(HID) ,最好再打开SWD调试功能,否则无法下载调试。

时钟配置,USB FS Device Clock需要48M,这里可设置STM32F072的USB时钟为内部HSI 48M,并设为主时钟。

最后生成完整的工程,这里生成的为STM32Cube IDE工程,毕竟是ST新推出的开发工具,还是得多使用下。

2. 修改新建的工程

上面新建完成的工程只是一个基本的工程,需稍微修改下,才能变为可以使用的自定义USB HID设备。

修改报告描述表

默认报告描述表为空的,需要修改为自定义设备的报告描述表,找到usbd_custom_hid_if.c中的CUSTOM_HID_ReportDesc_FS,添加描述表如下

// ReportDesc
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{//  /* USER CODE BEGIN 0 */
//  0x00,
//  /* USER CODE END 0 */
//  0xC0    /*     END_COLLECTION                */0x06,0xFF,0xFF,      //UsagePageVendor(0xFF)0x09,0x01,               //Usage(1)0xA1,0x01,                    // collection (application)0x15,0x00,                   //logical minimum (0)0x26,0xFF,0x00,                //logical maximum (0xFF)0x75,0x08,                  //report size(8)0x95,0x40,                  //report count(64)0x09,0x02,                //Usage(2)0x81,0x02,                    // input (data, variable, absolute)0x09,0x03,               //Usage(3)0x91,0x02,                    // output (data, variable, absolute)0x0A,0x00,0xFF,         //UsageS(0xFF00)0x0B1,0x02,                 //feature (data, variable, absolute)0x0C0,              //end collection};

上面描述表分别定义了Input、Ouput、Feature三个报告,Input用于MCU上传数据,Output下传数据,Feature可用于上下传数据。所有报告大小定义为64byte,每次最大上下传数据量也就为64byte,另外数组USBD_CUSTOM_HID_REPORT_DESC_SIZE也要对应修改为30。

修改端点大小

要能最大上下传64byte数据,还需修改对应上下传端点大小为64,相关定义在Middlewares\ST\STM32_USB_Device_Library\Class\CustomHID\Srcusbd_customhid.h中

//usbd_customhid.h
#define CUSTOM_HID_EPIN_ADDR                 0x81U
#define CUSTOM_HID_EPIN_SIZE                 0x40   //0x02U Modify#define CUSTOM_HID_EPOUT_ADDR                0x02U    //0x01U Modify
#define CUSTOM_HID_EPOUT_SIZE                0x40   //0x02U Modify
//usbd_conf.h
//确认下OutReport Buffer Size也为64byte
/*---------- -----------*/
#define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE     64

ADDR中最高位代表端点的方向,1对应IN,0对应OUT,剩下7位为端点号,0x81代表端点1为IN Endpoint (EP1),这里修改为OUT的端点为Endpoint 2 (EP2),两个端点的SIZE也由2改为64。

   如果需要配置USB Device的VID、PID、Product、Manufacturer等信息,对应修改usbd_desc.c中定义

//usbd_desc.c
#define USBD_VID     0x483
#define USBD_LANGID_STRING     1033
#define USBD_MANUFACTURER_STRING     "STMicroelectronics"
#define USBD_PID_FS     0x5751
#define USBD_PRODUCT_STRING_FS     "STM32 Custom Human interface"
#define USBD_CONFIGURATION_STRING_FS     "Custom HID Config"
#define USBD_INTERFACE_STRING_FS     "Custom HID Interface"

3. 上下传数据

编译修改后的工程,下载到开发板,插上USB接口后就会枚举HID-vendor-defined device设备上去。

EP1上传数据

添加上传数据功能,USB 库里已经有写好上传函数USBD_CUSTOM_HID_SendReport,会透过EP1上传数据,调用就可以上传数据,在主循环中添加上传数据功能。

int main(void)
{uint8_t bEP1_SendBuf[64] = { 0 };/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USB_DEVICE_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *///上传64byte数据,hUsbDeviceFS需要在usb_device.h extern声明来使用if(USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, bEP1_SendBuf, 64) == USBD_OK){bEP1_SendBuf[0]++;}/* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

编译下载后,STM32F072 USB端口会一直上传数据,间隔为设置的Polling Interval,最快1ms。

EP2下传数据

工程中已设置好通过EP2来接收主机Out数据,windows下可借助Bushound工具来发送Out data,勾选并双击对应的USB Input Device,在弹出的界面中选中Endpoint 2,Endpoint 2即为中断Out端点,设置Data Length为64,并在下方填入要下发的数据。

当点击Run时,USB Out数据会传输到MCU中,此时USB中断会有相应标志置起,并会调用相关Callback Function,在usbd_customhid.c USBD_CUSTOM_HID_DataOut中可看到数据已接收到hhid->Report_buf中,接下来可做相关处理。

//usbd_customhid.c
static uint8_t  USBD_CUSTOM_HID_DataOut(USBD_HandleTypeDef *pdev,uint8_t epnum)
{USBD_CUSTOM_HID_HandleTypeDef     *hhid = (USBD_CUSTOM_HID_HandleTypeDef *)pdev->pClassData;((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData)->OutEvent(hhid->Report_buf[0],hhid->Report_buf[1]);USBD_LL_PrepareReceive(pdev, CUSTOM_HID_EPOUT_ADDR, hhid->Report_buf,USBD_CUSTOMHID_OUTREPORT_BUF_SIZE);return USBD_OK;
}

Feature Report上下传数据

前面EP1 In和EP2 Out为中断端点上下传,因描述表中有定义Feature报告,现在可通过控制端点EP0来进行Get/Set Feature Report数据传输。

  • Set Feature
      通过BusHound下发Set Feature Report数据
  • Get Feature
      通过BusHound接收Get Feature Report数据

    MCU对应接收和回复数据在usbd_customhid.c USBD_CUSTOM_HID_Setup函数中,其中CUSTOM_HID_REQ_SET_REPORT没有区分Out Report和Feature Report,并且还没有处理CUSTOM_HID_REQ_GET_REPORT请求,需要自行添加相关处理。
        case CUSTOM_HID_REQ_SET_REPORT:if( ((req->wValue>>8) & 0xFF) == 0x03 )            //add  Set Feature report{hhid->IsReportAvailable = 1U;USBD_CtlPrepareRx(pdev, hhid->Report_buf, req->wLength);}else if( ((req->wValue>>8) & 0xFF) == 0x02 )       //add  Set out report{//              hhid->IsReportAvailable = 1U;
//              USBD_CtlPrepareRx(pdev, hhid->Report_buf, req->wLength);}break;//addcase CUSTOM_HID_REQ_GET_REPORT:if( ((req->wValue>>8) & 0xFF) == 0x03 )     //add  Get Feature{hhid->Report_buf[0] = 0xAA;USBD_CtlSendData(pdev, hhid->Report_buf, req->wLength);}break;

4. 小结

使用STM的CubeMX工具可以很容易生成一个能用的USB HID工程,通过稍微修改为一个自定义的设备,可替代串口来与PC通信,免驱还是很不错。生成的HID工程也可以修改为其他HID设备,如键盘、鼠标、手柄等常用外设连接设备,还是非常方便的。

STM32CubeMX生成STM32F072 USB 自定义HID Device相关推荐

  1. 沁恒CH583 USB 自定义HID调试记录

    使用USB HID主要是为了免驱,通过自定义USB HID可以利用USB口来做很多事,比如串口打印,串口升级都可以通过usb口来实现,这样可以省去一个USB转串口器件同时也不用装驱动,如下实现可以通过 ...

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

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

  3. 62 stm32 usb自定义hid复合设备修改实验

    1.引言 最近因为项目需要,我们希望单片机既能有hid键盘功能,又能有hid设备的功能.即单片机的一个usb接口插入电脑后,电脑能识别出键盘设备和hid设备,两者同时存在的. 基于项目只是要求实现功能 ...

  4. USB自定义HID设备实现-LPC1768

    首先在之前鼠标的基础上修改设备描述符 #include "usbdesc.h" //usb标准设备描述符 const U8 USB_DeviceDescriptor[] = { U ...

  5. STM32自定义键盘(二)STM32单片机的USB接口-HID键盘

    STM32自定义键盘(二)STM32单片机的USB接口-HID键盘 HID描述符 生成HID键盘工程模板 修改HID报告描述符 键值数据发送 USB HID 键盘键值表 HID描述符 请参考这位博主的 ...

  6. 使用STM32CubeMX创建USB Custom HID工程

    文章目录 前言 实验步骤 1.打开STM32CubeMX工具,选择你的MCU型号 2.配置系统参数,USB参数等 3.修改工程代码并编译 下载验证 前言 由于项目需要,要实现USB组合设备(Custo ...

  7. 使用STM32CubeMX生成USB驱动程序 USB无法检测到的问题 生成USB驱动

    以STM32CubeMX生成USB驱动为例,其步骤如下: 一.使用STM32CubeMX生成USB驱动程序 打开STM32CubeMX软件,选择Start My project formMCU,点AC ...

  8. STM32的USB例程JoyStickMouse改成自定义HID设备

    简介 USB HID类是USB设备的一个标准设备类,包括的设备非常多.HID类设备定义它属于人机交互操作的设备,用于控制计算机操作的一些方面,如USB鼠标.USB键盘.USB游戏操纵杆等.但HID设备 ...

  9. STM32 自定义HID USB设备的实现

    最近需要使用STM32开发一个设备通过HID协议与主机通信,于是开始学习USB,发现USB这个体系实在太庞大了,直接看USB的例程根本看不懂,完全找不到突破口,最后在网上找到一本不错的书<圈圈教 ...

最新文章

  1. iKair:放弃硬件制造,切入上游去“送水”的逻辑
  2. csv 中显示逗号和双引号
  3. 下列有关计算机图形的叙述中错误的是,计算机图形学(9-16)-中国大学mooc-题库零氪...
  4. python邮件发送_Python实现邮件发送
  5. pthread_detach():主线程与子线程分离,子线程结束后,资源自动回收
  6. php 命令行 循环,Linux_批处理的循环效果脚本,第一次运行 执行命令工A 第 - phpStudy...
  7. Mysql 关联查询 索引失效
  8. 记录一次Stack上关于数学之美的brainstorm
  9. 1999年秋浙江省计算机等级考试二级c 编程题,2004年秋浙江省计算机等级考试二级C 编程题(2) (C++代码)...
  10. 德州理工大学计算机科学专业录取,美国留学:德州理工大学录取要求
  11. Windows 环境配置Github 的SSH key
  12. c语言题目翻译,c语言专业词汇表达带翻译
  13. 数据库表同步的三种方法
  14. 可重入函数与线程安全的区别与联系
  15. 基于STM32的Flash擦除方式
  16. java后端扇形图实现
  17. CleanMyMacX软件怎么样?实际使用效果功能讲解
  18. Bounding box regression RCNN系列网络中矩形框的计算
  19. 格雷码图案生成Matlab
  20. P3964 松鼠聚会(切比雪夫距离模板)

热门文章

  1. 【JAVA】——字面量与变量
  2. 电商技术架构演进过程——具体到每一个技术
  3. JDK的安装与环境变量的配置教程
  4. DM7全库备份失败报错“管道连接超时”处理流程
  5. linux环境中QT程序连接达梦数据库DM7简介
  6. 17个设计灵感创意网站
  7. java list 默认排序_List集合排序(默认及自定义排序)
  8. 2020阿里前端岗暑期实习面试经历
  9. class uesrfun.php,帝国cms-TAG高级管理插件
  10. Ubuntu 22.04 安装R语言及R studio