自制游戏手柄

  • ps:
  • 开发环境
  • 初始配置
  • 代码编写
  • 推荐工具:
  • 参考文章:

ps:

耗费了一天去了解怎么实现usb协议下的HID传输,因为各个文章没有说清楚,导致我数据的内容总时接收不到或者错位,所以特意写一篇文章来具体指出了各个步骤的坑

开发环境

windows
stm32f103rct6
stm32cubemx
keil
joystick模块(5针)两轴

初始配置

开启时钟

USB时钟 一定 48M


打开USB

配置HID

配置完成

代码编写

打开usbd_hid.c

应为stm32cbemx 自动生成的HID是鼠标,所以需要更该报告描述符
如下

__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE]  __ALIGN_END =
{0x05,   0x01,0x09,   0x04,//joystick0xA1,   0x00,0x05,   0x01,0x09,   0x30,//x0x09,   0x31,//y0x09,   0x32,//z0x09,   0x33,//rx  旋转x轴0x15,   0x00,//最小数据输入 00x25,   0x7F,//最大数据输入  1270x75,   0x08,//数据字节 80x95,   0x04,//一次的数据个数 4个  即 x y z rx0x81,   0x02,0xc0//终止
};

找到 ,并修改

 0x00,         /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/

找到如下内容

HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/

更换成
因为上面的报告符数 为27个,可自己添加然后更改这个数字
应该有4个位置

  27,//HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/

以下为main.c中内容
加入头文件,以及相关句柄

#include "usbd_hid.h"
extern USBD_HandleTypeDef hUsbDeviceFS;

创建相关结构体
一定注意顺序,这里的顺序要和报告符中的描述一致

struct mouseHID_t {uint8_t x;uint8_t y;uint8_t buttons;int8_t wheel;}; struct mouseHID_t mouseHID;

读取adc 并转化为 0到20的范围

uint16_t AD_Value_Buf[2];
uint16_t AD_X_Value = 0;
uint16_t AD_Y_Value = 0;
int16_t AD_Value_map(int16_t x, int16_t in_min, int16_t in_max, int16_t out_min, int16_t out_max)
{return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
} void USB_send(void)
{ADC_ChannelConfTypeDef sConfig;        //通道初始化for(uint8_t i=0;i<2;i++){      switch(i)                           //选择ADC通道{case 0:sConfig.Channel = ADC_CHANNEL_0;break;    case 1:sConfig.Channel = ADC_CHANNEL_1;break;}sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;      //采用周期239.5周期sConfig.Rank = 1;HAL_ADC_ConfigChannel(&hadc1,&sConfig);  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK){Error_Handler();}       HAL_ADC_Start(&hadc1);if(HAL_OK==HAL_ADC_PollForConversion(&hadc1,10)){AD_Value_Buf[i] = HAL_ADC_GetValue(&hadc1);// USE_MAIN_INFO("AD_Value_Buf[%d] %d",i,AD_Value_Buf[i]);}  HAL_ADC_Stop(&hadc1);}AD_X_Value = AD_Value_Buf[0];AD_Y_Value = AD_Value_Buf[1];mouseHID.x =(uint8_t) AD_Value_map(AD_X_Value,0,4095,-20,20);//从0-4095映射到-20~20mouseHID.y = (uint8_t)AD_Value_map(AD_Y_Value,0,4095,20,-20);//从0-4095映射到20~-20//USE_MAIN_INFO("mouseHID.x  %d\r\n",mouseHID.x);//USE_MAIN_INFO("mouseHID.y  %d", mouseHID.y );USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t*)&mouseHID, sizeof(struct mouseHID_t));}

在main函数里面初始化

mouseHID.buttons =0;mouseHID.x =0;mouseHID.y = 0;mouseHID.wheel = 0;

各功能初始化后进行adc校准
然后进行循环采集

 /* USER CODE BEGIN 2 */
HAL_Delay(100);
HAL_ADCEx_Calibration_Start(&hadc1);/* USER CODE END 2 */while (1){     USB_send();HAL_Delay(10);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}

此时通过stm32的usb口(非usart)连接电脑,
打开电脑上的游戏管理器,可以看见stm32 human interface
打开校准,控制手柄,应该可以看见光标移动则说明成功

其他功能可以看usb协议(我也不会)来实现

推荐工具:

usb bound
HID Descriptor tool

参考文章:

Stm32-usb手柄(一)`
STM32下实现joystick
利用stm32cubemx生成usb_hid工程

date:2021.4.26
author:_zs_dawn

自制游戏手柄joystick stm32 hal usb协议相关推荐

  1. [STM32F1]基于STM32 HAL库实现鼠标键盘摇杆的USB复合设备

    序: 其实这样一个设备我们在ch32v103上实现过,但移植到STM32 HAL库上面,还是发现很多问题的,现在就移植过程给大家分享一下在基于STM32 HAL库实现鼠标键盘摇杆的USB复合设备的实现 ...

  2. STM32 HAL库、标准外设库、LL库(STM32 Embedded Software)

    STM32 Embedded Software 工作以来一直使用ST的STM32系列芯片,ST为开发者提供了非常方便的开发库.到目前为止,有标准外设库(STD库).HAL库.LL库 三种.前两者都是常 ...

  3. 基于STM32 HAL库的遥控小车

    目录 前言 一.材料清单 二.系统概述 三.硬件设计 1.HC-SR04超声波模块 2.HC-05/06蓝牙模块 3.L298n电机驱动模块 四.代码 1.引脚设置 2.遥控部分 3.超声波报警部分 ...

  4. STM32 HAL库学习笔记1-HAL库简介

    STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...

  5. USB协议学习笔记 - 虚拟串口Virtual Port Com LED控制

    前言 STM32 的USB 可以虚拟成一个串口,功能还挺强,感觉比HID好用 这里使用USB 虚拟的串口,做个控制LED的小程序 控制LED这里使用自定义的AT命令方式,如红灯亮:AT+LEDR_ON ...

  6. USB协议学习笔记 - CUSTOM HID控制LED

    简介 前面了解了 STM32 CUSTOM HID 设备,但是有几个细节没有处理好,如接收到主机的报告后,如何接收到指定的数组,并实现通信功能,如控制LED亮灭? 还有就是CUSTOM HID设备的[ ...

  7. 修改STM32的USB程序

    在万利学习板自带的演示例程中,有几个USB的例程.如果我们想实现一个USB功能,可以拿里面的例子来改.    那么具体要改哪些地方呢?首 先要改各种描述符,然后是具体的数据处理.我们拿USB摇杆鼠标范 ...

  8. STM32的USB例程JoyStickMouse代码分析

    https://blog.csdn.net/niepangu/article/details/45081081 本帖最后由 追风 于 2010-12-4 17:30 编辑 一.USB的"Jo ...

  9. STM32 HAL库详解

    STM32 HAL库整体总结 STM32 之二 HAL库详解 及 手动移植 本篇博客是对以上参考资源的一个二次总结与整理. 1. HAL库文件结构 对于开发人员而言,首先要清楚 HAL 库的文件结构. ...

  10. USB协议学习笔记 - CUSTOM HID 设备

    简介 这里使用STM32平台进行USB 协议的学习与USB 设备的调试开发 USB HID设备,协议较固定,无法实现数据的自由接收与发送 USB CUSTOM HID设备(自定义HID协议)可以实现简 ...

最新文章

  1. javascript创建对象
  2. MySQL双主(master-master)+半同步(Semisync Replication)
  3. Golang类型转化方法汇总
  4. 内核进程切换实现分析
  5. 福大软工 · BETA 版冲刺前准备(团队)
  6. Linux关于文件的权限笔记
  7. 基于PHPEnv的本地环境搭建—PHP第一个项目:HelloWorld(从安装到运行)
  8. 【MFC系列-第10天】非模式对话框开发
  9. html在线消息,HTML5之消息通知的使用(Web Notification)
  10. Eclipse插件安装方式
  11. HTTP Headers Content-Disposition
  12. STL之multiset简介
  13. 第一章节 ASP.NET Web应用程序基础(一)
  14. lr_save_string 和 sprintf 的使用
  15. 基于PHP的个人博客系统的设计与开发(含源文件)
  16. JAVA文件上传限制
  17. 易支付源码php,「独家修复」2020最新版易支付源码-PHP运营级易支付源码已去后门...
  18. 关于数据埋点的认识以及在流量分析系统中的实际使用
  19. 如何同时或者按顺序间隔启动多个程序
  20. 根式进入计算机的方法

热门文章

  1. 如何用Carbon Copy Cloner把macOS系统旧硬盘备份到新硬盘上?
  2. Genymotion启动报错:VT-x/AMD-V硬件加速在您的系统中不可用
  3. hibernate 各历史版本下载
  4. junit 单元测试插入操作事务回滚
  5. q讯家园看加密空间 官方免费版
  6. 如何从零开始系统运营微信公众号?
  7. ZIGBEE通过协议栈点对点通信流程
  8. 数字信号处理第二章:Z变换及离散时间系统系统分析
  9. 第七届DAMS中国数据智能管理峰会(上海站) - 文末俩惊喜
  10. Swing 主题 - FlatLaf