0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

极海APM32F427如何实现自定义USB HID设备与PC进行通信

Geehy极海半导体 来源:Geehy极海半导体 2026-03-30 09:30 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

《极海芯得》系列内容为用户使用极海系列产品的经验总结,均转载自21ic论坛极海半导体专区,全文未作任何修改,未经原文作者授权禁止转载。

最近需要使用到 APM32F427 枚举成Custom HID设备进行用户自定义通信,但是官方的例程只有提供的HID枚举为鼠标或者键盘类型的设备。这里记录一下,怎么使用Geehy官方的USB中间件,实现自定义的USB HID设备进行用户通信。

1. USB HID设备简介

USB HID类是USB设备的一个标准设备类,它属于人机交互操作的设备,用于控制计算机操作的一些方面,如USB鼠标、USB键盘、USB游戏操纵杆等。但HID设备类不一定要有人机接口,只要符合HID类别规范的设备都是HID设备。

USB HID设备的一个好处就是操作系统自带了HID类的驱动程序,而用户无需去开发驱动程序,只要使用API系统调用即可完成通信。所以经常会把MCU的USB外设枚举为自定义的HID设备类,用于和电脑上位机进行通信。

关于USB HID设备,这里只是简单介绍下,大家可以查阅网上的资料,或者从下面的USB官网进行学习。

USB HID设备类官网介绍:https://www.usb.org/hid

2. 基于官网的USB中间件如何实现Custom HID设备

2.1 准备工作

官方 F427 芯片的SDK已经提供了很多的USB例程,我们基于官方的USB例程修改即可。

1、下载官网APM32F427 SDK:https://www.geehy.com/product/fifth/APM32F427_425_423#design

2、我们要实现自定义的USB HID设备,与之最接近的就是427 SDK中提供的OTGD_Custom_HID_Keyboard例程。我们复制一份该例程,基于该例程修改为USB Custom HID设备例程。

83f66596-2981-11f1-90a1-92fbcf53809c.png

2.2 修改USB HID报告描述符

报告描述符就是描述报告(HID接口上传输事务中的数据)的一组数据结构。

USB的报告描述符组成,都有其特定的组成格式。关于USB HID的报告描述符的组成和格式,可参考官方文档《Device Class Definition for human interface device (HID)》。这里不多介绍报告描述符了,直接介绍如何修改代码即可。

把usbd_custom_hid_if.c文件定义的报告描述符数组:

844f535e-2981-11f1-90a1-92fbcf53809c.png

把该文件定义的报告描述符直接修改为如下代码:

/**

* @brief CUSTOM HID report descriptor

*/

uint8_t USBD_CUSTOM_HIDReportDesc[USBD_CUSTOM_HID_REPORT_DESC_SIZE] =

{

/* USER CODE BEGIN 0 */

0x06, 0xFF, 0x00, /* USAGE_PAGE (Vendor Page: 0xFF00) */

0x09, 0x01, /* USAGE (Demo Kit) */

0xa1, 0x01, /* COLLECTION (Application) */

// 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)

// 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)

/* USER CODE END 0 */

0xC0 /* END_COLLECTION */

};

该描述符主要是定义了输入输出Input、Ouput两个报告。其中,Input用于MCU上传数据,Output下传数据。所有报告大小定义为64byte,也就是说每次最大上下传数据量也就为64byte。

另外数组USBD_CUSTOM_HID_REPORT_DESC_SIZE这个宏定义需要修改为我们定义的报告描述符的大小,也就是34。在对应的头文件修改如下:

84a60e9c-2981-11f1-90a1-92fbcf53809c.png

2.3 修改接收回调函数

usbd_custom_hid_if.c文件实现了一个接收处理函数,当USB检测到有数据接收时,会调用该函数进行接收数据处理。

我们需要修改该函数,当有数据接收时,使得 USB_Received_Flag 变量置1,用于上层数据处理函数的处理。修改的代码如下:

uint8_t USB_Received_Flag = 0;

/*!

* @brief USB device CUSTOM HID interface receive handler

*

* @param buffer: Command data buffer

*

* @param length: Command data length

*

* @retval USB device operation status

*/

USBD_STA_T USBD_FS_CUSTOM_HID_ItfReceive(uint8_t *buffer, uint8_t *length)

{

USBD_STA_T usbStatus = USBD_OK;

UNUSED(length);

USB_Received_Flag = 1; // 检测到有数据接收,标志位置1

USBD_CUSTOM_HID_RxPacket(&gUsbDeviceFS);

return usbStatus;

}

2.4 实现应用层用户代码的收发函数

1、实现USB Custom HID设备接收函数

我们实现一个USB HID的数据接收函数,当检测到 USB_Received_Flag 标志位置1之后,就可以调用该函数进行数据接收。

uint32_t USB_GetData(uint8_t *data, uint32_t dataNum)

{

USBD_CUSTOM_HID_INFO_T* usbDevHID = (USBD_CUSTOM_HID_INFO_T*)gUsbDeviceFS.devClass[gUsbDeviceFS.classID]->classData;

if (usbDevHID == NULL)

{

return 0;

}

if (dataNum > usbDevHID->reportSize)

{

dataNum = usbDevHID->reportSize;

}

for (uint32_t i = 0; i < dataNum; i++)

{

*data++ = usbDevHID->report[i];

}

return dataNum;

}

接收到的数据会存放在USB的gUsbDeviceFS 全局变量中,该全局变量包含了USB的所有信息。

2、实现USB Custom HID设备发送函数

USB HID设备发送数据,我们只需要调用F427 SDK提供的USBD_CUSTOM_HID_TxReport函数发送数据即可。我们对该函数封装一层用于用户调用。

uint32_t USB_SendData(uint8_t *data, uint32_t dataNum)

{

// USBD_CUSTOM_HID_IN_EP_SIZE 64

if (USBD_OK != USBD_CUSTOM_HID_TxReport(&gUsbDeviceFS, data, 64))

{

return 0;

}

return dataNum;

}

2.5 实现主函数与PC进行读写通信

前面已经实现的用户应用层USB Custom HID设备的收发函数,我们可以在主函数调用USB HID收发函数进行读写通信。测试是否确实和PC端上位机实现了数据的收发。

主函数代码实现如下:

int main(void)

{

uint8_t report[64] = {0};

DAL_DeviceConfig();

/* Infinite loop */

while (1)

{

// USB_Received_Flag 变量置1,说明有USB数据接收到。下面对接收的数据进行处理

if (USB_Received_Flag == 1)

{

USB_Received_Flag = 0;

USB_GetData(report, 64); // 获取USB接收到的数据

// 打印测试

// for (uint32_t i = 0; i < 64; i++)

// printf("%02X ", report[i]);

USB_SendData(report, 64); // 把接收到的数据原封不懂的发送回给上位机

}

}

}

该主函数就是实现了简单的USB HID数据的收发,把PC端下发给F427的USB数据,然后再返回给PC端上位机。

3. USB Custom HID设备通信的测试验证

3.1 在电脑的设备管理器查看

在第二节修改完代码之后,编译下载到APM32F427芯片,运行起来后,我们可以在windows系统的设备管理器的人体学输入设备,查看到我们自己实现的USB Custom HID的。如下:

84fcaad6-2981-11f1-90a1-92fbcf53809c.png

又或者通过控制面板的设备和打印机的选项,可以查看到我们实现的USB HID设备,如下:

855332ca-2981-11f1-90a1-92fbcf53809c.png

可以看到我们实现的APM32 Custom HID设备,说明修改的代码已经正常运行。

3.2 通过PC端上位机工具进行数据收发测试

我们需要使用USB HID的调试工具,进行数据收发测试。关于这样的上位机工具,网上有很多的。我这里使用的是PortHelper工具。这个工具大家可以网上搜一下下载。

或者下载我分享的下面这个百度网盘链接下载:

链接:https://pan.baidu.com/s/1qkZCs-dG__czkDrAvN7z-w?pwd=q6er提取码:q6er

1、打开PortHelper 上位机,然后选择USB调试,然后找到 APM32 Custom HID 设备,然后打开USB。

85aa4f74-2981-11f1-90a1-92fbcf53809c.png

2、PortHelper 测试与APM32F427进行USB数据收发

打开USB之后,然后我们勾选hex发送,hex显示。然后点击发送即可,如下图:

8601182c-2981-11f1-90a1-92fbcf53809c.png

然后可以PC端上位机发送的数据给APM32F427,芯片原样返回数据给该上位机。

到这里就实现的我们自定义的USB Custom HID设备,该设备主要是接收PC端上位机发送过来的数据,然后APM32F427接收进行处理。在实际项目我是需要基于这个通信进行更复杂的项目开发。

注:文章作者在原帖中提供了代码文件,有需要请至原文21ic论坛

原文地址:https://bbs.21ic.com/icview-3501049-1-1.html?_dsign=8cbdef4d

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • usb
    usb
    +关注

    关注

    60

    文章

    8471

    浏览量

    285748
  • 驱动程序
    +关注

    关注

    19

    文章

    872

    浏览量

    50713
  • HID
    HID
    +关注

    关注

    2

    文章

    140

    浏览量

    49021

原文标题:极海芯得 EP.76 | APM32F427基于官方USB中间件如何实现自定义USB HID设备与PC进行通信

文章出处:【微信号:geehysemi,微信公众号:Geehy极海半导体】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    APM32F427移植CherryUSB实现自定义USB HID设备

    最近需要使用到APM32F427枚举成Custom HID设备进行用户自定义通信,但我又不想要使
    的头像 发表于 01-20 09:52 4013次阅读
    <b class='flag-5'>极</b><b class='flag-5'>海</b><b class='flag-5'>APM32F427</b>移植CherryUSB<b class='flag-5'>实现</b><b class='flag-5'>自定义</b><b class='flag-5'>USB</b> <b class='flag-5'>HID</b><b class='flag-5'>设备</b>

    APM32F427 MCU在RT-Thread系统上使用LwIP网络功能

    下面是基于RT-Thread的ENV命令行开发环境,在APM32F427上使用LwIP网络协议栈实现网络通信功能的。
    的头像 发表于 04-02 15:19 8460次阅读
    <b class='flag-5'>极</b><b class='flag-5'>海</b><b class='flag-5'>APM32F427</b> MCU在RT-Thread系统上使用LwIP网络功能

    STM32 自定义HID USB设备实现

    Interval (20 ms) */ /* 41 */}; 剩下的就根据自己需要去修改数据OUT处理和数据IN处理函数,来进行自己的数据处理,从而实现自定义HID。当然使用
    发表于 03-09 15:23

    STM32F107做USB host识别自定义HID设备有了解的吗

    各位大神,小弟最近要用STM32F107做USB host给自定义HID 设备发送数据,ST官网的例程是鼠标和键盘的都只是有对输入数据的处
    发表于 12-07 09:03

    采用HID协议实现工控自定义键盘接口设计

    ,它所有按键是为满足特定产品需求而设计,常用接口有PS/2和USBUSB设备具有支持热插拔和桢采集速率高等优点,正逐步取代原来的PS/2设备,成为市场的主流。本文主要介绍一种
    发表于 06-20 05:00

    标准hid设备pc上驱动不用自己开发,自定义hid设备windows系统的驱动用自己开发吗

    标准hid设备pc上驱动不用自己开发,自定义hid设备windows系统的驱动用自己开发吗
    发表于 07-09 09:31

    USB自定义设备类的实现

    2021.5.13(2021.5.17改)USB自定义设备类的实现1 此例程在GD官方所提供的打印机设备类型修改而来,根据
    发表于 02-22 07:02

    如何利用CubeMX开发USB自定义HID设备实现USB人机接口通讯?

    如何利用CubeMX开发USB自定义HID设备实现USB人机接口通讯?
    发表于 02-22 07:14

    求助,能否为USB自定义设备提供PC端驱动程序?

    沁恒的技术人员,您好。我公司本次项目使用CH549F芯片,读取下位机Flash中的数据由USB发送到上位机,数据量比较大,需要使用USB的批量传输方式,需要用USB
    发表于 06-08 06:38

    国民技术MCU应用笔记连载(4)——N32G45x系列USB自定义HID设备实现

    HID设备的驱动程序,因而无需用户自己开发驱动程序,对于一些数据量较少的场合(例如按键输入、LED显示或一些小容量的芯片烧录器等),使用用户自定义HID
    发表于 07-05 11:58

    各位大佬,CH573F能模拟自定义HID设备吗,就是免驱的HID自定义设备

    各位大佬,CH573F能模拟自定义HID设备吗,就是免驱的HID自定义
    发表于 07-25 06:51

    万利EK-STM32板实现自定义USB HID设备

    大家知道,将一个USB设备定义为用户自定义HID设备,就可以让windows操作系统识别为一个
    发表于 12-04 17:03 1421次阅读

    基于HAL库的USB自定义HID设备实现

    基于HAL库的USB自定义HID设备实现基于HAL库的USB
    发表于 12-28 20:04 13次下载
    基于HAL库的<b class='flag-5'>USB</b><b class='flag-5'>自定义</b><b class='flag-5'>HID</b><b class='flag-5'>设备</b><b class='flag-5'>实现</b>

    【技术专栏】泰凌微电子USB HID 用户自定义设备应用及调试

    hid设备类型是由hid报告描述符中的用途页(USAGE PAGE)决定的,常见的有Generic Desktop Controls ,Keyboard/Keypad ,还有有厂商自定义
    的头像 发表于 07-19 08:40 3022次阅读
    【技术专栏】泰凌微电子<b class='flag-5'>USB</b> <b class='flag-5'>HID</b> 用户<b class='flag-5'>自定义</b><b class='flag-5'>设备</b>应用及调试

    APM32F427系列MCU荣获IEC 60730/60335功能安全认证

    近日,APM32F427系列工业级高性能拓展型MCU,成功通过IEC 60730/60335功能安全认证。这标志着该系列产品在功能安全设计上已达到国际领先水平,能够为客户提供符合Class B标准的功能安全库,并助力其高效缩
    的头像 发表于 02-09 09:15 979次阅读
    <b class='flag-5'>极</b><b class='flag-5'>海</b><b class='flag-5'>APM32F427</b>系列MCU荣获IEC 60730/60335功能安全认证