STM32 USB模拟键盘鼠标功能

1 参考文献 

USB键盘鼠标描述符及数据格式分析_鼠标hid报告结构-CSDN博客

STM32CubeMX学习笔记(44)——USB接口使用(HID按键)_stm32自带的usb有什么用-CSDN博客

可以参考上面博客了解报文和报告解释符的概念

2 报告解释符生成软件下载地址

HID Descriptor Tool | USB-IF

点击open,找到软件包下载路径,打开对应文件即可,比如我要打开键盘的报告解释符文件

打开之后,save as另存为.h文件,打开之后复制函数里面内容,复制到工程中的usbd_hid.c文件中

3 参考例程

/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usb_device.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "usbd_hid.h"
/* 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);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
extern USBD_HandleTypeDef  hUsbDeviceFS;
/* USER CODE END 0 */

/**
  * @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_USB_DEVICE_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */
uint8_t Data_Buffer[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
	  
	  if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_SET)	//K1按下,Ctrl+C赋复制
	  {
		HAL_Delay(15);	//延时15ms
		while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_SET);
		Data_Buffer[0] = 0x01;	//Ctrl
		Data_Buffer[2] = 0x06;	//c
		USBD_HID_SendReport(&hUsbDeviceFS, Data_Buffer, 8); //send
			
		HAL_Delay(15);
		Data_Buffer[0] = 0x00;	//Ctrl
		Data_Buffer[2] = 0x00;	//c
		USBD_HID_SendReport(&hUsbDeviceFS, Data_Buffer, 8); //send
		HAL_Delay(15);	//延时15ms
			
	  }
	  
	  if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13) == GPIO_PIN_SET)	//K2按下,Ctrl+V粘贴
	  {
		HAL_Delay(15);	//延时15ms
		while(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13) == GPIO_PIN_SET);
		Data_Buffer[0] = 0x01;	//Ctrl
		Data_Buffer[2] = 0x19;	//v
		USBD_HID_SendReport(&hUsbDeviceFS, Data_Buffer, 8); //send
		  
		HAL_Delay(15);
		Data_Buffer[0] = 0x00;	//Ctrl
		Data_Buffer[2] = 0x00;	//c
		USBD_HID_SendReport(&hUsbDeviceFS, Data_Buffer, 8); //send
		HAL_Delay(15);	//延时15ms
	  }

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

使用的开发板是野火的STM32F103RCT6,按键K1是复制功能,按键K2是粘贴功能 

作者:ripper_jack1

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 USB模拟键盘鼠标功能

发表回复