STM32H5基于USBx裸机添加OUT端点实现HID类双向通信

1.前言

客户反馈在运行STM32C071固件库Applications/USBX/Ux_Device_HID_Standalone例程时,反馈上位机不能向MCU通过EP OUT1发送数据,每当发数据就STALL。设备描述符正常,端口也是正常状态,MCU可以通过EP IN数据给上位机,如果不添加EP OUT1,通过EP OUT0发数据也不会STALL。

1.png

2. 问题调研与复现

以NUCLEO-H563ZI的板子为例,基于此板子上进行了USBx的跟踪和调试。发现一个标准的USB-HID设备及USB_HID_Custom(用户自定义HID设备),是只有IN端点,没有OUT属性的端点,基于USBx的协议栈创建的USB HID应用默认是不支持OUT端点。如果要进行HID的输入输出,需要使能USBx支持HID类OUT端点传输。

3.实现USBx HID类应用,支持OUT传输的步骤

1) 由于本文的重点是在USBx内添加OUT端点传输,为方便起见将固件库里面的例程NUCLEO-H563ZI\Applications\USBX\Ux_Device_HID_Standalone拷贝,将该文件夹和.IOC文件重新命名为Ux_Device_HID_Test,如下图所示。

2.png
2) 打开STM32CubeMX工程使其支持USB HID自定义设备和OUT端点。首先要取消MOUSE类,使能CUSTOM类。
3.png
其次修改行下面的配置:
4.png
配置OUT端点发送缓冲区,请注意这里的修改,这部分内容属于客户自己添加部分,如果大小不适合会出现问题,详情请参考参考手册。
5.png
3) 在USBx HID Custom自定义类协议栈中添加OUT端点支持,请确认一下,下面参数是否正确。
6.png
4) 添加支持OUT端点的描述符,以及HID的报告描述符。
7.png
8.png
5) 添加Application数据收发代码。
9.png
在USBX_DEVICE_HID_CUSTOM_Task()中添加代码实现,请注意原例程可能不是使用这个函数名(原函数为USBX_DEVICE_HID_MOUSE_Task),按一次按键向PC机发送64Byte数据。
10.png
6) 添加接收代码,PC向OUT1端点发送数据时会接收到HID_Custom_RecvBuf中。
11.png
7) 运行测试效果,在添加完代码后,适当的添加头文件,保证编译通过。然后下载调试,你可以观察到STM32H5通过IN端点向PC机发送数据演示效果(USB发数据,PC接收)
12.png
PC机向OUT端点发送数据(PC机发送数据,STM32H5 USB接收数据)

13.png

4. 总结

本文旨在实现 USBx HID Custom类的OUT端点通信,限于篇幅原因,读者可以下载本文档的附件工程,并详细阅读源码细节和已有实际调试,以理解USBx协议栈的通信流程,从而高效的开发出自己的USB应用。

来源:STM32

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。