使用CubeMX软件傻瓜式的配置,一键生成USB的HID驱动。
一、USB鼠标
1、CubeMX配置
①、选择相对应的芯片

②、配置时钟和Debug和debug

 
 
③、配置USB

 
④、生成代码

最好把这个也勾上,勾上以后每个外设配置不再都给你塞到main.c里,而是建一个.c.h,这样感觉舒服多了

2、编写应用层代码
USB协议还是挺复杂的,原理和底层我也搞不清楚,这东西也不是看几篇文章学个一两天就能搞明白的,我写这个也主要是为了好玩,没有深层去理解。
我们用的鼠标主要就四个属性:键位(左键、右键、中键),左右移动、上下移动、滑轮
这四个属性用一个长度为4的数组一并包含进来:
  /*
    *MouseData[0]:低0位:左键 低1位:右键 低2位:中键
    *MouseData[1]:1~127:右  --127~-1:左
    *MouseData[2]:1~127:下  --127~-1:上
    *MouseData[3]:1~127:上  --127~-1:下  (滑轮)
  */
  char MouseData[4] = {0, 0, 0, 0};发送这些信息用这个函数:
USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&MouseData,sizeof(MouseData));主要代码:
    memcpy(MouseDataT, MouseData, sizeof(MouseData));
    key = KEY_Scan(1);   //支持连续按下
    switch(key)
    {
      case KEY0_PRES:
        MouseData[0] |= 0x01;
        break;
      case KEY1_PRES:
        MouseData[1] = 21;
        break;
      case WKUP_PRES:
        MouseData[3] = -12;
        break;
      default:
        MouseData[0] = 0;
        MouseData[1] = 0;
        MouseData[2] = 0;
        MouseData[3] = 0;
    }
    //如果有变化,发送
if(MouseData[0]!=MouseDataT[0]||MouseData[1]!=MouseDataT[1]||MouseData[2]!=MouseDataT[2]||MouseData[3]!=MouseDataT[3])
    {
      USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&MouseData,sizeof(MouseData));
    }二、USB键盘
1、CubeMX配置同鼠标,这里不啰嗦了
2、在mouse的基础上修改为keyboard的
参考:基于STM32CUBE的USB键盘例程 | MCU起航 (mcublog.cn)
主要就是以下几点:
①、鼠标描述符换成键盘描述符,描述符大小也要改变
②、接口协议
③、端点发送的数据包长度
④、增加一个输出端点描述符 (按我的理解是,可以返回键盘指示灯的状态的,尝试了很久,还是不知道怎么返回,)
3、应用程序
/*
    *keyBoardData[0]:特殊键
    *keyBoardData[1]:预留
    普通按键可以一起按下  4:a
    *keyBoardData[2]:
    *keyBoardData[3]:
    *keyBoardData[4]:
    *keyBoardData[5]:
    *keyBoardData[6]:
    *keyBoardData[7]:
  */u8 keyBoardData[8] = {0,0,0,0,0,0,0,0};
extern USBD_HandleTypeDef hUsbDeviceFS;
static void keyboard_key_test()
{
    u8 keyBoardDataEmpty[8] = {0,0,0,0,0,0,0,0};
    u8 key = KEY_Scan(1);   //支持连续按下
    switch(key)
    {
      case KEY0_PRES:
        keyBoardData[2] = 4;
        
        break;
      case KEY1_PRES:
        keyBoardData[2] = 5;
        break;
      case WKUP_PRES:
        keyBoardData[2] = 6;
        break;
      default:
        keyBoardData[2] = 0;
    }
    USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&keyBoardData,sizeof(keyBoardData));
    HAL_Delay(15);
    USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&keyBoardDataEmpty,sizeof(keyBoardDataEmpty));
    HAL_Delay(15);
}三、程序代码
代码我已上传
期待有伙伴能解决我的疑惑
mouse DEMO:
keyboard DEMO:








![[附源码]java毕业设计基于学生信息管理系统](https://img-blog.csdnimg.cn/35e84dc086914025a51641038857d45f.png)
及结构体长度及占用空间的一些特性说明和测试](https://img-blog.csdnimg.cn/c58c0b8685fc4747aab6b85993271712.png)









