0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于STM32CubeMX的USB鼠标例程

单片机爱好者 来源:MCU起航 作者:单片机爱好者 2020-05-06 14:21 次阅读

大家好,我是MCU起航。

最近在玩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
    usb
    +关注

    关注

    60

    文章

    7862

    浏览量

    263535
  • STM32
    +关注

    关注

    2264

    文章

    10852

    浏览量

    354098
收藏 人收藏

    评论

    相关推荐

    STM32CUBEMX界面重影严重的原因?怎么解决?

    STM32CUBEMX 界面重影严重,有相同问题的吗
    发表于 06-03 07:46

    STm32cubeMX生成STM32F412RGT6-USB_CDC工程初始化失败的原因?

    请教用STm32cubeMX生成STM32F412RGT6-USB_CDC工程初始化失败
    发表于 04-28 06:56

    STM32CubeMX怎么设置stm32F103 usb -> vcp?

    STM32CubeMX 怎么设置 stm32F103 usb -> vcp ?最好有实例,谢
    发表于 04-25 06:57

    STM32cubemx的库和KEIL的库有什么不同?

    STM32cubemx软件有对应各个系列芯片的库. 使用cubemx,生成代码框架,比如生成MDK的代码框架。但MDK也有自己的PACK。那么MDK的PACK和CUBEMX的库有什么区别,两者时什么关系呢?
    发表于 04-11 06:02

    STM32CubeMX生成代码软件卡死的原因?怎么解决?

    STM32CubeMX 生成代码 软件卡死!在生成代吗时,一直卡死在如图所示的状态,进度条一直就不走了。试过多次,一直如此。请问如何解决该问题,原因可能是什么?STM32CubeMX版本5.1.0
    发表于 04-10 06:03

    STM32CubeMX STM32WL不能配置LoRaWAN的原因?

    STM32CubeMX 中使用STM32WL配置LoRaWAN时不能配置,请问为什么?
    发表于 04-02 07:47

    stm32cubemx customHID编译了,用usb连电脑但是Demonstrator刷不到这个驱动是为什么?

    stm32cubemx的pack包里的 官方源代码customHID编译了,用usb连电脑,但是Demonstrator刷不到这个驱动
    发表于 04-02 07:43

    STM32cubeMX设置USB编译出现Undefined symbol错误的原因?

    STM32cubeMX 设置USB 编译出现Undefined symbol 错误。 勾选STM32CUBEMX中的USB_device 设置FS IP的VPC,默认配置,用keil软
    发表于 04-01 07:44

    关于stm32cubemx usb读卡和fatfs兼容问题求解

    芯片使用STM32F411,使能SDIO,四线接SD卡 使用stm32cubemx直接生成USB device,大容量储存设备,可以在电脑上看到U盘,使用stm32cubemx直接生成
    发表于 04-01 06:09

    使用STM32F103RCT6开发USB设备,STM32CubeMx生成代码遇到的问题求解

    大家好,最近在使用STM32F103RCT6开发USB设备,使用的是STM32CubeMx生成的代码,但查看代码发现一个问题,HAL_PCD_MspInit函数中开启了USB外设时钟,
    发表于 03-21 08:30

    STM32CUBEMX界面重影严重怎么解决?

    STM32CUBEMX 界面重影严重,有相同问题的吗
    发表于 03-14 07:13

    STM32Cubemx配置USB虚拟串口,电脑无法识别怎么解决?

    STM32Cubemx配置USB虚拟串口,电脑无法识别问题?(上拉和驱动都配置好了)
    发表于 03-08 07:00

    STM32CubeMX的H5的ThreadX例程在哪里找?

    STM32CubeMX的Software Packs Component Selector中没有找到H5的ThreadX例程,哪位小伙伴知道在哪里可以下载到H5上移植ThreadX的相关例程
    发表于 03-08 06:31

    基于STM32CUBEMX驱动低压步进器电机驱动器STSPIN220(2)----驱动STSPIN220

    本文档的目标是提供关于使用STM32CubeMX驱动低压步进电机驱动器STSPIN220的详尽信息和操作指南。通过本文档,将深入了解如何利用STM32CubeMX来配置电机驱动器,以及如何实现对步进电机的精确控制和运动。
    的头像 发表于 12-01 15:25 880次阅读
    基于<b class='flag-5'>STM32CUBEMX</b>驱动低压步进器电机驱动器STSPIN220(2)----驱动STSPIN220

    stm32cube怎么安装 STM32CubeMX安装步骤教程

    STM32CubeMXSTM32芯片图形化配置工具,通过简单的操作便能实现相关配置,省去了我们配置各种外设的时间,支持MDK、IAR For ARM、TrueStudio等多种工具。
    发表于 11-14 12:37 1554次阅读
    <b class='flag-5'>stm32</b>cube怎么安装 <b class='flag-5'>STM32CubeMX</b>安装步骤教程