基于 nRF52840、PAW3399 和 nRF5 SDK 的 USB、蓝牙与 ESB RF 鼠标固件及硬件原型
USB HID · BLE HID · ESB RF · PAW3399 · 多档 DPI · Keil MDK
本项目是一套 nRF52840 游戏鼠标原型,包含鼠标本体固件、ESB RF 接收器固件、PAW3399 传感器驱动、USB HID、BLE HID、状态灯、电量采样和评估板资料 [1][2]
HID 是主机识别键盘和鼠标等输入设备的标准协议,BLE HID 通过低功耗蓝牙传输相同类别的输入报告,ESB 是 Nordic 的低开销专有射频链路
固件采用轮询扫描,没有引入 RTOS,当前目标是提供可学习、可修改的三模参考实现,不是经过量产验证的成品方案 [3]
原始说明中的风险信息全部保留并重新组织到限制章节,包括蓝牙配对逻辑、延迟、功耗、维护节奏、8K 回报率和潜在缺陷
表 2.1 当前固件和硬件资料覆盖的能力
| 能力域 | 当前实现 | 主要入口 |
|---|---|---|
| 鼠标输入 | 左键、中键、右键、两个侧键、滚轮和 PAW3399 位移 | Drives/mouse.c |
| 有线模式 | USB Full-Speed HID,目标最高 1000 Hz | Drives/usb_device.c |
| 蓝牙模式 | BLE HID、配对和重连,目标最高 133 Hz | Drives/ble_device.c |
| 无线接收器 | ESB RF 发送,接收器转换为 USB HID,目标最高 1000 Hz | Drives/esb_device.c、gm_mouse_rx/ |
| DPI | 800、1200、1600、2400、3200 五档循环 | Drives/mouse.c |
| 状态反馈 | WS2812B 连接、配对、挂起和异常状态灯 | Drives/ws2812b.c |
| 电量反馈 | ADC 采样和高、中、低三级颜色 | sdk_config.h |
| 硬件资料 | Altium 原理图、PCB 工程、库和 PDF 输出 | demo pcb/PCB_Project/ |
| HID 描述符 | Waratah 源文件、生成器和生成后的 Descriptor.h |
waratah/ |
| SDK 基线 | nRF5 SDK、nRFx、SoftDevice 和工具链配置 | 仓库根目录及 components/ |
表中的回报率是当前实现目标和原作者记录,不是经过标准化实验室测量的保证值
照片显示固件曾以 AIALRA_GAMING_MOUSE 作为 BLE 设备名连接 Windows,右侧同时展示了 HID 设备状态和电量信息
图片已经存入仓库本地资源,README 不再依赖 GitHub 临时附件地址
表 4.1 三种主机链路的差异
| 模式 | 设备到主机路径 | 当前目标回报率 | 触发条件 |
|---|---|---|---|
| USB | 鼠标固件 → USB Full-Speed HID → 主机 | 最高 1000 Hz | USB 已连接 |
| BLE | 鼠标固件 → BLE HID → 主机 | 最高 133 Hz | USB 断开且模式引脚为高电平 |
| ESB RF | 鼠标固件 → ESB RF → 接收器 → USB HID → 主机 | 最高 1000 Hz | USB 断开且模式引脚为低电平 |
USB Full-Speed 不提供 8K 鼠标常用的高速微帧能力,当前工程也没有外挂 USB High-Speed PHY
%% 鼠标根据 USB 连接和模式选择引脚决定主机链路
flowchart TB
Boot[设备启动并初始化传感器与输入] --> Usb{检测到 USB 连接}
Usb -->|是| Wired[启用 USB HID]
Usb -->|否| Pin{模式选择引脚}
Pin -->|高电平| Ble[启用 BLE HID]
Pin -->|低电平| Esb[启用 ESB RF]
Ble --> Pair{已有可用配对信息}
Pair -->|是| BleHost[连接蓝牙主机]
Pair -->|否| Advertise[进入 BLE 配对广播]
Esb --> Receiver[发送到固定配置的 ESB 接收器]
Receiver --> ReceiverUsb[接收器转换为 USB HID]
Wired --> Host[主机收到鼠标报告]
BleHost --> Host
Advertise --> BleHost
ReceiverUsb --> Host
图 5.1 USB 优先级最高,USB 断开后由模式引脚在 BLE 和 ESB 之间选择
BLE 模式下长按配对按键会重新开始配对,紫色状态表示主机侧可能需要删除旧设备记录后再连接
%% 传感器、按键和滚轮数据形成统一鼠标报告后交给当前链路
flowchart TB
Sensor[PAW3399 位移] --> Scan[轮询扫描]
Buttons[五个鼠标按键] --> Scan
Wheel[滚轮 A/B 相位] --> Scan
Dpi[DPI 增减按键] --> Resolution[更新 X/Y 分辨率]
Resolution --> Sensor
Scan --> Report[统一鼠标 HID 报告]
Report --> Route{当前传输模式}
Route --> Usb[USB HID]
Route --> Ble[BLE HID]
Route --> Esb[ESB 数据包]
Esb --> Rx[接收器 USB HID]
Power[ADC 电量与挂起状态] --> Led[WS2812B 状态反馈]
Usb --> Host[主机]
Ble --> Host
Rx --> Host
图 6.1 输入扫描和报告构造共用,三种模式只在传输层分流
表 7.1 默认输入和 DPI 配置
| 项目 | 默认配置 | 说明 |
|---|---|---|
| 主按键 | 左键、中键、右键 | 使用上拉输入 |
| 侧键 | 两个 | 对应 Side 1 和 Side 2 |
| 滚轮 | A/B 两相 | 通过相位变化判断方向 |
| DPI 档位 | 800、1200、1600、2400、3200 | X 与 Y 同步设置 |
| 默认 DPI | 1200 | current_dpi_index 初始为第二档 |
| DPI 调整 | 增加和减少两个按键 | 到端点后循环 |
| 配对按键 | BLE 长按重新配对 | 只影响蓝牙配对流程 |
DPI 在传感器数据表中通常以 CPI 表示,两者在鼠标配置语境中都描述每英寸计数密度
表 8.1 状态与电量颜色
| 灯光 | 连接状态 | 电量状态 |
|---|---|---|
| 绿色 | 已连接 | 电量高于 40% |
| 黄色 | 无操作并进入挂起 | 电量高于 20% 且不高于 40% |
| 红色 | BLE 断开,需要重新配对 | 电量低于 20% |
| 蓝色闪烁 | BLE 配对中 | 不适用 |
| 紫色 | 主机需要清理旧设备信息 | 不适用 |
当前 WS2812B 用于状态反馈,通用 RGB 灯效尚未实现
表 9.1 用户驱动目录
| 模块 | 职责 | 备注 |
|---|---|---|
ble_device |
BLE HID、设备信息、配对和连接状态 | 配对逻辑仍需整理 |
esb_device |
ESB 射频发送和接收 | 接收器地址当前固定 |
usb_device |
USB Full-Speed HID | 不支持 8K 微帧 |
mouse |
按键、滚轮、DPI、报告和模式逻辑 | 当前采用轮询,不含 RTOS |
paw3399 |
PAW3399 SPI、寄存器和分辨率控制 | 移植其他传感器需要重新核对数据表 |
ws2812b |
单线 RGB 状态指示 | 基于 PWM 时序驱动单线灯珠 |
主要驱动位于 examples/peripheral/gm_mouse/pca10056/blank/arm5_no_packs/Drives/,接收器目录保留了对应接收端模块
表 10.1 sdk_config.h 中的应用层默认引脚
| 功能 | 编号 | 功能 | 编号 |
|---|---|---|---|
| 左键 | P0.13 | 中键 | P0.14 |
| 右键 | P0.15 | 侧键 1 | P0.16 |
| 侧键 2 | P0.17 | DPI 增加 | P0.19 |
| DPI 减少 | P0.20 | 滚轮 A | P0.21 |
| 滚轮 B | P0.22 | 模式选择 | P0.23 |
| BLE 配对 | P0.24 | WS2812B | P0.25 |
| 电量 ADC | AIN1 | ADC 控制 | P1.15 |
实际制板前应以 sdk_config.h、原理图和目标 PCB 三方一致为准,修改传感器、电源或按键连接后需要同步更新配置
表 11.1 主要路径
| 路径 | 内容 |
|---|---|
examples/peripheral/gm_mouse/ |
鼠标本体固件、Keil 工程和驱动 |
examples/peripheral/gm_mouse_rx/ |
ESB 接收器固件和 Keil 工程 |
demo pcb/PCB_Project/ |
Altium 原理图、PCB、库、输出任务和 PDF |
waratah/ |
HID 描述符源文件、生成工具和输出头文件 |
components/、modules/、external/ |
nRF5 SDK、nRFx、SoftDevice 和第三方组件 |
config/、integration/ |
芯片和驱动集成配置 |
LICENSE |
项目 MIT 许可证 |
仓库包含完整 nRF5 SDK 树和二进制工具,体积较大,维护者需要分别遵守项目 MIT 许可证和各第三方组件自己的许可证
评估板工程位于 demo pcb/PCB_Project/,包含 nRF52840 核心、电池与充电、电源转换、USB、PAW3399、按键、ADC、指示灯和调试接口 [4]
原理图与 PCB 框架已经存在,原作者没有完成一块可作为量产依据的最终装配板
PAW3395 或 PAW3950 等传感器不能只依据名称直接替换,必须使用有权访问的官方数据表核对寄存器、上电时序、光学结构和电气约束
仓库中标记为 Confidential 的第三方资料不构成项目再分发授权,使用者应从芯片供应方获得许可版本
当前主工程使用 Keil MDK,设备包和 CMSIS 的精确版本记录在 Keil 工程 XML 中 [5]
WS2812B 驱动参考了公开的 nRF52840 实现 [6],HID 描述符则使用 Microsoft HID Tools 中的 Waratah 语法与命令行工具 [7]
-
第一步,在 Keil MDK 中打开鼠标工程
Gaming_Mouse.uvprojx -
第二步,确认工程能够解析仓库内 nRF5 SDK、S140 SoftDevice 和
Drives目录 -
第三步,在
sdk_config.h中核对引脚、DPI、回报率、电量阈值、BLE、USB、ESB、SPI 和 WS2812B 配置 -
第四步,构建并通过 J-Link 将鼠标固件烧录到 nRF52840 目标板
-
第五步,打开
Gaming_Mouse_Receiver.uvprojx,构建并烧录 ESB USB 接收器 -
第六步,分别验证 USB、BLE 与 ESB 三条链路,再核对 DPI、滚轮、所有按键、配对和电量指示
Keil 生成的用户界面状态文件已经改为 .uvguix.template,避免把本机用户名写入公开文件名
表 14.1 本次仓库审计和文档升级结果
| 检查项 | 结果 | 说明 |
|---|---|---|
| 原型照片 | 已确认 | 展示面包板、传感器、状态灯和 BLE HID 连接 |
| 原理图预览 | 已确认 | 展示 MCU、USB、电源、电池、PAW3399、按键和调试模块 |
| Keil 工程结构 | 通过 | 鼠标与接收器主工程 XML 均可解析,当前环境未安装 Keil MDK,因此不宣称固件构建通过 |
| 配置证据 | 已确认 | 五档 DPI、1000 Hz 目标、阈值和应用引脚可在源码定位 |
| 身份信息扫描 | 通过 | 本机用户名、绝对路径和 Keil 许可证标识已脱敏 |
| README 资源 | 通过 | 头图、原型照片和原理图均为仓库本地文件 |
当前没有自动化硬件在环测试,照片和历史构建日志只能证明曾经运行,不能替代每次修改后的重新烧录与测量
- 代码仍是原型级实现,蓝牙配对和部分驱动结构需要重构
- 延迟和低功耗尚未系统优化,现有回报率是目标值而不是独立测量报告
- 固件采用轮询并且没有 RTOS,任务调度、功耗状态和最坏延迟需要进一步分析
- USB Full-Speed 和当前硬件不支持 8K 回报率,外挂高速 PHY 尚未实现
- ESB 接收器使用固定地址,多个设备、重新配对和地址冲突策略需要完善
- 中文注释在错误编码下可能显示乱码,编辑器应按源文件实际编码打开
- RGB 目前只承担状态反馈,通用灯效没有实现
- 项目按尽力方式维护,更新没有固定周期
- 商业或长期 DIY 使用需要自行完成电气、射频、EMC、ESD、功耗、寿命和合规验证
公开仓库不得包含个人用户路径、工具许可证标识、调试器序列号、蓝牙绑定数据或真实设备地址
本次升级已把历史构建日志中的本机路径和许可证标识替换为占位内容,并把带用户名后缀的 Keil GUI 文件改为通用模板名
仓库还包含 nRF5 SDK、SoftDevice、Waratah 可执行文件、安装包和多个第三方组件,使用者应验证来源、哈希、许可证和工具版本,不应默认信任仓库内二进制文件
- 重构 BLE 配对、重连和清除绑定流程
- 增加可配置的 ESB 地址、配对和多设备冲突处理
- 建立 USB、BLE 和 ESB 的端到端延迟与丢包测量
- 优化空闲、挂起、广播和射频工作周期的功耗
- 把驱动和应用状态机拆分为可测试模块
- 增加编译检查、静态分析和硬件在环回归
- 评估 RGB 灯效与可配置 HID 描述符
- 清理生成物、二进制工具和第三方机密资料的分发边界
提交固件变更时,请同时说明目标硬件、编译器版本、SoftDevice、连接模式、测试主机和验证结果
修改引脚、传感器寄存器、HID 描述符或无线参数时,应同步更新配置、原理图、接收端和 README
提交前检查构建日志、Keil 用户文件、截图和输出目录,删除许可证标识、绝对用户路径、设备地址和调试器身份信息
项目根目录使用 MIT License [8]
nRF5 SDK、SoftDevice、nRFx、Waratah、CMSIS 和其他第三方内容继续受各自许可证约束,根许可证不会覆盖这些独立条款
[1] nRF52 Tri-Mode Wireless Mouse, “Application Configuration,” examples/peripheral/gm_mouse/pca10056/blank/config/sdk_config.h, 2025
[2] nRF52 Tri-Mode Wireless Mouse, “Mouse Application Entry,” examples/peripheral/gm_mouse/main.c, 2025
[3] nRF52 Tri-Mode Wireless Mouse, “Mouse Input Driver,” examples/peripheral/gm_mouse/pca10056/blank/arm5_no_packs/Drives/mouse.c, 2025
[4] nRF52 Tri-Mode Wireless Mouse, “Evaluation Board Schematic,” demo pcb/PCB_Project/Demo_XM1.pdf, 2025
[5] nRF52 Tri-Mode Wireless Mouse, “Keil Project,” examples/peripheral/gm_mouse/pca10056/blank/arm5_no_packs/Gaming_Mouse.uvprojx, 2025
[6] N. Korn, “NRF52840 WS2812B,” GitHub. [Online]. Available: https://github.com/nicokorn/NRF52840_WS2812B
[7] Microsoft, “HID Tools,” GitHub. [Online]. Available: https://github.com/microsoft/hidtools
[8] nRF52 Tri-Mode Wireless Mouse, “MIT License,” LICENSE, 2025

