基于STM32CubeMX的USB鼠标例程

发布时间:2023-08-22  

最近在玩STM32CUBE的USB功能,用起来还是挺方便的。只要配置一下,设备描述符、配置描述符、接口描述符什么的,都能给你自动生成,其中还包括比较复杂的报告描述符。

这次给大家演示一下如何用STM32CUBE的配置,自动生成一个USB鼠标的过程。这里多说一句,USB是一套比较复杂的协议,单靠一两个例程是不可能完全理解的。至少要找本书,再配着USB官网的各种协议啃几天,才算入门。

所以这个例子起到的是一个抛砖引玉的过程,如果你真的感兴趣,就去找相关资料学习。STM32CubeMX的便利,在很多方面都给了我们很大的帮助!当然,如果有感兴趣的想继续学的,可以留言,我会试着写一些这方面的文章。

首先,软件版本我用的是STM32CubeMX的5.3.0,并不是最新版。为什么没用最新的?最新版有个很恶心的bug,好像是打不开工程,记不清了。

打开STM32CUBE,选择一个芯片。这里我选的是STM32F103C8T6。


其次,RCC这里外部高速时钟,外部默认都接8MHZ。

第三,SYS这里,调试接口选择Serial Wire。我个人习惯用SW接口,你们随意。

第四,GPIO这里,我把PA15设置为推挽输出,默认高电平。这是和我的硬件电路相关的。首先要明确的一点是,STM32F103C8的这个片子,只支持USB的FS模式,也就是全速(FULL SPEED)模式。

USB主机(也就是电脑)如何知道USB设备支持全速模式?只要在USB设备的D+数据线上接一个1.5K的上拉电阻即可。而我这里这个上拉电阻的电源端是接到了STM32的PA15上面。如图:

所以,如果你的板子上,上拉电阻默认接到VCC,这一步就不用管了。没有的话,自己想办法~~~

第五,Connectivity选项里,选择USB,然后右侧Device(FS)前面打勾,下面不用管。

第六,中间件(Middleware)这里,选择USB。右侧上面选择Human Interface Device Class,也就是俗称的HID。

下面要注意几个地方!

VID和PID分别代表厂商(Vender)编号和产品(PID)编号,VID不能随便用,要花钱向USB协会申请,所以这里仅供学习使用。PID还好,由厂商自己定义。

manufacturer_string是厂商字符串,product_string是产品字符串,configuration_string是配置字符串,interface_string是接口字符串,这四个是可以手动修改的。放心改,不要钱。我随便改了两个。

还有一个LANGID_STRING,它表示USB设备支持什么语言。我这里没有动,默认选择英语。

7、修改时钟。USB那里需要48M的时钟,别的无所谓。照着改吧!

8、生成工程。工程名称和路径,不用说了,那个是基本的。主要是框住的这两个位置,根据你的代码习惯和编译器(KEIL还是IAR)来进行选择。

9、修改代码。打开工程,找到main.c,添加一些代码。

/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */

#include "usbd_hid.h"

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/

/* USER CODE BEGIN PTD */

uint8_t MouseData01[4] = {0,0,0,0};

extern USBD_HandleTypeDef hUsbDeviceFS;

/* USER CODE END PTD */

主函数里:

while (1)

{

/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

MouseData01[0] = 0x01;

USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&MouseData01,sizeof(MouseData01));

HAL_Delay(1000);

MouseData01[0] = 0x00;

USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&MouseData01,sizeof(MouseData01));

HAL_Delay(1000);

}

好了,保存、编译、下载、上电。你会发现,板子上电的时候电脑右下角弹出一个“发现新设备”的提示框。

然后你的屏幕上的光标位置,每隔1秒,自动点一下鼠标左键。

很多人到这里,其实是蒙的!!!

为什么?

自始至终,STM32CubeMX里,和主函数里没出现鼠标相关的函数(除了我们自定义的一个带鼠标字符的数组),怎么就出来一个鼠标?

为什么不是键盘?

为什么不是优盘? 这个我可以回答,因为你选的是HID,而不是存储类设备。

为什么不是游戏手柄?

其实,你可以理解为,这是官方提供给我们的一个鼠标例程。这里简单说下USB设备上电的过程:

1、设备插入后,USB主机自动对设备进行复位,使设备地址为零。

2、USB主机对地址为零的设备提问:你是个什么东西?

3、USB设备说:我的PID是XX,VID是XX,USB协议是2.0等等。

4、USB主机再次对设备进行复位,然后给复位后的设备分配一个地址。

5、USB主机向新地址提问:你是个什么东西? USB设备回答:…

6、两次回答一样,说明USB设备的地址分配成功。USB主机继续提问,获取其它描述符。

7、USB设备,在向主机回复配置集合的时候,表明自己的身份:你好,我是个鼠标!

也就是说,在配置集合中,有信息说明这个设备是鼠标,我们看下。在usb_hid.c文件中,有一个数组:USBD_HID_CfgFSDesc,其中一行:

单是这个还不够,还要结合报告描述符。也在这个文件内,名字是HID_MOUSE_ReportDesc。内容如下:

__ALIGN_BEGINstaticuint8_tHID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE]__ALIGN_END=


{


0x05,0x01,


0x09,0x02,


0xA1,0x01,


0x09,0x01,


0xA1,0x00,


0x05,0x09,


0x19,0x01,


0x29,0x03,


0x15,0x00,


0x25,0x01,


0x95,0x03,


0x75,0x01,


0x81,0x02,


0x95,0x01,


0x75,0x05,


0x81,0x01,


0x05,0x01,


0x09,0x30,


0x09,0x31,


0x09,0x38,


0x15,0x81,


0x25,0x7F,


0x75,0x08,


0x95,0x03,


0x81,0x06,


0xC0,0x09,


0x3c,0x05,


0xff,0x09,


0x01,0x15,


0x00,0x25,


0x01,0x75,


0x01,0x95,


0x02,0xb1,


0x22,0x75,


0x06,0x95,


0x01,0xb1,


0x01,0xc0


};

是不是很懵逼?这都是啥?怎么没有注释?


别问我,我也不知道。可能是研发人员懒,也可能是他们忘了。


无论是配置集合,还是报告描述符,这里都不做解释,因为一两篇文章根本说不完。这里只说一点,由于报告描述符的规定,鼠标设备向电脑发送数据的时候,一般是发送4个字节的数据。


字节1:无符号字符型,低三位分别表示鼠标的左、右、中键是否被按下,1按下,0抬起。


字节2:有符号字符型,表示鼠标在x方向的移动。


字节3:有符号字符型,表示鼠标在y方向的移动。


字节4:有符号字符型,表示鼠标滚轮的移动。


所以,我在上面的代码中循环将第一个字节的值设为0和1,就能看到屏幕上的光标每隔一秒,触发一下鼠标左键。


好了,不知不觉说的有点多。还好大部分都是图片,看起来不难理解。总结起来,就是个发送数据的过程。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    液晶显示模块在开发过程中,需要通过USB连接,将工程下载到智能液晶显示模块中进行调试,而多次插拔USB线后有可能会造成其无法识别和连接的情况,从而导致下载失败。以下下提供几种解决USB无法识别......
    框出现添加成功然后退出就可以了。 破解好了以后进入Keil5双击即可(不需要以管理员的身份进入) STC-ISP下载就可以使用 无需安装。 除此之外我们还需要安装一个开发板的驱动程序,否正我们的电脑无法识别开发板。 首先我们通过USB......
    面对指纹磨损、老人指纹退化等问题往往无法识别。 麟盾Touch1智能锁不仅采用活体指纹识别技术,且采用远超同行的192*192超大指纹识别传感器,配合AI自学习算法,可有效防止假指纹,解决各类指纹难题,安全识别......
    即使内核支持了这么多摄像头,普通的USB 摄像头应用程序也无法识别到它们。下面是在内核中配置USB 摄像头的步骤:在Device Drivers 菜单里面,选择 Multimedia devices,回车......
    即使内核支持了这么多摄像头,普通的USB 摄像头应用程序也无法识别到它们。下面是在内核中配置USB 摄像头的步骤:在Device Drivers 菜单里面,选择 Multimedia devices,回车......
    怎么实现语音识别_手机语音识别怎么设置;  怎么实现语音识别   很多时候我们都需要将一些语音文件转换为文字的形式进行使用,那么这时我们就需要对语音文件进行识别了。那么我们应该怎样在线实现语音识别......
    stm32f103 usb驱动电脑无法识别的解决办法;  STM32F系列属于中低端的32位ARM微控制器,该系列芯片是意法半导体(ST)公司出品,其内核是Cortex-M3。该系......
    在获取到设备描述符和配置描述符后直接将设备挂起了。很明显,WIN10系统的USB主机驱动实现对设备描述符或者配置描述符的内容并不认可,才会导致无法识别HID+CDC复合设备。 我们不妨检查下客户代码中的设备描述符: Figure 3 获取......
    盘则需要传输大量的数据。如果按鼠标的时候U盘正在传输数据怎么办呢? 为了解决上述问题,USB首先规定了四种传输类型: 控制传输(Control Transfers): 主要......
    . make uImage 并使用新的内核启动 3. insmod usbmouse_as_key.ko 4. 在开发板上接入、拔出USB鼠标 具体参考代码如下:该函数主要实现了识别USB设备......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>