STM32CubeMX生成STM32F072 USB 自定义HID Device
使用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相关推荐
- 沁恒CH583 USB 自定义HID调试记录
使用USB HID主要是为了免驱,通过自定义USB HID可以利用USB口来做很多事,比如串口打印,串口升级都可以通过usb口来实现,这样可以省去一个USB转串口器件同时也不用装驱动,如下实现可以通过 ...
- USB自定义HID设备实现-STM32
该文档使用USB固件库,在其基础上进行了自己的定制,完成了一个USB-HID设备,首先是usb_desc.c文件,里面存放了usb各种描述符的存在 #include "usb_desc.h& ...
- 62 stm32 usb自定义hid复合设备修改实验
1.引言 最近因为项目需要,我们希望单片机既能有hid键盘功能,又能有hid设备的功能.即单片机的一个usb接口插入电脑后,电脑能识别出键盘设备和hid设备,两者同时存在的. 基于项目只是要求实现功能 ...
- USB自定义HID设备实现-LPC1768
首先在之前鼠标的基础上修改设备描述符 #include "usbdesc.h" //usb标准设备描述符 const U8 USB_DeviceDescriptor[] = { U ...
- STM32自定义键盘(二)STM32单片机的USB接口-HID键盘
STM32自定义键盘(二)STM32单片机的USB接口-HID键盘 HID描述符 生成HID键盘工程模板 修改HID报告描述符 键值数据发送 USB HID 键盘键值表 HID描述符 请参考这位博主的 ...
- 使用STM32CubeMX创建USB Custom HID工程
文章目录 前言 实验步骤 1.打开STM32CubeMX工具,选择你的MCU型号 2.配置系统参数,USB参数等 3.修改工程代码并编译 下载验证 前言 由于项目需要,要实现USB组合设备(Custo ...
- 使用STM32CubeMX生成USB驱动程序 USB无法检测到的问题 生成USB驱动
以STM32CubeMX生成USB驱动为例,其步骤如下: 一.使用STM32CubeMX生成USB驱动程序 打开STM32CubeMX软件,选择Start My project formMCU,点AC ...
- STM32的USB例程JoyStickMouse改成自定义HID设备
简介 USB HID类是USB设备的一个标准设备类,包括的设备非常多.HID类设备定义它属于人机交互操作的设备,用于控制计算机操作的一些方面,如USB鼠标.USB键盘.USB游戏操纵杆等.但HID设备 ...
- STM32 自定义HID USB设备的实现
最近需要使用STM32开发一个设备通过HID协议与主机通信,于是开始学习USB,发现USB这个体系实在太庞大了,直接看USB的例程根本看不懂,完全找不到突破口,最后在网上找到一本不错的书<圈圈教 ...
最新文章
- iKair:放弃硬件制造,切入上游去“送水”的逻辑
- csv 中显示逗号和双引号
- 下列有关计算机图形的叙述中错误的是,计算机图形学(9-16)-中国大学mooc-题库零氪...
- python邮件发送_Python实现邮件发送
- pthread_detach():主线程与子线程分离,子线程结束后,资源自动回收
- php 命令行 循环,Linux_批处理的循环效果脚本,第一次运行 执行命令工A 第 - phpStudy...
- Mysql 关联查询 索引失效
- 记录一次Stack上关于数学之美的brainstorm
- 1999年秋浙江省计算机等级考试二级c 编程题,2004年秋浙江省计算机等级考试二级C 编程题(2) (C++代码)...
- 德州理工大学计算机科学专业录取,美国留学:德州理工大学录取要求
- Windows 环境配置Github 的SSH key
- c语言题目翻译,c语言专业词汇表达带翻译
- 数据库表同步的三种方法
- 可重入函数与线程安全的区别与联系
- 基于STM32的Flash擦除方式
- java后端扇形图实现
- CleanMyMacX软件怎么样?实际使用效果功能讲解
- Bounding box regression RCNN系列网络中矩形框的计算
- 格雷码图案生成Matlab
- P3964 松鼠聚会(切比雪夫距离模板)