第四章:STM32MxCube生成USB程序---模拟键盘(从机)

 要把鼠标从机改成键盘从机,只需要在鼠标从机源码的基础上进行更改即可。这里以stm32f103c8t6为例讲解。

更改如下:

方法一:

1、打开原来的工程(鼠标工程)由STM32Cube生成。

第四章:STM32MxCube生成USB程序---模拟键盘(从机)_第1张图片

第四章:STM32MxCube生成USB程序---模拟键盘(从机)_第2张图片

1、在main.c函数中,添加键盘键值代码, 这里模拟空格键

空格键:

        uint8_t txbuffer[8]= {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

uint8_t sendbuffer[8]={0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00};

某按键:

if(GPIO_PIN_RESET==HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1))//PTT按下,按下为低
{
    USBD_HID_SendReport(&hUsbDeviceFS,sendbuffer,8);//发送报文
}
else if(GPIO_PIN_SET==HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1))
{
    USBD_HID_SendReport(&hUsbDeviceFS,txbuffer,8);//发送报文
}

第四章:STM32MxCube生成USB程序---模拟键盘(从机)_第3张图片

第四章:STM32MxCube生成USB程序---模拟键盘(从机)_第4张图片

3,在usb_hid.c中,改核心实现代码(将核心从鼠标换成键盘),即修改usb配置数组或修改USB HID设备配置描述符。

第四章:STM32MxCube生成USB程序---模拟键盘(从机)_第5张图片

4,修改USB HID设备描述符(在usb_hid.c中)

第四章:STM32MxCube生成USB程序---模拟键盘(从机)_第6张图片

5,定义键盘描述符(在usb_hid.c中)

__ALIGN_BEGIN static uint8_t HID_KEYBOARD_ReportDesc[HID_KEYBOARD_REPORT_DESC_SIZE]  __ALIGN_END =
{
0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x09, 0x06,                    // USAGE (Keyboard)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x05, 0x07,                    //   USAGE_PAGE (Keyboard)
    0x19, 0xe0,                    //   USAGE_MINIMUM (Keyboard LeftControl)
    0x29, 0xe7,                    //   USAGE_MAXIMUM (Keyboard Right GUI)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
    0x75, 0x01,                    //   REPORT_SIZE (1)
    0x95, 0x08,                    //   REPORT_COUNT (8)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0x95, 0x01,                    //   REPORT_COUNT (1)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x81, 0x03,                    //   INPUT (Cnst,Var,Abs)
    0x95, 0x05,                    //   REPORT_COUNT (5)
    0x75, 0x01,                    //   REPORT_SIZE (1)
    0x05, 0x08,                    //   USAGE_PAGE (LEDs)
    0x19, 0x01,                    //   USAGE_MINIMUM (Num Lock)
    0x29, 0x05,                    //   USAGE_MAXIMUM (Kana)
    0x91, 0x02,                    //   OUTPUT (Data,Var,Abs)
    0x95, 0x01,                    //   REPORT_COUNT (1)
    0x75, 0x03,                    //   REPORT_SIZE (3)
    0x91, 0x03,                    //   OUTPUT (Cnst,Var,Abs)
    0x95, 0x06,                    //   REPORT_COUNT (6)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0xFF,                    //   LOGICAL_MAXIMUM (255)
    0x05, 0x07,                    //   USAGE_PAGE (Keyboard)
    0x19, 0x00,                    //   USAGE_MINIMUM (Reserved (no event indicated))
    0x29, 0x65,                    //   USAGE_MAXIMUM (Keyboard Application)
    0x81, 0x00,                    //   INPUT (Data,Ary,Abs)
    0xc0  };

第四章:STM32MxCube生成USB程序---模拟键盘(从机)_第7张图片

6,定义键盘描述符大小(在usb_hid.h中)

选择之前鼠标描述符大小,跟踪到鼠标描述符大小的宏定义处(usb_hid.h)。进行添加宏定义,定义键盘描述符大小

#define HID_MOUSE_REPORT_DESC_SIZE    74
#define  HID_KEYBOARD_REPORT_DESC_SIZE   63

第四章:STM32MxCube生成USB程序---模拟键盘(从机)_第8张图片

第四章:STM32MxCube生成USB程序---模拟键盘(从机)_第9张图片

7,修改usb安装实现代码(在usb_hid.c中) 

将 USBD_HID_Setup函数中的  case USB_REQ_GET_DESCRIPTOR: 分支中的:

  len = MIN(HID_MOUSE_REPORT_DESC_SIZE , req->wLength);

 pbuf = HID_MOUSE_ReportDesc;

替换成:

 len = MIN(HID_KEYBOARD_REPORT_DESC_SIZE , req->wLength);
pbuf = HID_KEYBOARD_ReportDesc;

第四章:STM32MxCube生成USB程序---模拟键盘(从机)_第10张图片

第四章:STM32MxCube生成USB程序---模拟键盘(从机)_第11张图片

8,修改PID/VID   (在usb_desc.c中) (此步我捉摸了3天,才找到问题,否则电脑不能识别设备)

#define USBD_VID      1111

#define USBD_PID_FS      22111

每改一次设备,必须改变PID/VID,只要和上次不同就行。因为同一台电脑会默认识别出该PID/VID,如果不改,则识别为上次的设备(鼠标),因为你的代码已经改了(键盘),所以电脑的设备管理器是叹号。就是不能识别。

第四章:STM32MxCube生成USB程序---模拟键盘(从机)_第12张图片

9,编译、下载,成功后,插入电脑,设备管理器可以识别出是一个HID或键盘设备。

第四章:STM32MxCube生成USB程序---模拟键盘(从机)_第13张图片    第四章:STM32MxCube生成USB程序---模拟键盘(从机)_第14张图片



方法二:不用像上面那样,分别添加代码,

这里只需把之前鼠标描述符修改即可。因为用STM32Cube生成的默认都是鼠标代码,不能实现生成键盘的代码,所以这里就把鼠标的代码替换成键盘的代码。

1,改配置描述符

第四章:STM32MxCube生成USB程序---模拟键盘(从机)_第15张图片


2,把鼠标描述符替换成键盘描述符。

键盘描述符:

{

    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x09, 0x06,                    // USAGE (Keyboard)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x05, 0x07,                    //   USAGE_PAGE (Keyboard)
    0x19, 0xe0,                    //   USAGE_MINIMUM (Keyboard LeftControl)
    0x29, 0xe7,                    //   USAGE_MAXIMUM (Keyboard Right GUI)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
    0x75, 0x01,                    //   REPORT_SIZE (1)
    0x95, 0x08,                    //   REPORT_COUNT (8)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0x95, 0x01,                    //   REPORT_COUNT (1)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x81, 0x03,                    //   INPUT (Cnst,Var,Abs)
    0x95, 0x05,                    //   REPORT_COUNT (5)
    0x75, 0x01,                    //   REPORT_SIZE (1)
    0x05, 0x08,                    //   USAGE_PAGE (LEDs)
    0x19, 0x01,                    //   USAGE_MINIMUM (Num Lock)
    0x29, 0x05,                    //   USAGE_MAXIMUM (Kana)
    0x91, 0x02,                    //   OUTPUT (Data,Var,Abs)
    0x95, 0x01,                    //   REPORT_COUNT (1)
    0x75, 0x03,                    //   REPORT_SIZE (3)
    0x91, 0x03,                    //   OUTPUT (Cnst,Var,Abs)
    0x95, 0x06,                    //   REPORT_COUNT (6)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0xFF,                    //   LOGICAL_MAXIMUM (255)
    0x05, 0x07,                    //   USAGE_PAGE (Keyboard)
    0x19, 0x00,                    //   USAGE_MINIMUM (Reserved (no event indicated))
    0x29, 0x65,                    //   USAGE_MAXIMUM (Keyboard Application)
    0x81, 0x00,                    //   INPUT (Data,Ary,Abs)
    0xc0  };

第四章:STM32MxCube生成USB程序---模拟键盘(从机)_第16张图片

把红线框中的代码,替换成键盘描述符。

3,修改鼠标的宏定义。由74,改为63

#define HID_MOUSE_REPORT_DESC_SIZE    63            //74

第四章:STM32MxCube生成USB程序---模拟键盘(从机)_第17张图片

第四章:STM32MxCube生成USB程序---模拟键盘(从机)_第18张图片

4,修改PID/VID   (在usb_desc.c中) (此步我捉摸了3天,才找到问题,否则电脑不能识别设备)

#define USBD_VID      1111

#define USBD_PID_FS      22111

每改一次设备,必须改变PID/VID,只要和上次不同就行。因为同一台电脑会默认识别出该PID/VID,如果不改,则识别为上次的设备(鼠标),因为你的代码已经改了(键盘),所以电脑的设备管理器是叹号。就是不能识别。

第四章:STM32MxCube生成USB程序---模拟键盘(从机)_第19张图片


5,在main.c中添加相应的功能函数。

空格键:

        uint8_t txbuffer[8]= {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//无

uint8_t sendbuffer[8]={0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00};//空格

某按键:

if(GPIO_PIN_RESET==HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1))//PTT按下,按下为低
{
    USBD_HID_SendReport(&hUsbDeviceFS,sendbuffer,8);//发送报文
}
else if(GPIO_PIN_SET==HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1))
{
    USBD_HID_SendReport(&hUsbDeviceFS,txbuffer,8);//发送报文
}

第四章:STM32MxCube生成USB程序---模拟键盘(从机)_第20张图片

第四章:STM32MxCube生成USB程序---模拟键盘(从机)_第21张图片

这里关于按键的初始化,不在描述。
6,编译、下载,成功后,插入电脑,设备管理器可以识别出是一个HID或键盘设备。

第四章:STM32MxCube生成USB程序---模拟键盘(从机)_第22张图片    第四章:STM32MxCube生成USB程序---模拟键盘(从机)_第23张图片

当程序下载到开发板,电脑识别成功后,按下按键不放,记事本文档中不断输出空格,放开,空格不输出。


你可能感兴趣的:(控制器研发技术分享)