• STM32F103 CubeMX 使用USB生成鼠标设备


    1 配置cubeMX

    1.1配置外部晶振,配置debug口

    在这里插入图片描述

    1.2 配置USB

    在这里插入图片描述
    在这里插入图片描述

    1.3 配置芯片的时钟

    需要注意,在使用USB设备的时候,一定要使用外部的高速时钟,

    在这里插入图片描述

    1.4 生成工程

    在这里插入图片描述

    2. 编写代码

    2.1 添加申明

    添加两个申明,这样可以将代码中使用到的函数,引入到main这个文件中来,

    /* USER CODE BEGIN Includes */
    # include "usbd_hid.h"
    
    extern USBD_HandleTypeDef hUsbDeviceFS;
    
    /* USER CODE END Includes */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.2 main函数代码

    添加了完整的main函数的代码,

    申明的函数 HID_Buffer 这是来表示鼠标发送的数据。
    这里需要说明一下,鼠标发的数据是4个 8位的数据

    第一个字节表示按键,bit0对应左键、bit1对应右键、bit3对应中键;0表示未按,1表示按下;
    第二个字节表示x轴(即鼠标左右移动,0表示不动,正值表示往右移,负值表示往左移,范围-127~127,绝对值对应了移动量大小);
    第三个字节表示y轴(即鼠标上下移动,0表示不动,正值表示往下移,负值表示往上移,范围-127~127,绝对值对应了移动量大小);
    第四个字节表示鼠标滚轮(正值为往上滚动,负值为往下滚动,-127~127,绝对值对应了移动量大小)。

    代码中的:HID_Buffer 也就对应了4个字节。

    下面的计算公式就是对应的鼠标的移动,如果你需要调整移动的方向,则将 ( (ADC0_Value - 2048)) 这个调换位置就可以了,256的参数就是一个经验值,这个值越大,鼠标移动速度越快。反之亦然。

      HID_Buffer[1] = (ADC0_Value - 2048)/256;
      HID_Buffer[2] = (2048 - ADC1_Value)/256;;
    
    • 1
    • 2
    /**
      * @brief  The application entry point.
      * @retval int
      */
    int main(void)
    {
      /* USER CODE BEGIN 1 */
      /* USER CODE END 1 */
      /* MCU Configuration--------------------------------------------------------*/
      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      HAL_Init();
      /* USER CODE BEGIN Init */
      /* USER CODE END Init */
      /* Configure the system clock */
      SystemClock_Config();
      /* USER CODE BEGIN SysInit */
      /* USER CODE END SysInit */
      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_ADC1_Init();
      MX_ADC2_Init();
      MX_USB_DEVICE_Init();
      /* USER CODE BEGIN 2 */
      
    	uint8_t HID_Buffer[4] = {0};
    	uint16_t ADC0_Value = 0;
    	uint16_t ADC1_Value = 0;
      /* USER CODE END 2 */
    
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
    	  HAL_ADC_Start(&hadc1);
    	  HAL_ADC_PollForConversion(&hadc1,HAL_MAX_DELAY);
    	  ADC0_Value = (uint16_t)HAL_ADC_GetValue(&hadc1);
    	  
    	  HAL_ADC_Start(&hadc2);
    	  HAL_ADC_PollForConversion(&hadc2,HAL_MAX_DELAY);
    	  ADC1_Value = (uint16_t)HAL_ADC_GetValue(&hadc2);
    	  
    	  HAL_Delay(50);
    	  HID_Buffer[1] = (ADC0_Value - 2048)/256;
    	  HID_Buffer[2] = (2048 - ADC1_Value)/256;;
    	  
    	  USBD_HID_SendReport(&hUsbDeviceFS,HID_Buffer,4);
        /* USER CODE END WHILE */
        /* USER CODE BEGIN 3 */
      }
      /* USER CODE END 3 */
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    这个鼠标是默认生成就是鼠标的设备,调试起来还是比较方便。

  • 相关阅读:
    领英精灵和领英助理哪个好,看这一篇就够了
    【无标题】
    docker compose 修改masterLab上传限制问题
    “健康中国”战略下如何推进公共卫生建设,海尔生物医疗给出“智慧答案”
    马克 · 扎克伯格期望的元宇宙到底会是什么样子?
    串口调试助手和网络调试助手使用总结
    python基础之函数模块的导入
    抓包工具mitmprox
    B站数据实时监控,快速掌握up主视频热度走向!
    骨传导蓝牙耳机排行榜,精选五款骨传导耳机推荐!
  • 原文地址:https://blog.csdn.net/chen1658137632/article/details/136737714