【USB】STM32模拟USB鼠标 您所在的位置:网站首页 如何用手机模拟鼠标移动 【USB】STM32模拟USB鼠标

【USB】STM32模拟USB鼠标

2024-02-08 04:00| 来源: 网络整理| 查看: 265

目录

1、前言

2、工程搭建

3、代码修改

4、参考资料

1、前言

本实验使用STM32F103ZET6开发板为例,实现了模拟USB鼠标的功能,并且能够在电脑上控制鼠标完成鼠标具备的功能。

 

2、工程搭建

使用STM32CubeMX配置工程,非常方便高效,配置如下:

 使用外部高速晶振作为时钟源。

勾选使用USB外设,STM32F103ZET6只有USB Device功能,没有HOST功能,而且只有一个USB外设,使用PA11(USB_DM),PA12(USB_DP)管脚。

勾选USB DEVICE功能为HID设备。

时钟配置按默认的自动配置,USB时钟会自动配置到48MHz。

配置MDK工程输出目录,

勾选只输出必要的文件,工程更简洁。最后点击GENERATE CODE,输出工程完毕。

 

3、代码修改

原始生成的这个工程编译之后代码下载到开发板,将开发板USB口连线接上电脑后,查看设备管理器,可以看到多了一个HID mouse设备。

上面STM32CubeMX生成的原始工程只是纯粹能够在电脑上显示有个鼠标设备而已,没有给出上报鼠标事件完成鼠标移动或点击等功能的demo。我们可以通过USBD_HID_SendReport这个函数来上报鼠标事件,举个例子。

int main(void) { /* USER CODE BEGIN 1 */ unsigned char buff[4] = {0}; /* 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_USB_DEVICE_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { buff[0] = 0x01; //鼠标左键按下 USBD_HID_SendReport(&hUsbDeviceFS, buff, sizeof(buff)); HAL_Delay(100); buff[0] = 0x00; //鼠标左键松开 USBD_HID_SendReport(&hUsbDeviceFS, buff, sizeof(buff)); HAL_Delay(1000); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }

在main函数while循环中加入这段代码,可以看到鼠标每隔一秒进行一次左键单击事件。

下面搞复杂一点完善下鼠标的功能,我们加上鼠标事件上报的代码,完成鼠标的操作功能。我的开发板上有4个用户按键,分别编号key0到key3,原理图如下。

图中的KEY_UP为key0,定义4个按键完成的功能为:

key0单击:鼠标滚轮向上滑动。

key1单击:鼠标左键单击一次。

key2单击:鼠标滚轮向下滑动。

key3单击:鼠标右键单击一次。

key0长时间按下:鼠标向上移动。

key1长时间按下:鼠标向左移动。

key2长时间按下:鼠标向下移动。

key3长时间按下:鼠标向右移动。

最终的main.c代码如下:

/* Includes ------------------------------------------------------------------*/ #include "main.h" #include "usb_device.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ extern USBD_HandleTypeDef hUsbDeviceFS; extern uint8_t USBD_HID_SendReport (USBD_HandleTypeDef *pdev, uint8_t *report, uint16_t len); typedef struct { char mouse_abs_left : 1; //鼠标左键单击 char mouse_abs_right : 1; //鼠标右键单击 char mouse_abs_wheel : 1; //鼠标中键单击 char reserve : 5; //常量0 char mouse_rel_x; //鼠标X轴移动值 char mouse_rel_y; //鼠标Y轴移动值 char mouse_rel_wheel; //鼠标滚轮移动值 }tyMouse_buff; #define KEY0_Press (1


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有