自制游戏手柄joystick stm32 hal usb协议
自制游戏手柄
- 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协议相关推荐
- [STM32F1]基于STM32 HAL库实现鼠标键盘摇杆的USB复合设备
序: 其实这样一个设备我们在ch32v103上实现过,但移植到STM32 HAL库上面,还是发现很多问题的,现在就移植过程给大家分享一下在基于STM32 HAL库实现鼠标键盘摇杆的USB复合设备的实现 ...
- STM32 HAL库、标准外设库、LL库(STM32 Embedded Software)
STM32 Embedded Software 工作以来一直使用ST的STM32系列芯片,ST为开发者提供了非常方便的开发库.到目前为止,有标准外设库(STD库).HAL库.LL库 三种.前两者都是常 ...
- 基于STM32 HAL库的遥控小车
目录 前言 一.材料清单 二.系统概述 三.硬件设计 1.HC-SR04超声波模块 2.HC-05/06蓝牙模块 3.L298n电机驱动模块 四.代码 1.引脚设置 2.遥控部分 3.超声波报警部分 ...
- STM32 HAL库学习笔记1-HAL库简介
STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...
- USB协议学习笔记 - 虚拟串口Virtual Port Com LED控制
前言 STM32 的USB 可以虚拟成一个串口,功能还挺强,感觉比HID好用 这里使用USB 虚拟的串口,做个控制LED的小程序 控制LED这里使用自定义的AT命令方式,如红灯亮:AT+LEDR_ON ...
- USB协议学习笔记 - CUSTOM HID控制LED
简介 前面了解了 STM32 CUSTOM HID 设备,但是有几个细节没有处理好,如接收到主机的报告后,如何接收到指定的数组,并实现通信功能,如控制LED亮灭? 还有就是CUSTOM HID设备的[ ...
- 修改STM32的USB程序
在万利学习板自带的演示例程中,有几个USB的例程.如果我们想实现一个USB功能,可以拿里面的例子来改. 那么具体要改哪些地方呢?首 先要改各种描述符,然后是具体的数据处理.我们拿USB摇杆鼠标范 ...
- STM32的USB例程JoyStickMouse代码分析
https://blog.csdn.net/niepangu/article/details/45081081 本帖最后由 追风 于 2010-12-4 17:30 编辑 一.USB的"Jo ...
- STM32 HAL库详解
STM32 HAL库整体总结 STM32 之二 HAL库详解 及 手动移植 本篇博客是对以上参考资源的一个二次总结与整理. 1. HAL库文件结构 对于开发人员而言,首先要清楚 HAL 库的文件结构. ...
- USB协议学习笔记 - CUSTOM HID 设备
简介 这里使用STM32平台进行USB 协议的学习与USB 设备的调试开发 USB HID设备,协议较固定,无法实现数据的自由接收与发送 USB CUSTOM HID设备(自定义HID协议)可以实现简 ...
最新文章
- javascript创建对象
- MySQL双主(master-master)+半同步(Semisync Replication)
- Golang类型转化方法汇总
- 内核进程切换实现分析
- 福大软工 · BETA 版冲刺前准备(团队)
- Linux关于文件的权限笔记
- 基于PHPEnv的本地环境搭建—PHP第一个项目:HelloWorld(从安装到运行)
- 【MFC系列-第10天】非模式对话框开发
- html在线消息,HTML5之消息通知的使用(Web Notification)
- Eclipse插件安装方式
- HTTP Headers Content-Disposition
- STL之multiset简介
- 第一章节 ASP.NET Web应用程序基础(一)
- lr_save_string 和 sprintf 的使用
- 基于PHP的个人博客系统的设计与开发(含源文件)
- JAVA文件上传限制
- 易支付源码php,「独家修复」2020最新版易支付源码-PHP运营级易支付源码已去后门...
- 关于数据埋点的认识以及在流量分析系统中的实际使用
- 如何同时或者按顺序间隔启动多个程序
- 根式进入计算机的方法