1. 使用STM32CubeMX新建工程并测试串口
1.1 设置时钟
1.2 设置调试器
1.3 设置串口
1.4 设置USB_HID
1.5 最终效果
1.6 生成工程
1.7 打开工程,在usart.c
中添加printf串口重定向代码
1.7.1 在usart.h
中引入头文件stdio.h
**
#include "stdio.h" //引入此文件,为重定向printf
1.7.2 在usart.c
中添加重定向代码
// 重定向printf函数
int fputc(int ch,FILE *f)
{
uint8_t temp[1]={ch};
HAL_UART_Transmit(&huart1,temp,1,2);
return 0;
}
1.8 测试工程
1.8.1 在main.c中添加如下代码
1.8.2 编译下载,打开串口调试助手,观察现象
见此情况,串口测试成功!!
2.设置USBHID参数
2.1 HID descriptor Tool软件生成发送接收 64Byte
的报文描述符
生成的头文件如下:
char ReportDescriptor[33] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x00, // USAGE (Undefined)
0xa1, 0x01, // COLLECTION (Application)
0x09, 0x00, // USAGE (Undefined)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x95, 0x40, // REPORT_COUNT (64)
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x09, 0x00, // USAGE (Undefined)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x95, 0x40, // REPORT_COUNT (64)
0x75, 0x08, // REPORT_SIZE (8)
0x91, 0x02, // OUTPUT (Data,Var,Abs)
0xc0 // END_COLLECTION
};
2.2 修改 Usb HID report descriptor.
数组
**打开 usbd_custom_hid_if.c
文件,找到 CUSTOM_HID_ReportDesc_FS
并修改数组
/** Usb HID report descriptor. */
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
/* USER CODE BEGIN 0 */
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x00, // USAGE (Undefined)
0xa1, 0x01, // COLLECTION (Application)
0x09, 0x00, // USAGE (Undefined)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x95, 0x40, // REPORT_COUNT (64)
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x09, 0x00, // USAGE (Undefined)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x95, 0x40, // REPORT_COUNT (64)
0x75, 0x08, // REPORT_SIZE (8)
0x91, 0x02, // OUTPUT (Data,Var,Abs)
/* USER CODE END 0 */
0xC0 /* END_COLLECTION */
};
2.3 修改USBHID参数
usbd_desc.c:
#define USBD_VID 0x1995
#define USBD_LANGID_STRING 1033
#define USBD_MANUFACTURER_STRING "TANGXING"
#define USBD_PID_FS 0x0806
#define USBD_PRODUCT_STRING_FS "STM32_USBHID"
#define USBD_CONFIGURATION_STRING_FS "Custom HID Config"
#define USBD_INTERFACE_STRING_FS "Custom HID Interface"
usbd_conf.h:
#define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE 64U //USBHID发送缓存 64Byte
#define USBD_CUSTOM_HID_REPORT_DESC_SIZE 33U //报文描述符长度
usbd_customhid.h:
#define CUSTOM_HID_EPIN_SIZE 0x40U //USBHID接收长度 64Byte
#define CUSTOM_HID_EPOUT_SIZE 0x40U //USBHID发送长度 64Byte
#define CUSTOM_HID_HS_BINTERVAL 0x01U
#define CUSTOM_HID_FS_BINTERVAL 0x01U
2.4 编写USBHID发送函数
2.4.1 修改 usbd_custom_hid_if.c
文件
打开 usbd_custom_hid_if.c
找到 USBD_CUSTOM_HID_SendReport_FS
函数,取消注释,删掉 static
属性,改成这样:
2.4.2 在 usbd_custom_hid_if.h
添加函数声明
2.4.3 在 main.c
中添加测试代码
- 引入头文件
- 添加变量声明
- 初始化数组
- 测试USBHID发送函数
- 使用
PortHelper
观察现象
USBHID发送函数测试成功!!
2.5 编写USBHID接收函数
2.5.1 修改USBHID处理函数
在 usbd_custom_hid_if.c
中找到 CUSTOM_HID_OutEvent_FS
USBHID 接收处理函数
static int8_t CUSTOM_HID_OutEvent_FS(uint8_t event_idx, uint8_t state)
{
/* USER CODE BEGIN 6 */
uint8_t i,USB_Recive_Buffer[64];
USBD_CUSTOM_HID_HandleTypeDef *hhid = (USBD_CUSTOM_HID_HandleTypeDef *)(hUsbDeviceFS.pClassData);
for(i=0;i<64;i++)
{
USB_Recive_Buffer[i]=hhid->Report_buf[i]; //把接收到的数据送到自定义的缓存区保存(Report_buf[i]为USB的接收缓存区)
printf("USB_Recive_Buffer[%d] = 0x%02X \r\n",i,USB_Recive_Buffer[i]); //打印接收到的信息,确认是否正确,调试用
}
return (USBD_OK);
/* USER CODE END 6 */
}
2.5.2 使用 PortHelper
测试效果
成功接收!!
源文件代码:https://download.csdn.net/download/u014779536/12193155