stm32cubeide安装方法(配置USBHID自定义设备)
stm32cubeide安装方法(配置USBHID自定义设备)0x09 0x02 //用法(vendor defined)0xA1 0x01 //集合(Application){0x06 0xA0 0xFF //用法页(FFA0h vendor defined)0x09 0x01 //用法(vendor defined)
STM32CubeMX USB-HID
RCC的HSE选择BYPASS Clock Source USB时钟为48MHz
修改usbd_custom_hid_if.c文件添加通讯代码:
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
0x06 0xA0 0xFF //用法页(FFA0h vendor defined)
0x09 0x01 //用法(vendor defined)
0xA1 0x01 //集合(Application)
0x09 0x02 //用法(vendor defined)
0xA1 0x00 //集合(Physical)
0x06 0xA1 0xFF //用法页(vendor defined)
//输入报告
0x09 0x03 //用法(vendor defined)
0x09 0x04 //用法(vendor defined)
0x15 0x80 //逻辑最小值(0x80 or -128)
0x25 0x7F //逻辑最大值(0x7F or 127)
0x35 0x00 //物理最小值(0)
0x45 0xFF //物理最大值(255)
0x75 0x08 //报告长度Report size (8位)
0x95 0x40 //报告数值(64 fields)
0x81 0x02 //输入(data variable absolute)
//输出报告
0x09 0x05 //用法(vendor defined)
0x09 0x06 //用法(vendor defined)
0x15 0x80 //逻辑最小值(0x80 or -128)
0x25 0x7F //逻辑最大值(0x7F or 127)
0x35 0x00 //物理最小值(0)
0x45 0xFF //物理最大值(255)
0x75 0x08 //报告长度(8位)
0x95 0x40 //报告数值(64 fields)
0x91 0x02 //输出(data variable absolute)
0xC0 //集合结束(Physical)
0xC0//集合结束(Application)
};
USBD_CUSTOM_HID_REPORT_DESC_SIZE = 52
同时修改usbd_customhid.h文件中的发送与接收长度
#define CUSTOM_HID_EPIN_SIZE 0x40
#define CUSTOM_HID_EPOUT_SIZE 0x40
再次编译并写入,系统会枚举到USB,用USBD_CUSTOM_HID_SendReport()函数就可以发送数据,第一步完成了。接收数据的函数也在usbd_customhid.c文件中,生成 的接收函数USBD_CUSTOM_HID_DataOut()需要进一步修改。定义个接收缓冲区和接收计数器。
unsigned char USB_Recive_Buffer[64];
volatile unsigned char USB_Received_Count = 0;
再修改接收函数成这个样子:
static uint8_t USBD_CUSTOM_HID_DataOut (USBD_HandleTypeDef *pdev uint8_t epnum)
{
USB_Received_Count = USBD_GetRxCount( pdev epnum );
USBD_LL_PrepareReceive( pdev CUSTOM_HID_EPOUT_ADDR USB_Recive_Buffer sizeof( USB_Recive_Buffer ) );
return USBD_OK;
}
USB接收是在USB事件中处理的,只需要盯着USB_Received_Count变量就行了,有了数据就从USB_Recive_Buffer里直接拿。
在main.c中实现的数据回传,上位机发啥返啥:
#include "usbd_customhid.h"
extern volatile unsigned char USB_Received_Count;
extern unsigned char USB_Recive_Buffer[64];
while( 1 )
{
if (USB_Received_Count>0) //收到数据后返回数据
{
USBD_CUSTOM_HID_SendReport( &hUsbDeviceFS USB_Recive_Buffer sizeof(USB_Recive_Buffer) );
USB_Received_Count = 0;
}
}