- Published on
利用STM32自制一个游戏手柄
- Authors

- Name
- leejkee
技术选型
- MCU: 需要使用
USB、GPIO、ADC、DMA外设,选用STM32F072C8T6 - 固件支持:
USB HID Gamepad - 开发工具:
STM32CubeIDE/STM32CubeMonitor/Keil uVision - 上位机: Windows
DirectInput/ Web Gamepad API
硬件准备
STM32F072C8T6核心板(包含 USB Type-C 接口)- ST-Link 调试器
HS-S34A双轴摇杆模块- 按钮 × 若干
Demo目标
跑通单个摇杆的 DMA + ADC 采集,通过 USB HID 协议将数据传输到 PC,并在 Windows 的游戏控制器设置界面(joy.cpl)中正确显示摇杆状态。
电路连接
摇杆模块原理图
核心板部分原理图 
核心板部分原理图 
工程初始化
使用 STM32CubeMX 生成标准的 ARM-MDK 工程,免去使用标准库手写初始化代码的繁琐步骤。 Start My Project from MCU (ACCESS TO MCU SELECTOR) → Commercial Part Number 选择 STM32F072C8T6 → Start Project
工程配置
开启 ST-Link 的 SWD 调试接口
System Core → SYS
-
Debug Serial Wire
RCC
HSE 选择 Crystal/Ceramic Resonator,即使用核心板上的外部晶振,本核心板为 8 MHz。
Clock Configuration
- 选择时钟源: 本 Demo 选用
HSE外部石英晶振。STM32F072C8T6的主频与 USB 规范要求的频率一致,因此通过PLL倍频得到的48 MHz可同时供给System Clock Mux和USB Clock Mux。 - 配置示意图: 主要需在
RCC中开启外部晶振选项。
GPIO & ADC
Demo 的核心是将 ADC 采集的数据通过 DMA 搬运到内存中。本节配置 ADC 和 DMA 相关参数。
| 信号 | 引脚 | 功能 |
|---|---|---|
| X | PA0 | ADC_IN0 |
| Y | PA1 | ADC_IN1 |
| K | PA2 | GPIO_Input |

ADC 和 DMA 配置
Analog → ADC
- 在
DMA Settings选项中添加 DMA 通道:
| DMA Request | Channel | Direction | Priority |
|---|---|---|---|
ADC1 | DMA1_Channel1 | Peripheral to Memory | High |
DMA Request Settings 选择 Mode 为 Circular。 
- 在
Parameter Settings中:ADC_Settings:配置Continuous Conversion Mode为Enabled,DMA Continuous Requests为Enabled。ADC_Regular_ConversionMode:配置采样时间Sampling Time为239.5 Cycles。
USB 配置
我们需要开发的是自定义设备,应选择 Custom HID Device。
Connectivity→USB:勾选Device (FS)。STM32F072C8T6的数据手册中说明PA11和PA12引脚复用为USB_DM和USB_DP。
▲ CubeMX中使能USB Device (FS)
▲ 数据手册中PA11/PA12的引脚复用定义 
Middleware and Software Packs→USB_DEVICE:Class for FS IP选择Custom Human Interface Device Class (HID)Configuration→Parameter Settings:USBD_CUSTOM_HID_REPORT_DESC_SIZE需根据实际需求修改。本文基于已完成的项目编写,直接使用48即可。
项目管理
为方便使用 
Keil,直接选择生成 MDK-ARM 工程,配置好工程名称,注意不要使用中文路径。 
在代码生成选项中,勾选"仅复制必要的库文件"。 

生成工程
点击右上角 GENERATE CODE 即可生成工程,随后使用 Keil 打开进行开发。