怎么利用stm32读取鼠标数据

2024年12月03日 01:38
有1个网友回答
网友(1):

第一步:新建一个C文件 把usbh_hid_core.c 库文件粘贴进去 这样就能随便改了;其他的库文件不要动
第二步:把相关库文件全拽进来 键盘那个不要 usbh_usr.c文件还用读U盘的 然后编译;
第三步: 编译报错 把mouse_init mouse_data_process 等。。。相关函数自己写了 这不属于底层驱动可以随意写 一般串口输出标志性语句 等调试好了再根据应用改 然后把usb_krd_cb注释掉
第四步:单步调试 改程序直到正常输出鼠标型号 等信息为止(其实用U盘程序也是能读出鼠标型号的),如果读不出 查看能否进入USB中断 在中断那设串口打印或者灯
第五步:重点来了 正常读型号 但是无法进入鼠标初始化 单步调试 卡在前面自己粘贴的 usbh_hid_core.c :
case HID_REQ_SET_IDLE:

classReqStatus = USBH_Set_Idle (pdev, pphost, 0, 0);

/* set Idle */
if (classReqStatus == USBH_OK)
{
HID_Machine.ctl_state = HID_REQ_SET_PROTOCOL;
}
else if(classReqStatus == USBH_NOT_SUPPORTED)
{
HID_Machine.ctl_state = HID_REQ_SET_PROTOCOL;
}
break;
无法进入:USBH_Status USBH_HID_Handle 进而不能对鼠标操作
是请求idle时间不够造成的:

USBH_Set_Idle (pdev, pphost, 0, 0) 把第一个0改大点 我一开始设成10不行 改成100好使了
然后进USBH_Set_Idle函数
static USBH_Status USBH_Set_Idle (USB_OTG_CORE_HANDLE *pdev,
USBH_HOST *phost,
uint8_t duration,
uint8_t reportId)
{

phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_RECIPIENT_INTERFACE |\
USB_REQ_TYPE_CLASS;

phost->Control.setup.b.bRequest = USB_HID_SET_IDLE;
phost->Control.setup.b.wValue.w = (duration << 8 ) | reportId;

phost->Control.setup.b.wIndex.w = 0;
phost->Control.setup.b.wLength.w = 0; 这个0也改大点 我也改的100;

return USBH_CtlReq(pdev, phost, 0 , 0 );
然后下进去就好使了
串口输出结果:
USB Host library started.
USB Host Library v2.1.0
> Device Attached
> USBH_USR_ResetDevice
> Low speed device detected
> VID : 093Ah
> PID : 2521h
> HID device connected
> Manufacturer : N/Ar
> Product : USB OPTICAL MOUSE
> Serial Number : N/A
> Enumeration completed
mouse init-30-70-120-170-190-200-230-230-230-240-250-270-290-280-290-290-300-310-320-300-280-240-210-150-80-4000-30-60-100-140-160-180-190-220-210-190-190-170-150-140-120-110-120-100-120-120-90-100-90-90-70-60-40-2000-20-20-30-50-60-70-90-110-140-150-150-160-150-140-120-80-60-200000000000-40-80-130-190-260-330-380-410-460-490-490-520-470-400-310-190-60-10-30-40-70-100-110-130-110-100-80-80-70-60-50-40-20-10-10-20-40-40-60-70-80-80-100-100-110-120-120-130-130-140-130-140-130-140-150-130-130-120-120-110-110-90-90-90-90-60-50-50-30-1000-30-50-60-70-80-100-100-110-110-130-110-110-90-80-60-50-30-20-10-1000-20-40-50-60-70-70-90-100-110-110-110-120-110-120-100-90-80-70-40-30-10-10-30-40-50-60-50-50-40-30-30-30-30-20-30-20-100000-1000pressed release pressed release pressed 00 release pressed release pressed release pressed release

具体延迟时间和请求数据设多少好像不同的鼠标不一样 但是肯定不能是零吧 不过尽量长点吧
以上个人经验 不知道对不对 留个记录 以后用到好百度