【STM32+cubemx】0017 HAL库开发:usb HID鼠标设备实现

Cubemx可以生成多种usb设备的初始化代码,本节我们就使用它来生成一个usb HID鼠标的工程,在开发板上运行以后,可以模拟usb鼠标的功能。

1)生成USB HID工程

仍然使用串口工程,如下图添加USB的配置:

可以看到,勾选usb device的功能后,右侧的芯片引脚已经设置好了,DP和DM两根线就是usb通信的差分线,使用了PA11和PA12引脚。

再配置USB的软件中间件,选择usb device,Human Interface Device Class,这个选项生成的就是usb鼠标工程。

修改时钟设置,把usb时钟设置为48M:

其他的配置都不用改,就可以生成工程代码了。

2)代码编写

打开生成的keil工程,可以看到已经生成了几个usb相关的源文件:

我们先来了解一下相关的代码,先打开usbd_hid.c这个源文件,找到其中定义的USBD_HID_CfgDesc数组,这里定义了hid设备的一些参数:

第161行定义了这是一个鼠标,第183行定义了数据发送的间隔为10ms。

间隔这个参数,也可以调用USBD_HID_GetPollingInterval这个函数获取,这个函数也在usbd_hid.c文件中定义。

(其他具体参数的定义比较复杂,可以学习一下usb的描述符后再解读)

接下来,我们需要了解的是USBD_HID_SendReport这个函数,也在usbd_hid.c中定义,它就是usb发送的函数,看以看到它内部调用了USB的发送函数,所以调用它就能把数据通过usb口发到上位机:

然后,我摸还需要知道鼠标传输数据的协议。鼠标发送的数据格式,一共四个字节:

第一个字节表示按键,bit0对应左键、bit1对应右键、bit3对应中键;0表示未按,1表示按下;

第二个字节表示x轴(即鼠标左右移动,0表示不动,正值表示往右移,负值表示往左移,范围-127~127,绝对值对应了移动量大小);

第三个字节表示y轴(即鼠标上下移动,0表示不动,正值表示往下移,负值表示往上移,范围-127~127,绝对值对应了移动量大小);

第四个字节表示鼠标滚轮(正值为往上滚动,负值为往下滚动,-127~127,绝对值对应了移动量大小)。

了解了以上这些必要的知识,我们就可以改写代码了,在主函数中添加,如下图所示:

先获取设备发送数据的间隔,保存,用作后面的延时使用;

再初始化X、Y方向的移动距离,要发送的数据保存在HID_Buffer数组中,然后就可以把数据发送出去了。

这一段代码实现的是,使鼠标按“左上<-->右下”的方式往复运动,运行距离为2。

编译、下载后,断电,再将开发板usb口连接到计算机上,就可以看到计算机识别出了一个新的鼠标设备,并且鼠标会自动来回运动。

注意观察一下设备的VID和PID,和cubemx的设置是一样的。

3)注意事项

a)usb hid设备的初始化

由于一般计算机都能识别HID设备,所以不用安装特殊的驱动程序也能够运行起来。但是需要注意的是,如果不断电重新插拔设备,可能会识别不到HID设备。

这是由于HID设备在初始插接到计算机上时,会同计算机进行几次交互,让计算机知道自己是个鼠标设备(或者键盘设备等等)、以及约定其他一些事项,之后才是向计算机发送数据。Cubemx生成的工程文件中,在初始化usb时,已经有这部分交互的代码了;所以我们在主循环中只需要发送鼠标的运动、点击等数据即可。

如果不断电,程序重新开始运行,计算机可能不会理会这些交互数据,会认为这是已有的usb设备在发送一般的通信数据,所以不能初始化成功。解决办法是在程序初始运行时,将usb的通信线拉低一下,让计算机认为有新设备插入,再去执行usb的初始化,这样就能顺利执行交互,让计算机识别出这是个鼠标设备。

增加的代码如下图,在初始化之前,把usb的IO口拉低一下( 使用USB_IO_rest()函数 ):

该函数具体实现如下:

添加这段代码后,只要程序重新执行,计算机就会认为有新的usb设备插入,会开始交互通信去识别设备的种类。

b)关于通信的时间间隔

主函数中,如图示的两行:

先获取usb设备的通信间隔,然后在主循环中,每延时这个间隔后,发送一次数据。

这个间隔是必须的,因为设备初始定义时包含了这个参数,会在和计算机的交互中确定设备的通信时间间隔;实际使用时,延时大于这个时间是可以的,但是小于这个时间会导致计算机端丢失数据。

好了,本节usb模拟HID鼠标的方法,就讲到这里了。

欢迎关注我的公众号,可留言“资料”获取相关资料和软件:

  • 9
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: STM32 USB HID是指STM32系列单片机的一种USB设备协议,在该协议下,STM32单片机可以作为一个USB HID(Human Interface Device)设备与计算机进行数据通信,实现数据传输和设备控制等功能。 在STM32 USB HID通信中,STM32单片机通常使用USB接口作为数据传输的主要通信接口,通过该接口可以实现与计算机的数据交互。在该模式下,STM32单片机作为一个USB设备,可以模拟各种不同的传感器、按键、鼠标设备,从而实现与计算机的数据交互的目的。 可以使用ST的STM32CubeMX软件来配置STM32USB HID功能,通过配置一些参数,可以支持多种不同的USB HID设备类型,如鼠标、键盘、游戏手柄等。通过自定义USB HID协议,还可以实现更加丰富的功能,例如在游戏开发中,可以使用STM32 USB HID协议来实现游戏手柄控制等。 总之,STM32 USB HIDSTM32系列单片机的一种重要的USB设备协议,可以广泛应用于各种数据传输和设备控制场景,具有易用性、可扩展性以及高效性等优点,在未来的嵌入式系统应用中具有广泛的发展前景。 ### 回答2: STM32 USBHID,是指在STM32单片机实现USB HID(Human Interface Device)协议的技术。USB HID是一种USB设备通讯协议,它定义了如何在计算机和外设之间传输数据,并规定了外设的功能。比如键盘、鼠标、游戏手柄、触摸屏等都可以通过USB HID协议来实现数据传输。 在STM32单片机实现USB HID协议,可以使STM32连接计算机时,被识别为一个HID设备,从而完成与计算机之间的数据传输。例如,可以通过STM32实现一个USB键盘,当STM32接入计算机时,相当于插入了一个键盘,可以通过代码控制键盘的按键输出。还可以实现一个USB鼠标,通过控制鼠标指针的坐标和点击事件,实现鼠标操作。 需要注意的是,实现USB HID协议需要使用STM32USB接口,需要进行复杂的USB协议栈和设备驱动的开发。同时,也需要掌握相关的USB HID协议知识。因此,对于初学者来说,需要认真学习STM32USB开发知识,并且根据具体的需求选择合适的开发工具和技术路线。 ### 回答3: STM32 USBHID是指基于STMicroelectronics公司生产的STM32微控制器的USB HID协议接口。USB HID(Human Interface Device)是一种用于支持人机交互的USB协议,它可以用来传输各种输入设备(如鼠标、键盘、游戏手柄等)的数据到计算机中。 STM32 USBHID具有以下特点: 1. 易于使用:STM32 USBHID提供了丰富的软件库和例程,使得开发者可以快速且方便地实现USB HID的功能。 2. 高性能:STM32微控制器具有高速的计算能力和丰富的外设接口,能够满足各种应用需求。 3. 灵活性强:STM32 USBHID支持自定义报告格式和热插拔功能,可以根据应用需求进行灵活配置。 4. 低功耗:STM32微控制器采用低功耗技术,可以实现低功耗运行,并支持强大的省电模式,可以有效延长电池寿命。 在应用方面,STM32 USBHID可以广泛应用于鼠标、键盘、游戏手柄、医疗设备等领域。比如,开发者可以使用STM32 USBHID制作一款自定义的游戏手柄,或者是一种带有安全锁的医疗设备,以实现更好的用户体验和数据安全性。总之,STM32 USBHID是一种功能强大、易于使用的USB协议接口,拥有广泛的应用前景和市场需求。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值