探索者f4视频盘盘-第97讲usb鼠标键盘host实验_第1页
探索者f4视频盘盘-第97讲usb鼠标键盘host实验_第2页
探索者f4视频盘盘-第97讲usb鼠标键盘host实验_第3页
探索者f4视频盘盘-第97讲usb鼠标键盘host实验_第4页
探索者f4视频盘盘-第97讲usb鼠标键盘host实验_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

淘宝店铺:技术论坛《手把手教你学STM32》主讲人:正点原子团队硬件平台:正点原子STM32开发板:广州市星翼电子科技有限公司淘宝店铺:技术论坛:开源电子网公众平台:“正点原子”官方网站:联系电话:ALIENTEK《手把手教你学STM32》USB鼠标键盘实验(M4)淘宝店铺:技术论坛STM32F1xx开发板(正点原子)STM32F4xx开发板(正点原子)适用平台本视频重点参考资料淘宝店铺:技术论坛参考资料:1,探索者STM32F407开发板《STM32F4开发指南-库函数版本》——USB鼠标键盘(Host)实验2,USB参考资料①《STM32F4xx中文参考手册》-第30章全速USBon-the-go(OTG_FS)

②光盘:STM32参考资料STM32USB学习资料CD00289278.pdf(UM1021)③光盘:STM32参考资料STM32USB学习资料USB培训.pdf(分为Part1~3,三个部分,是ST官方USB培训资料)3,USB参考代码光盘:STM32参考资料STM32USB学习资料stm32_f105-07_f2_f4_usb-host-device_lib.zip目录淘宝店铺:技术论坛USB鼠标键盘简介1

硬件连接2

代码移植&例程测试31、USB鼠标键盘简介淘宝店铺:技术论坛传统的鼠标和键盘是采用PS/2接口和电脑通信的,但是现在PS/2接口在电脑上逐渐消失,所以现在越来越多的鼠标键盘采用的是USB接口,而不是PS/2接口的了。USB鼠标键盘属于USBHID设备。USBHID即:HumanInterfaceDevice(人机交互设备)的缩写,键盘、鼠标与游戏杆等都属于此类设备。不过HID设备并不一定要有人机接口,只要符合HID类别规范的设备都是HID设备。关于USBHID的知识,我们这里就不详细介绍了,请大家自行百度学习。1、USB鼠标键盘简介淘宝店铺:技术论坛STM32F4的USBOTGFS支持USBHID设备,并且ST官方提供了USBHID例程(支持USB鼠标和USB键盘),官方例程路径:光盘STM32参考资料STM32USB学习资料stm32_f105-07_f2_f4_usb-host-device_lib.zip(解压)ProjectUSB_Host_ExamplesHID。

本视频,我们将移植该例程到探索者STM32F4开发板上,以通过STM32F4的USBHOST接口,实现USB鼠标和USB键盘的驱动。2、硬件连接-STM32F4硬件连接淘宝店铺:技术论坛探索者STM32F407开发板,自带了USBHOST功能,并板载了一个USBA座,可以插U盘、USB鼠标、USB键盘、USB手柄等设备,硬件连接原理图如下:特别注意:USB_SLAVE和USB_HOST共用D-和D+,所以,他们不能同时连接!!3、代码移植&例程测试-源码说明淘宝店铺:技术论坛光盘程序源码标准例程(库函数/寄存器)实验54USB鼠标键盘(Host)实验探索者STM32F4开发板源码本例程,我们是在标准例程-库函数版本:TFTLCD显示实验的基础上,移植ST官方的主机HID例程而来。3、代码移植&例程测试-代码移植过程淘宝店铺:技术论坛1,打开ST官方的主机HID例程,如下图所示:这3个文件用户可配置,包括:板级支持代码、用户应用层代码、LCD鼠标数据显示代码(本例程不用)。USB底层驱动代码,包括通用部分和主机(Host)部分的代码。USB主机库驱动代码,包括主机内核驱动和主机HID类驱动代码。根据此例程,我们知道了与USB相关的代码,方便移植。USB驱动代码说明,详见:CD00289278.pdf3、代码移植&例程测试-代码移植过程淘宝店铺:技术论坛2,STM32F4USB通信需要用的库,如下图所示:1,USB从机驱动库2,USB主机驱动库3,USB_OTG内核驱动代码有了ST提供的这两个库和USB_OTG驱动,我们可以很方便的实现各种USB功能,本例程,我们将使用:2+3,实现USB鼠标键盘例程。3、代码移植&例程测试-代码移植过程淘宝店铺:技术论坛3,打开TFTLCD显示实验,拷贝USB驱动库,如下图所示:在工程目录下,新建USB文件夹,然后拷贝ST官方USB驱动库代码进来。新建USB_APP文件夹,拷贝主机HID相关代码3、代码移植&例程测试-代码移植过程淘宝店铺:技术论坛4,打开TFTLCD显示实验工程,添加USB相关代码,如下图所示:根据ST官方的主机HID例程,新建USB_OTG组,存放USB_OTG内核驱动代码,新建USB_HOST组,存放USB主机与HID相关代码,新建USB_APP存放用户配置相关驱动代码。头文件包含路径记得添加!!3、代码移植&例程测试-代码移植过程淘宝店铺:技术论坛5,编译代码,根据报错提示,修改相关内容。①,usb_conf.h,include部分,使用如下代码替代:#include"stm32f4xx.h"②,在C/C++选项卡,定义全局宏:USE_USB_OTG_FS,选择使用USBOTGFS,如图所示:3、代码移植&例程测试-代码移植过程淘宝店铺:技术论坛③,修改usbh_usr.c。3.1,删除lcd_log.h等头文件,并添加usb_hcd_int.h等头文件,如下所示:3.2,定义bDeviceState变量,用于记录连接状态。然后,去掉一些用不到的变量和宏定义,并添加USB中断处理函数(官方例程在stm32fxxx_it.c里面处理)到本.c文件,如下所示://表示USB连接状态:0,没连接;1,已连接vu8bDeviceState=0; //默认没有连接externUSB_OTG_CORE_HANDLEUSB_OTG_Core_dev;//在main函数定义externvoidUSBH_Msg_Show(u8msgx); //在main函数定义u8USB_FIRST_PLUGIN_FLAG=0; //USB第一次插入标志,如果为1,说明是第一次插入//USBOTG中断服务函数,处理所有USB中断voidOTG_FS_IRQHandler(void){ USBH_OTG_ISR_Handler(&USB_OTG_Core_dev);}#include"usbh_usr.h"#include"usb_hcd_int.h"#include"usbh_hid_mouse.h"#include"usbh_hid_keybd.h"#include"delay.h"#include"lcd.h"#include"string.h"3、代码移植&例程测试-代码移植过程淘宝店铺:技术论坛voidUSBH_USR_Init(void){ printf("USBOTGHSMSCHost\r\n"); printf(">USBHostlibrarystarted.\r\n"); printf("USBHostLibraryv2.1.0\r\n\r\n");

}3.3,修改USBH_USR_Init函数为:voidUSBH_USR_DeviceAttached(void)//U盘插入{ printf("检测到USB设备插入!\r\n");}3.4,修改USBH_USR_DeviceAttached函数为:voidUSBH_USR_UnrecoveredError(void){ printf("无法恢复的错误!!!\r\n\r\n"); }3.5,修改USBH_USR_UnrecoveredError函数为:3、代码移植&例程测试-代码移植过程淘宝店铺:技术论坛voidUSBH_USR_DeviceDisconnected(void)//U盘移除{ printf("USB设备拔出!\r\n"); bDeviceState=0; //USB设备拔出了

USBH_Msg_Show(0);}3.6,修改USBH_USR_DeviceDisconnected函数为:voidUSBH_USR_ResetDevice(void){ printf("复位设备...\r\n");}3.7,修改USBH_USR_ResetDevice函数为:3、代码移植&例程测试-代码移植过程淘宝店铺:技术论坛voidUSBH_USR_DeviceSpeedDetected(uint8_tDeviceSpeed){ if(DeviceSpeed==HPRT0_PRTSPD_HIGH_SPEED) { printf("高速(HS)USB设备!\r\n"); } elseif(DeviceSpeed==HPRT0_PRTSPD_FULL_SPEED) { printf("全速(FS)USB设备!\r\n"); } elseif(DeviceSpeed==HPRT0_PRTSPD_LOW_SPEED) { printf("低速(LS)USB设备!\r\n"); } else { printf("设备错误!\r\n"); }}3.8,修改USBH_USR_DeviceSpeedDetected函数为:3、代码移植&例程测试-代码移植过程淘宝店铺:技术论坛voidUSBH_USR_Device_DescAvailable(void*DeviceDesc){ USBH_DevDesc_TypeDef*hs; hs=DeviceDesc; printf("VID:%04Xh\r\n",(uint32_t)(*hs).idVendor); printf("PID:%04Xh\r\n",(uint32_t)(*hs).idProduct);}3.9,修改USBH_USR_Device_DescAvailable函数为:voidUSBH_USR_DeviceAddressAssigned(void){ printf("从机地址分配成功!\r\n");}3.10,修改USBH_USR_DeviceAddressAssigned函数为:3、代码移植&例程测试-代码移植过程淘宝店铺:技术论坛voidUSBH_USR_Configuration_DescAvailable(USBH_CfgDesc_TypeDef*cfgDesc,USBH_InterfaceDesc_TypeDef*itfDesc,USBH_EpDesc_TypeDef*epDesc){ USBH_InterfaceDesc_TypeDef*id; id=itfDesc; if((*id).bInterfaceClass==0x08) { printf("可移动存储器设备!\r\n"); }elseif((*id).bInterfaceClass==0x03) { printf("HID设备!\r\n"); }}3.11,修改USBH_USR_Configuration_DescAvailable函数为:voidUSBH_USR_Manufacturer_String(void*ManufacturerString){ printf("Manufacturer:%s\r\n",(char*)ManufacturerString);}3.12,修改USBH_USR_Manufacturer_String函数为:3、代码移植&例程测试-代码移植过程淘宝店铺:技术论坛voidUSBH_USR_Product_String(void*ProductString){ printf("Product:%s\r\n",(char*)ProductString);}3.13,修改USBH_USR_Product_String函数为:voidUSBH_USR_SerialNum_String(void*SerialNumString){ printf("SerialNumber:%s\r\n",(char*)SerialNumString);}3.14,修改USBH_USR_SerialNum_String函数为:voidUSBH_USR_EnumerationDone(void){ printf("设备枚举完成!\r\n\r\n");}3.15,修改USBH_USR_EnumerationDone函数为:3、代码移植&例程测试-代码移植过程淘宝店铺:技术论坛voidUSBH_USR_DeviceNotSupported(void){ USBH_Msg_Show(3);//无法识别的USB设备

//printf("无法识别的USB设备!\r\n\r\n");}3.16,修改USBH_USR_DeviceNotSupported函数为:USBH_USR_StatusUSBH_USR_UserInput(void){ printf("跳过用户确认步骤!\r\n"); bDeviceState=1;//USB设备已经连接成功

returnUSBH_USR_RESP_OK;}3.17,修改USBH_USR_UserInput函数为:voidUSBH_USR_OverCurrentDetected(void){ printf("端口电流过大!!!\r\n");}3.18,修改USBH_USR_OverCurrentDetected函数为:3、代码移植&例程测试-代码移植过程淘宝店铺:技术论坛voidUSR_MOUSE_Init(void){ USBH_Msg_Show(2); //USB鼠标

USB_FIRST_PLUGIN_FLAG=1;//标记第一次插入}3.19,修改USR_MOUSE_Init函数为:3.21,定义数组tbuf,用于存储鼠标/键盘输入的内容,如下所示:voidUSR_KEYBRD_Init(void){ USBH_Msg_Show(1); //USB键盘

USB_FIRST_PLUGIN_FLAG=1;//标记第一次插入}3.20,修改USR_KEYBRD_Init函数为://零时数组,用于存放鼠标坐标/键盘输入内容(4.3屏,最大可以输入2016字节)__align(4)u8tbuf[2017];3、代码移植&例程测试-代码移植过程淘宝店铺:技术论坛3.22,修改USR_MOUSE_ProcessData函数为:voidUSR_MOUSE_ProcessData(HID_MOUSE_Data_TypeDef*data){ staticsignedshortx,y,z; if(USB_FIRST_PLUGIN_FLAG)//第一次插入,将数据清零

{ USB_FIRST_PLUGIN_FLAG=0;x=y=z=0; } x+=(signedchar)data->x; if(x>9999)x=9999;if(x<-9999)x=-9999; y+=(signedchar)data->y; if(y>9999)y=9999;if(y<-9999)y=-9999; z+=(signedchar)data->z; if(z>9999)z=9999;if(z<-9999)z=-9999; POINT_COLOR=BLUE; sprintf((char*)tbuf,"BUTTON:"); if(data->button&0X01)strcat((char*)tbuf,"LEFT"); if((data->button&0X03)==0X02)strcat((char*)tbuf,"RIGHT"); elseif((data->button&0X03)==0X03)strcat((char*)tbuf,"+RIGHT"); if((data->button&0X07)==0X04)strcat((char*)tbuf,"MID"); elseif((data->button&0X07)>0X04)strcat((char*)tbuf,"+MID"); LCD_Fill(30+56,180,lcddev.width,180+16,WHITE);LCD_ShowString(30,180,210,16,16,tbuf); sprintf((char*)tbuf,"XPOS:%05d",x);LCD_ShowString(30,200,200,16,16,tbuf); sprintf((char*)tbuf,"YPOS:%05d",y);LCD_ShowString(30,220,200,16,16,tbuf); sprintf((char*)tbuf,"ZPOS:%05d",z);LCD_ShowString(30,240,200,16,16,tbuf);}3、代码移植&例程测试-代码移植过程淘宝店铺:技术论坛3.23,修改USR_KEYBRD_ProcessData函数为:voidUSR_KEYBRD_ProcessData(uint8_tdata){ staticu16pos,endx,endy,maxinputchar; u8buf[4]; if(USB_FIRST_PLUGIN_FLAG)//第一次插入,将数据清零

{ USB_FIRST_PLUGIN_FLAG=0;pos=0; endx=((lcddev.width-30)/8)*8+30; //得到endx值

endy=((lcddev.height-220)/16)*16+220; //得到endy值

maxinputchar=((lcddev.width-30)/8); maxinputchar*=(lcddev.height-220)/16; //当前LCD最大可以显示的字符数. } POINT_COLOR=BLUE; sprintf((char*)buf,"%02X",data);LCD_ShowString(30+56,180,200,16,16,buf);//显示键值

if(data>=''&&data<='~') { tbuf[pos++]=data; tbuf[pos]=0; //添加结束符. if(pos>maxinputchar)pos=maxinputchar; //最大输入这么多

}elseif(data==0X0D){if(pos)pos--;tbuf[pos]=0;} //退格键,添加结束符. if(pos<=maxinputchar) //没有超过显示区

{ LCD_Fill(30,220,endx,endy,WHITE);LCD_ShowString(30,220,endx-30,endy-220,16,tbuf); } }3、代码移植&例程测试-代码移植过程淘宝店铺:技术论坛3.24,修改USBH_USR_DeInit函数为:voidUSBH_USR_DeInit(void){ printf("重新初始化!!!\r\n");}3.25,由于ST官方HID例程,某些时候会死机(通信死机/枚举死机),所以,我们在usbh_usr.c里面,添加检查USB死机的相关代码,一旦发现死机,立即重启USB。新增:mDead,检查通信死机,代码如下://USBHID通信死机检测,防止USB通信死机(暂时仅针对:DTERR,即Datatoggleerror)//pcore:USB_OTG_Core_dev_HANDLE结构体指针//phidm:HID_Machine_TypeDef结构体指针//返回值:0,没有死机//1,死机了,外部必须重新启动USB连接.u8mDead(USB_OTG_CORE_HANDLE*pcore,HID_Machine_TypeDef*phidm){ if(pcore->host.HC_Status[phidm->hc_num_in]==HC_DATATGLERR)//检测到DTERR错误,直接重启USB. { return1; } return0;}3、代码移植&例程测试-代码移植过程淘宝店铺:技术论坛3.26,新增:USBH_Check_EnumeDead,检查枚举死机,代码如下://USB枚举状态死机检测,防止USB枚举失败导致的死机//phost:USB_HOST结构体指针//返回值:0,没有死机//1,死机了,外部必须重新启动USB连接.u8USBH_Check_EnumeDead(USBH_HOST*phost){ staticu16errcnt=0; //这个状态,如果持续存在,则说明USB死机了. if(phost->gState==HOST_CTRL_XFER&&(phost->EnumState==ENUM_IDLE||phost->EnumState==ENUM_GET_FULL_DEV_DESC)) { errcnt++; if(errcnt>2000)//死机了

{ errcnt=0; RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS,ENABLE);//USB复位

delay_ms(5); RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS,DISABLE);//复位结束

return1; } }elseerrcnt=0; return0;}3、代码移植&例程测试-代码移植过程淘宝店铺:技术论坛//表示USB连接状态//0,没有连接;//1,已经连接;externvu8bDeviceState; //默认没有连接u8USBH_Check_EnumeDead(USBH_HOST*phost);u8mDead(USB_OTG_CORE_HANDLE*pcore,HID_Machine_TypeDef*phidm);3.28,最后,将bDeviceState变量的声明和USBH_Check_EnumeDead与mDead这两个函数的定义,加入usbh_usr.h,以便其他函数调用,如下:3.27,将usbh_usr.h里面的usbh_usr_lcd.h头文件,用usbh_hid_core.h替代,如下所示:#include"usbh_core.h"#include"usbh_hid_core.h"#include"usb_conf.h"#include<stdio.h>3、代码移植&例程测试-代码移植过程淘宝店铺:技术论坛④,修改usb_bsp.c。这个.c文件的代码,完全同:USBU盘(HOST)实验,所以,直接从这个例程拷贝过来即可。⑤,修改usbh_hid_mouse.c,修改MOUSE_Decode函数代码,以支持5/6字节输出的USB鼠标,如下所示:externHID_Machine_TypeDefHID_Machine; staticvoidMOUSE_Decode(uint8_t*data){ if(HID_Machine.length==5||HID_Machine.length==6)//5/6字节长度的USB鼠标数据处理

{ HID_MOUSE_Data.button=data[0]; HID_MOUSE_Data.x=data[1]; HID_MOUSE_Data.y=data[3]<<4|data[2]>>4; HID_MOUSE_Data.z=data[4]; }elseif(HID_Machine.length==4) //4字节长度的USB鼠标数据处理

{ HID_MOUSE_Data.button=data[0]; HID_MOUSE_Data.x=data[1]; HID_MOUSE_Data.y=data[2]; HID_MOUSE_Data

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论