草庐IT

教你STM32做USB鼠标、键盘

small_planet 2024-07-08 原文

使用CubeMX软件傻瓜式的配置,一键生成USB的HID驱动。

一、USB鼠标

1、CubeMX配置

①、选择相对应的芯片

 ②、配置时钟和Debug和debug

 

 

 ③、配置USB

 

 ④、生成代码

         最好把这个也勾上,勾上以后每个外设配置不再都给你塞到main.c里,而是建一个.c.h,这样感觉舒服多了

2、编写应用层代码

        USB协议还是挺复杂的,原理和底层我也搞不清楚,这东西也不是看几篇文章学个一两天就能搞明白的,我写这个也主要是为了好玩,没有深层去理解。

我们用的鼠标主要就四个属性:键位(左键、右键、中键),左右移动、上下移动、滑轮

这四个属性用一个长度为4的数组一并包含进来:

  /*
    *MouseData[0]:低0位:左键 低1位:右键 低2位:中键
    *MouseData[1]:1~127:右  --127~-1:左
    *MouseData[2]:1~127:下  --127~-1:上
    *MouseData[3]:1~127:上  --127~-1:下  (滑轮)
  */
  char MouseData[4] = {0, 0, 0, 0};

发送这些信息用这个函数:

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

主要代码:

    memcpy(MouseDataT, MouseData, sizeof(MouseData));
    key = KEY_Scan(1);   //支持连续按下
    switch(key)
    {
      case KEY0_PRES:
        MouseData[0] |= 0x01;
        break;
      case KEY1_PRES:
        MouseData[1] = 21;
        break;
      case WKUP_PRES:
        MouseData[3] = -12;
        break;
      default:
        MouseData[0] = 0;
        MouseData[1] = 0;
        MouseData[2] = 0;
        MouseData[3] = 0;
    }
    //如果有变化,发送
if(MouseData[0]!=MouseDataT[0]||MouseData[1]!=MouseDataT[1]||MouseData[2]!=MouseDataT[2]||MouseData[3]!=MouseDataT[3])
    {
      USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&MouseData,sizeof(MouseData));
    }

二、USB键盘

1、CubeMX配置同鼠标,这里不啰嗦了

2、在mouse的基础上修改为keyboard的

参考:基于STM32CUBE的USB键盘例程 | MCU起航 (mcublog.cn)

主要就是以下几点:

①、鼠标描述符换成键盘描述符,描述符大小也要改变

②、接口协议

③、端点发送的数据包长度

④、增加一个输出端点描述符 (按我的理解是,可以返回键盘指示灯的状态的,尝试了很久,还是不知道怎么返回,

3、应用程序

/*
    *keyBoardData[0]:特殊键
    *keyBoardData[1]:预留
    普通按键可以一起按下  4:a
    *keyBoardData[2]:
    *keyBoardData[3]:
    *keyBoardData[4]:
    *keyBoardData[5]:
    *keyBoardData[6]:
    *keyBoardData[7]:
  */
u8 keyBoardData[8] = {0,0,0,0,0,0,0,0};
extern USBD_HandleTypeDef hUsbDeviceFS;
static void keyboard_key_test()
{
    u8 keyBoardDataEmpty[8] = {0,0,0,0,0,0,0,0};
    u8 key = KEY_Scan(1);   //支持连续按下
    switch(key)
    {
      case KEY0_PRES:
        keyBoardData[2] = 4;
        
        break;
      case KEY1_PRES:
        keyBoardData[2] = 5;
        break;
      case WKUP_PRES:
        keyBoardData[2] = 6;
        break;
      default:
        keyBoardData[2] = 0;
    }
    USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&keyBoardData,sizeof(keyBoardData));
    HAL_Delay(15);
    USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&keyBoardDataEmpty,sizeof(keyBoardDataEmpty));
    HAL_Delay(15);
}

三、程序代码

代码我已上传

期待有伙伴能解决我的疑惑

mouse DEMO:(60条消息) stm32USB鼠标demo-单片机文档类资源-CSDN文库

keyboard DEMO:(60条消息) stm32USB键盘demo-嵌入式文档类资源-CSDN文库

有关教你STM32做USB鼠标、键盘的更多相关文章

  1. ruby - 在 Ruby 中用键盘诅咒数组浏览 - 2

    我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作

  2. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  3. STM32的HAL和LL库区别和性能对比 - 2

    LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L

  4. ruby - 在 ruby​​ Selenium 中移动鼠标(move_to) - 2

    我正在尝试使用Ruby中的SeleniumWebDriver2.4模拟鼠标移动如果我运行测试,是否应该看到鼠标在我的屏幕上移动?我很困惑。我试过很多不同的方法示例代码:require'selenium-webdriver'driver=Selenium::WebDriver.for:firefoxdriver.navigate.to'http://www.google.com'element=driver.find_element(:id,'gbqfba')那我试过了driver.action.move_to(element).performdriver.mouse.move_to(e

  5. ESP32学习入门:WiFi连接网络 - 2

    目录一、ESP32简单介绍二、ESP32Wi-Fi模块介绍三、ESP32Wi-Fi编程模型四、ESP32Wi-Fi事件处理流程 五、ESP32Wi-Fi开发环境六、ESP32Wi-Fi具体代码七、ESP32Wi-Fi代码解读6.1主程序app_main7.2自定义代码wifi_init_sta()八、ESP32Wi-Fi连接验证8.1测试方法8.2服务器模拟工具sscom58.3测试代码8.4测试结果前言为了开发一款亚马逊物联网产品,开始入手ESP32模块。为了能够记录自己的学习过程,特记录如下操作过程。一、ESP32简单介绍ESP32是一套Wi-Fi(2.4GHz)和蓝牙(4.2)双模解决方

  6. Spring Security 6.0系列【32】授权服务器篇之默认过滤器 - 2

    有道无术,术尚可求,有术无道,止于术。本系列SpringBoot版本3.0.4本系列SpringSecurity版本6.0.2本系列SpringAuthorizationServer版本1.0.2源码地址:https://gitee.com/pearl-organization/study-spring-security-demo文章目录前言1.OAuth2AuthorizationServerMetadataEndpointFilter2.OAuth2AuthorizationEndpointFilter3.OidcProviderConfigurationEndpointFilter4.N

  7. ruby - 摘要::CRC32 与 Zlib - 2

    在我的代码中,我需要使用各种算法(包括CRC32)对文件进行哈希处理。因为我还在Digest系列中使用其他加密哈希函数,所以我认为为它们维护一个一致的接口(interface)会很好。为了记录,我确实找到了digest-crc,一颗完全符合我要求的gem。问题是,Zlib是标准库的一部分,并且有一个我想重用的CRC32工作实现。此外,它是用C编写的,因此它应该提供与digest-crc相关的卓越性能,后者是纯ruby​​实现。实现Digest::CRC32一开始看起来非常简单:%w(digestzlib).each{|f|requiref}classDigest::CRC32一切正常:

  8. ruby - 安装gem : Couldn't reserve space for cygwin's heap, Win32错误487错误 - 2

    我正在尝试在我的机器上安装win32-apigem,但在构建native扩展时我遇到了一些问题:$geminstallwin32-api--no-ri--rdocTemporarilyenhancingPATHtoincludeDevKit...Buildingnativeextensions.Thiscouldtakeawhile...C:\Programs\dev_kit\bin\make.exe:***Couldn'treservespaceforcygwin'sheap,Win32error0ERROR:Errorinstallingwin32-api:ERROR:Failed

  9. ruby - 如何将鼠标悬停在(鼠标悬停)Selenium Ruby 中的元素上? - 2

    有人知道如何在SeleniumRubyWebdriver中将鼠标悬停在元素上吗?我的代码是这样的:el=driver.find_element(:css=>"#foo")driver.move_toel#HowdoItriggeramouseovereventonthiselement?我在Linux32位的Firefox中使用selenium-webdrivergem。 最佳答案 我使用了driver.action.move_to(el).perform,它与其他答案略有不同,所以我想为了完整起见我会把它包括在内。

  10. Ruby 1.9 - 没有这样的文件可以加载 'win32/open3' - 2

    我在Windows上运行ruby​​1.9.2并试图移植在Ruby1.8中工作的代码。该代码使用以前运行良好的Open4.popen4。对于1.9.2,我做了以下事情:通过geminstallPOpen4安装了POpen4需要POpen4通过require'popen4'尝试像这样使用POpen4:Open4.popen4("cmd"){|io_in,io_out,io_er|...}当我这样做时,我得到了错误:nosuchfiletoload--win32/open3如果我尝试安装win32-open3(geminstallwin32-open3),我会收到错误消息:win32-op

随机推荐