如何在STM32上实现USB设备自定义HID类第2部分
如何在STM32上实现USB设备自定义的HID类?大家好,欢迎回到第二部分也是最后一部分!1.回顾我们从中断的那一点开始,只是简单回顾一下,在第1部分中,我们一直到代码生成技巧。。。
如何在STM32上实现USB设备自定义的HID类?
大家好,欢迎回到第二部分也是最后一部分!
1.概述
我们从我们中断的那一点开始,只是简单回顾一下第1部分我们一直使用STM32CubeIDE生成代码:

在自动创建的几个文件中,高亮显示的文件在本教程中会被修改,因此您可能希望抢先打开它们:

代码中的第一步是增加in和OUT端点的大小。简单回顾一下,Endpoint是必须在设备端实现的源或目标数据缓冲区,从主机接收或发送到主机的每一个数据量都将被放入一个端点中。在usbd_自定义ID.h文件,修改自定义ID和自定义ID出口大小 定义 到0x40(64字节):
#定义CUSTOM_HID_EPIN_SIZE 0x40U#定义CUSTOM-HID_EPOUT_SIZE 0x40U修改USBD_CUSTOM_HID_ItfTypeDef获取整个消息缓冲区以下为:
typedef结构_USBD_CUSTOM_HID_Itf{uint8_t*pReport;int8_t(*Init)(void);int8_t(*DeInit);保存并关闭文件。
注意:在从STM32CubeMX生成代码的情况下,对中间件文件夹内文件的所有修改都可能被覆盖。因此,在修改完成后创建文件的副本。
打开usbd_自定义ID.c归档并修改以下函数:
静态uint8_t USBD_CUSTOM_HID_DataOut(USBD_HandleTypeDef*pdev,uint8_t epnum){USBD_CUSTOM_HID_HandleTypeDef*hhid=(USBD_CUSCUSTOM_HID_HandleDescriptf*)pdev->pClassData;((USBD_CUSTOM-HID_ItfTypeDef*)pdev->pUserData)->OutEvent(hhid->Report_buf);USBD_LL_PrepareRecive(pdev,CUSTOM_HID _EPOUT_ADDR,hhid->Report_buf,USBD_CUSUMEHID_OUTREPORT_buf_SIZE);返回USBD_OK;}静态uint8_tUSBD_CUSTOM_HID_EP0_RxReady(USBD_HandleTypeDef*pdev保存并关闭文件。
打开usbd_custom_hid_if.c并在中添加以下信息Usb HID报告描述符(如果您需要有关报告描述符的更多信息,请参阅中的文档开发者信息|USB-IF

/**Usb HID报告描述符。*/__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID _REPORT_DESC_SIZE]__ALIGN_END={/*用户代码BEGIN 0*/0x06、0x00、0xff、//用法页(未定义)0x09、0x01、//用法(未定义的)0xa1、0x01,//集合(应用程序)0x15、0x00,//逻辑_MINIMUM(0)0x26、0xff,0x00、//逻辑_MAXIMUM(255)0x75、0x08、//报告_SIZE(8)0x95、0x40,//报告_计数(64)0x09、0x01、//用法(未定义)0x81、0x02、//INPUT(数据、变量、Abs)0x95、0x40、//REPORT_COUNT;在同一个文件中,修改CUSTOM_HID_OutEvent_FS(自定义ID输出事件_FS)原型和功能结构(当通过USB接收到完整的包数据时调用此功能):
静态int8_t CUSTOM_HID_OutEvent_FS(uint8_t*状态);静态int8_t CUSTOM_HID_OutEvent_FS(uint8_t*状态){/*用户代码开始6*/返回(USBD_OK);/*用户编码结束6*/}打开主要.c文件,外部USB处理程序,添加传输和接收缓冲区以及以下标志变量。使用“用户代码”注释找到适当的位置,以便复制和粘贴以下代码段:
/*用户代码开始PV*/uint8_t tx_buffer[64]//用于存储输出数据uint8_t report_buffer[64]的变量//用于接收报告缓冲区uint8_t标志的变量=0//用于存储按钮标志uint8_t flag_rx=0的变量//用于存储接收标志的变量//外部USB处理程序外部USBD_HandleTypeDef hUsbDeviceFS;/*用户代码结束PV*/*用户代码开始2*///为(uint8_t i=0;i<64;i++)填充缓冲区{tx_buffer[i]=i;}/*用户代码结束2*//*无限循环*/*用户编码开始WHILE*/WHILE(1){if(flag_rx==1)}//如果(report_buffer[0]==1),检查报告缓冲区的第一个字节是否等于1{//将用户LED打开HAL_GPIO_WritePin(LED3_GPIO_Port,LED3_Pin,SET);}//检查如果第一个如果(report_buffer[0]==2){//关闭用户指示灯HAL_GPIO_WritePin(LED3_GPIO_Port,LED3_Pin,RESET);}flag_rx=0;}//要在按下按钮时发送输出数据,如果(flag==1){USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS,tx_buffer,64);flag=0;}/*用户代码结束,同时*/*用户代码开始4*//如果按下按钮,设置按钮标志变量void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){flag=1;}/*用户代码终止4*/打开usbd_custom_hid_if.c文件并外部化在中创建的变量主要.c。
/*用户代码开始PV*/*私有变量------------------------------------------------------*//外部report_buffer变量extern uint8_t report_buffer[64];外部uint8_t标志rx;/*用户代码端PV*/在里面CUSTOM_HID_OutEvent_FS(自定义ID输出事件_FS)函数,添加记忆复制存储在USB接收变量(“状态”)中的数据并将其放入变量中的命令报告缓冲区以前创建的
static int8_t CUSTOM_HID_OutEvent_FS(uint8_t*state){/*用户代码开始6*//将接收缓冲区复制到报告缓冲区变量memcpy(报告缓冲区,state,64);flag_rx=1;return(USBD_OK);/*用户码结束6*/}完成!通过构建应用程序,所有程序员的梦想都应该实现,0个错误,0个警告。现在让我们看看它是否也有效。
2.验证:
通过单击调试按钮:
可能会出现一个窗口,询问有关调试器的一些设置,在本例中,标准设置运行良好。所以,只需点击好啊以下为:

点击运行执行简历按钮或按压功能8以下为:

打开SimpleHIDWrite(简单HID写入)软件,选择STM32自定义人机界面在列表中,然后单击清楚的清除终端的按钮:

按下用户按钮在发现板上,并检查缓冲区是否发送到终端上的主机。它是具有从0到63U(0x3F)的序列的缓冲器:

用值1填充第一个字段,单击设置报告按钮,并检查红色LED是否打开(将第一个值更改为2,然后再次发送报告以关闭LED):

最后,在如果的声明主要.c检查标志(_rx),填写的字段SimpleHIDWrite(简单HID写入)使用随机数据,设置一个报告并检查报告缓冲区在…上STM32管以下为:

3.结论:
在STM32上将USB设备实现为自定义HID类的所有步骤都完成了!现在您有了一个项目,可以通过USB传输包,在代码中接收和管理来自主机的数据包。尽情享受吧!
4.参考链接:
STM32 USB简介:https://wiki.st.com/stm32mcu/wiki/Introduction_to_USB_with_STM32#What_is_the_Universal_Serial_Bus_-2。。。
简单HID写入:
http://janaxelson.com/files/SimpleHIDWrite3.zip
32F072BDISCOVERY主页面:
https://www.st.com/en/evaluation-tools/32f072bdiscovery.html
32F072BDISCOVERY用户手册:
https://www.st.com/resource/en/user_manual/um1690-discovery-kit-for-stm32f0-series-microcontrollers-...
STM32F072RB主页面:
https://www.st.com/en/microcontrollers-microprocessors/stm32f072rb.html
STM32F072RB产品介绍:
https://www.st.com/resource/en/datasheet/stm32f072rb.pdf
STM32F0x2参考手册:
https://www.st.com/resource/en/reference_manual/rm0091-stm32f0x1stm32f0x2stm32f0x8-advanced-armbased...
STM32管以下为:
https://www.st.com/en/development-tools/stm32cubeide.html
上一篇: 如何配置GPDMA 下一篇: 如何在STM32CubeIDE中调试X-Cube-AWS