完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
耗费了一天去了解怎么实现u***协议下的HID传输,因为各个文章没有说清楚,导致我数据的内容总时接收不到或者错位,所以特意写一篇文章来具体指出了各个步骤的坑
开发环境 windows stm32f103rct6 stm32cubemx keil joystick模块(5针)两轴 初始配置 开启时钟 USB时钟 一定 48M 打开USB 配置HID 配置完成 代码编写 打开u***d_hid.c 应为stm32cbemx 自动生成的HID是鼠标,所以需要更该报告描述符 如下 __ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END = { 0x05, 0x01, 0x09, 0x04,//joystick 0xA1, 0x00, 0x05, 0x01, 0x09, 0x30,//x 0x09, 0x31,//y 0x09, 0x32,//z 0x09, 0x33,//rx 旋转x轴 0x15, 0x00,//最小数据输入 0 0x25, 0x7F,//最大数据输入 127 0x75, 0x08,//数据字节 8 0x95, 0x04,//一次的数据个数 4个 即 x y z rx 0x81, 0x02, 0xc0//终止 }; 找到 ,并修改 0x00, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ 找到如下内容 HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/ 更换成 因为上面的报告符数 为27个,可自己添加然后更改这个数字 应该有4个位置 27,//HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/ 以下为main.c中内容 加入头文件,以及相关句柄 #include "u***d_hid.h"extern USBD_HandleTypeDef hU***DeviceFS; 创建相关结构体 一定注意顺序,这里的顺序要和报告符中的描述一致 struct mouseHID_t { uint8_t x; uint8_t y; uint8_t buttons; int8_t wheel; }; struct mouseHID_t mouseHID; 读取adc 并转化为 0到20的范围 uint16_t AD_Value_Buf[2]; uint16_t AD_X_Value = 0; uint16_t AD_Y_Value = 0; int16_t AD_Value_map(int16_t x, int16_t in_min, int16_t in_max, int16_t out_min, int16_t out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; } void USB_send(void) { ADC_ChannelConfTypeDef sConfig; //通道初始化 for(uint8_t i=0;i<2;i++) { switch(i) //选择ADC通道 { case 0:sConfig.Channel = ADC_CHANNEL_0;break; case 1:sConfig.Channel = ADC_CHANNEL_1;break; } sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; //采用周期239.5周期 sConfig.Rank = 1; HAL_ADC_ConfigChannel(&hadc1,&sConfig); if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } HAL_ADC_Start(&hadc1); if(HAL_OK==HAL_ADC_PollForConversion(&hadc1,10)) { AD_Value_Buf = HAL_ADC_GetValue(&hadc1); // USE_MAIN_INFO("AD_Value_Buf[%d] %d",i,AD_Value_Buf); } HAL_ADC_Stop(&hadc1); } AD_X_Value = AD_Value_Buf[0]; AD_Y_Value = AD_Value_Buf[1]; mouseHID.x =(uint8_t) AD_Value_map(AD_X_Value,0,4095,-20,20);//从0-4095映射到-20~20 mouseHID.y = (uint8_t)AD_Value_map(AD_Y_Value,0,4095,20,-20);//从0-4095映射到20~-20 //USE_MAIN_INFO("mouseHID.x %drn",mouseHID.x); //USE_MAIN_INFO("mouseHID.y %d", mouseHID.y ); USBD_HID_SendReport(&hU***DeviceFS, (uint8_t*)&mouseHID, sizeof(struct mouseHID_t)); } 在main函数里面初始化 mouseHID.buttons =0; mouseHID.x =0; mouseHID.y = 0; mouseHID.wheel = 0; 各功能初始化后进行adc校准 然后进行循环采集 /* USER CODE BEGIN 2 */ HAL_Delay(100); HAL_ADCEx_Calibration_Start(&hadc1); /* USER CODE END 2 */ while (1) { USB_send(); HAL_Delay(10); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } 此时通过stm32的u***口(非usart)连接电脑, 打开电脑上的游戏管理器,可以看见stm32 human interface 打开校准,控制手柄,应该可以看见光标移动则说明成功 其他功能可以看u***协议(我也不会)来实现 推荐工具: u*** bound HID Descriptor tool |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2956 浏览 16 评论
3457 浏览 1 评论
8996 浏览 16 评论
4050 浏览 18 评论
1107浏览 3评论
572浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1858浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 11:25 , Processed in 1.226538 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号