2025年教你STM32做USB鼠标、键盘

教你STM32做USB鼠标、键盘使用 CubeMX 软件傻瓜式的配置 一键生成 USB 的 HID 驱动 一 USB 鼠标 1 CubeMX 配置 选择相对应的芯片 配置时钟和 Debug 和 debug 配置 USB 生成代码 最好把这个也勾上 勾上以后每个外设配置不再都给你塞到 main c 里 而是建一个 c

大家好,我是讯享网,很高兴认识大家。

使用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:(60条消息) stm32USB鼠标demo-单片机文档类资源-CSDN文库

keyboard DEMO:(60条消息) stm32USB键盘demo-嵌入式文档类资源-CSDN文库

小讯
上一篇 2025-02-08 16:38
下一篇 2025-03-17 16:01

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/67425.html