stm32 USB复合设备 cubeMX库一键生成 多路CDC串口 HID鼠标键盘 Composite Device

最近有个需求,需要同时用usb键盘鼠标和虚拟串口等,因为平时没怎么研究过usb协议,所以自己写复合设备一直没有成功,然后正巧在github上看到了一个stm32的一个usb复合设备库,可以快速配置usb组合设备,并且支持超级多路串口

Gihub地址https://github.com/alambe94/I-CUBE-USBD-Composite

安装

  1. 在githubr release页面下载.pack文件,要是github打不开这里有分享链接库文件
  2. CubeMX中选择管理软件包stm32 USB复合设备 cubeMX库一键生成 多路CDC串口 HID鼠标键盘 Composite Device_第1张图片
  3. 导入刚才下好的.pack文件stm32 USB复合设备 cubeMX库一键生成 多路CDC串口 HID鼠标键盘 Composite Device_第2张图片

 启用

选择组件

stm32 USB复合设备 cubeMX库一键生成 多路CDC串口 HID鼠标键盘 Composite Device_第3张图片

选择你需要的

Core是必须的,然后你需要哪些功能就需要启用,多设备一定要启用COMPISITE

我这里选择了键鼠和CDC虚拟串口,同时还得打开Core和COMPOSITE

 stm32 USB复合设备 cubeMX库一键生成 多路CDC串口 HID鼠标键盘 Composite Device_第4张图片

 在这里也需要选择你需要的

stm32 USB复合设备 cubeMX库一键生成 多路CDC串口 HID鼠标键盘 Composite Device_第5张图片

 配置其他,晶振时钟调试等等

stm32 USB复合设备 cubeMX库一键生成 多路CDC串口 HID鼠标键盘 Composite Device_第6张图片

 stm32 USB复合设备 cubeMX库一键生成 多路CDC串口 HID鼠标键盘 Composite Device_第7张图片

单独生成外设文件

stm32 USB复合设备 cubeMX库一键生成 多路CDC串口 HID鼠标键盘 Composite Device_第8张图片

可以生成工程了 

注意

MX_USB_DEVICE_Init(); 
需要手动调用这个函数对USB进行初始化

我试过默认的键盘鼠标的配置描述符好像不能适配我们的默认的习惯,键盘8个字节,鼠标4个字节的,需要改变一下,我这里贴出我的

键盘 usbd_keyboard_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};

 记得改数组长度为 63U

[特殊按键][ ][按键1][按键2][按键3][按键4][按键5][按键6]

鼠标 usbd_mouse_hid.c

__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END =
    {
         //-----------------------鼠标部分报告描述符----------------------------  
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)  
    0x09, 0x02,                    // USAGE (Mouse)  
    0xa1, 0x01,                    // COLLECTION (Application)  
    0x09, 0x01,                    //   USAGE (Pointer)  
    0x05, 0x09,                    //     USAGE_PAGE (Button)  
    0x19, 0x01,                    //     USAGE_MINIMUM (Button 1)  
    0x29, 0x03,                    //     USAGE_MAXIMUM (Button 3)  
    0x15, 0x00,                    //     LOGICAL_MINIMUM (0)  
    0x25, 0x01,                    //     LOGICAL_MAXIMUM (1)  
    0x95, 0x03,                    //     REPORT_COUNT (3)  
    0x75, 0x01,                    //     REPORT_SIZE (1)  
    0x81, 0x02,                    //     INPUT (Data,Var,Abs)  
    0x95, 0x01,                    //     REPORT_COUNT (1)  
    0x75, 0x05,                    //     REPORT_SIZE (5)  
    0x81, 0x03,                    //     INPUT (Cnst,Var,Abs)  
    0x05, 0x01,                    //     USAGE_PAGE (Generic Desktop)  
    0x09, 0x30,                    //     USAGE (X)  
    0x09, 0x31,                    //     USAGE (Y)  
    0x09, 0x38,                    //     USAGE (Wheel)  
    0x15, 0x81,                    //     LOGICAL_MINIMUM (-127)  
    0x25, 0x7f,                    //     LOGICAL_MAXIMUM (127)  
    0x75, 0x08,                    //     REPORT_SIZE (8)  
    0x95, 0x03,                    //     REPORT_COUNT (3)  
    0x81, 0x06,                    //     INPUT (Data,Var,Rel)  
    0xc0                          //   END_COLLECTION  
    };

长度49U

[按键][X][Y][滚轮]

 

你可能感兴趣的:(stm32,单片机,arm)