STM32的USB键盘及鼠标例程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

STM32的USB键盘及鼠标例程时间:2011-07-1921:35:05来源:作者:STM32的USB键盘及鼠标例程通过网络可以搜到很,但是在同一个设备中集成键盘及鼠标的例程却比较少见(我通过GOOGLE只搜到圈圈的基于51+D12的版本)。以下为我参考圈圈的例程做出来的集成键盘及鼠标的STM32的程序。程序上除了usb_desc.c及usb_endp.c外,其它部份同单一的键盘鼠标一样。下面着重说一下usb_desc.c及usb_endp.c的不同之处。单一键盘鼠标跟集成键盘鼠标这区别主要是报告描述符不同。单一键盘鼠标的报告描述符因只有一组报告输入/输出,故没有报告ID,而集成的有两组报告(键盘及鼠标),所以每一组报告都有一个报告ID加以区别。另外就是在usb_endp.c中对端点的数据发送不知道是不是我的原因,待发送数据长度有问题,原因还未找到,只能在后面增加一条设置发送数据长度的语句。(如果不加的话,PC端只会收到8位数据,尽管我程序里设置了9位数据)完整的usb_desc.c文件如下:#includeSTM32Lib\USBLib\usb_lib.h#includeusb_desc.h//KM_DeviceDescriptorconstu8HID_DeviceDescriptor[HID_SIZE_DEVICE_DESC]={0X12,//bLengthUSB_DEVICE_DESCRIPTOR_TYPE,//bDescriptorType0x00,//bcdUSB0x02,0x00,//bDeviceClass0X00,//bDeviceSubClass0x00,//bDeviceProtocol0x40,//bMaxPacketSize400x34,//idVendor(0x0483)0x12,0x78,//idProduct=0x57100x56,0x00,//bcdDevicerel.20.000x02,1,//indexofstringdescriptordescribingmanufacturer2,//indexofstringdescriptordescribingproduct3,//indexofstringdescriptordescribingthedeviceserialnumber0x01//bNumConfigurations};//USBConfigurationDescriptorconstu8HID_ConfigDescriptor[HID_SIZE_CONFIG_DESC]={0X09,//bLengthUSB_CONFIGURATION_DESCRIPTOR_TYPE,//bDescriptorTypeHID_SIZE_CONFIG_DESC,//wTotalLength0x00,0x01,//bNumInterfaces接口数目0x01,//bConfigurationValueset_configuration命令所需要的参数值0x00,//iConfiguration0xE0,//bmAttributes0x32,//MaxPower100mA//***************接口1配置***************0x09,USB_INTERFACE_DESCRIPTOR_TYPE,0x00,//接口编号0x00,0x02,//端点数0x03,0x01,//1=boot0=noboot0x01,//0=none1=keyboard2=mouse0,//接口描述符索引值//***************HID描述符****************0x09,HID_DESCRIPTOR_TYPE,0x10,0x01,0x00,0x01,0x22,HID_SIZE_REPORT_DESC,0x00,//***************端点1输入描述***************0x07,USB_ENDPOINT_DESCRIPTOR_TYPE,0x81,0x03,0x0A,0x00,0x20,//***************端点1输出描述***************0x07,USB_ENDPOINT_DESCRIPTOR_TYPE,0x01,0x03,0x0A,0x00,0x20,};//MOUSEConfigDescriptorconstu8HID_ReportDescriptor[HID_SIZE_REPORT_DESC]={/************************USB键盘部分报告描述符**********************//*******************************************************************///这是一个全局(bType为1)条目,将用途页选择为普通桌面GenericDesktopPage(0x01)//后面跟一字节数据(bSize为1),后面的字节数就不注释了,//自己根据bSize来判断。0x05,0x01,//USAGE_PAGE(GenericDesktop)//这是一个局部(bType为2)条目,说明接下来的集合用途用于键盘0x09,0x06,//USAGE(Keyboard)//这是一个主条目(bType为0)条目,开集合,后面跟的数据0x01表示//该集合是一个应用集合。它的性质在前面由用途页和用途定义为//普通桌面用的键盘。0xa1,0x01,//COLLECTION(Application)//报告ID,这里定义键盘报告的ID为1(报告ID0是保留的)0x85,0x01,//ReportID(1)//这是一个全局条目,选择用途页为键盘(Keyboard/Keypad(0x07))0x05,0x07,//USAGE_PAGE(Keyboard/Keypad)//这是一个局部条目,说明用途的最小值为0xe0。实际上是键盘左Ctrl键。//具体的用途值可在HID用途表中查看。0x19,0xe0,//USAGE_MINIMUM(KeyboardLeftControl)//这是一个局部条目,说明用途的最大值为0xe7。实际上是键盘右GUI键。0x29,0xe7,//USAGE_MAXIMUM(KeyboardRightGUI)//这是一个全局条目,说明返回的数据的逻辑值(就是我们返回的数据域的值)//最小为0。因为我们这里用Bit来表示一个数据域,因此最小为0,最大为1。0x15,0x00,//LOGICAL_MINIMUM(0)//这是一个全局条目,说明逻辑值最大为1。0x25,0x01,//LOGICAL_MAXIMUM(1)//这是一个全局条目,说明数据域的数量为八个。0x95,0x08,//REPORT_COUNT(8)//这是一个全局条目,说明每个数据域的长度为1个bit。0x75,0x01,//REPORT_SIZE(1)//这是一个主条目,说明有8个长度为1bit的数据域(数量和长度//由前面的两个全局条目所定义)用来做为输入,//属性为:Data,Var,Abs。Data表示这些数据可以变动,Var表示//这些数据域是独立的,每个域表示一个意思。Abs表示绝对值。//这样定义的结果就是,当某个域的值为1时,就表示对应的键按下。//bit0就对应着用途最小值0xe0,bit7对应着用途最大值0xe7。0x81,0x02,//INPUT(Data,Var,Abs)//这是一个全局条目,说明数据域数量为1个0x95,0x01,//REPORT_COUNT(1)//这是一个全局条目,说明每个数据域的长度为8bit。0x75,0x08,//REPORT_SIZE(8)//这是一个主条目,输入用,由前面两个全局条目可知,长度为8bit,//数量为1个。它的属性为常量(即返回的数据一直是0)。//该字节是保留字节(保留给OEM使用)。0x81,0x03,//INPUT(Cnst,Var,Abs)//这是一个全局条目。定义位域数量为6个。0x95,0x06,//REPORT_COUNT(6)//这是一个全局条目。定义每个位域长度为8bit。//其实这里这个条目不要也是可以的,因为在前面已经有一个定义//长度为8bit的全局条目了。0x75,0x08,//REPORT_SIZE(8)//这是一个全局条目,定义逻辑最小值为0。//同上,这里这个全局条目也是可以不要的,因为前面已经有一个//定义逻辑最小值为0的全局条目了。0x15,0x00,//LOGICAL_MINIMUM(0)//这是一个全局条目,定义逻辑最大值为255。0x25,0xFF,//LOGICAL_MAXIMUM(255)//这是一个全局条目,选择用途页为键盘。//前面已经选择过用途页为键盘了,所以该条目不要也可以。0x05,0x07,//USAGE_PAGE(Keyboard/Keypad)//这是一个局部条目,定义用途最小值为0(0表示没有键按下)0x19,0x00,//USAGE_MINIMUM(Reserved(noeventindicated))//这是一个局部条目,定义用途最大值为0x650x29,0x65,//USAGE_MAXIMUM(KeyboardApplication)//这是一个主条目。它说明这六个8bit的数据域是输入用的,//属性为:Data,Ary,Abs。Data说明数据是可以变的,Ary说明//这些数据域是一个数组,即每个8bit都可以表示某个键值,//如果按下的键太多(例如超过这里定义的长度或者键盘本身无法//扫描出按键情况时),则这些数据返回全1(二进制),表示按键无效。//Abs表示这些值是绝对值。0x81,0x00,//INPUT(Data,Ary,Abs)//以下为输出报告的描述//逻辑最小值前面已经有定义为0了,这里可以省略。//这是一个全局条目,说明逻辑值最大为1。0x25,0x01,//LOGICAL_MAXIMUM(1)//这是一个全局条目,说明数据域数量为5个。0x95,0x05,//REPORT_COUNT(5)//这是一个全局条目,说明数据域的长度为1bit。0x75,0x01,//REPORT_SIZE(1)//这是一个全局条目,说明使用的用途页为指示灯(LED)0x05,0x08,//USAGE_PAGE(LEDs)//这是一个局部条目,说明用途最小值为数字键盘灯。0x19,0x01,//USAGE_MINIMUM(NumLock)//这是一个局部条目,说明用途最大值为Kana灯。0x29,0x05,//USAGE_MAXIMUM(Kana)//这是一个主条目。定义输出数据,即前面定义的5个LED。0x91,0x02,//OUTPUT(Data,Var,Abs)//这是一个全局条目。定义位域数量为1个。0x95,0x01,//REPORT_COUNT(1)//这是一个全局条目。定义位域长度为3bit。0x75,0x03,//REPORT_SIZE(3)//这是一个主条目,定义输出常量,前面用了5bit,所以这里需要//3个bit来凑成一字节。0x91,0x03,//OUTPUT(Cnst,Var,Abs)//下面这个主条目用来关闭前面的集合。bSize为0,所以后面没数据。0xc0,//END_COLLECTION//以下注释不包括第一字节报告ID。//通过上面的报告描述符的定义,我们知道返回的输入报告具有8字节。//第一字节的8个bit用来表示特殊键是否按下(例如Shift、Alt等键)。//第二字节为保留值,值为常量0。第三到第八字节是一个普通键键值的//数组,当没有键按下时,全部6个字节值都为0。当只有一个普通键按下时,//这六个字节中的第一字节值即为该按键的键值(具体的键值请看HID的//用途表文档),当有多个普通键同时按下时,则同时返回这些键的键值。//如果按下的键太多,则这六个字节都为0xFF(不能返回0x00,这样会让//

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功