杰理 SDK 文档中心
首页
首页
  • 概述与快速入门

    • 芯片平台与 SDK 概述
    • 环境搭建与编译工具链
    • 快速开始:选型、编译与烧录
    • 烧录与量产工具
  • 构建系统与板级工程

    • 顶层 Makefile 与编译目标
    • 板级工程与配置
    • 后处理与配置工具
  • HID 人机交互应用

    • HID 应用架构总览
    • 键盘、翻页器与遥控应用
    • 鼠标应用:单模、双模与低延迟
    • 空闲应用与初始化流程
  • BLE 透传与数传应用

    • 透传应用总览
    • 多连接与无连接传输
    • AT 命令模组应用
    • Dongle 适配器应用
  • BSP 公共模块

    • 蓝牙公共处理
    • 按键、LED 与红外
    • 传感器与编码器
    • 存储、VM 与文件系统
    • 电源管理与低功耗
    • 消息调度与通信外设
  • 协议栈与预编译库

    • 蓝牙协议栈库
    • 设备驱动与文件系统库
    • 音频、升级与其他库
  • 开发资料与补丁发布

    • 文档资料中心
    • 版本补丁与兼容性修复

鼠标应用:单模、双模与低延迟

AW31N BLE SDK 提供的三类 HID 鼠标参考应用:单模 BLE 鼠标(133Hz 回报率)、双模鼠标(BLE 133Hz + 2.4G 1KHz 回报率,可扩展 USB 模式)以及低延迟鼠标(2.4G 1KHz 回报率,可扩展 USB 模式),覆盖从数据采集、无线传输到低功耗管理的完整端到端实现。

Purpose and Scope

本页面向使用 AW31N 芯片开发无线鼠标产品的工程师,系统性地讲解 SDK 中三个鼠标参考应用(mouse_single、mouse_dual、mouse_low_latency)的架构、工作机制与差异:

  • 涵盖内容:应用注册与启动流程、光学传感器数据采集、回报率(report rate)控制、BLE/2.4G 模式切换、看门狗与自动关机、CPI 调节、低功耗临界点管理、以及相关板级配置。
  • 不涵盖内容:BLE 协议栈底层实现、HID over GATT Profile(ble_hogp)的 Profile 细节、2.4G 私有协议栈实现、USB HID 设备类协议本身——这些属于各自协议层的独立主题,请参考对应的协议文档。

Overview

鼠标是典型的低功耗 HID 外设:用户移动鼠标时,光学传感器以固定频率产生位移数据,MCU 将数据封装成 HID report 并通过无线链路(BLE 或 2.4G)发送给主机(PC/平板/手机)。鼠标应用的工程质量直接决定产品体验:回报率影响指针流畅度,功耗决定续航,模式切换决定多设备兼容性。

SDK 在 apps/demo/hid/examples/ 下提供了三个可编译的应用分支,由 app_main.c 中的编译宏选择,三者共享同一套设计骨架(mouse_info_t 状态机、mouse_send_flags_t 发送标志、光学传感器回调、BLE 配置),差异在于无线链路与回报率:

应用编译宏无线模式回报率BLE 广播名
单模CONFIG_APP_MOUSE_SINGLEBLE 仅133Hz(约 7.5ms 周期)AW31N_MOUSE_SINGLE
双模CONFIG_APP_MOUSE_DUALBLE + 2.4G(可加 USB)BLE 133Hz / 2.4G 1KHzAW31N_MOUSE_DUAL
低延迟CONFIG_APP_MOUSE_LOW_LATENCY2.4G(可加 USB)2.4G 1KHzLOW_LATENCY

设计意图:三种应用共用"取数—组包—发送"的核心链路,仅在上层选择不同的传输通道,从而最大化代码复用,同时让 2.4G 模式通过更高回报率(1KHz)获得更低延迟体验。

Architecture

三个鼠标应用均挂在 HID demo 应用框架(apps/demo/hid/)之下,核心架构如下:

flowchart TD
    subgraph sg_AppLayer["应用层 (apps/demo/hid)"]
        AppMain["app_main.c<br/>main_app_get_name()"]
        MouseSingle["app_mouse_single.c<br/>单模 BLE 133Hz"]
        MouseDual["app_mouse_dual.c<br/>双模 BLE + 2.4G + USB"]
        MouseLowLat["app_mouse_low_latency.c<br/>低延迟 2.4G 1KHz"]
    end

    subgraph sg_SensorLayer["传感器层"]
        OMSensor["OMSensor_manage.h<br/>光学传感器管理"]
        SensorHW["光学鼠标传感器 (SPI/GPIO)"]
    end

    subgraph sg_TransportLayer["传输层"]
        BLE_HOGP["ble_hogp.h<br/>BLE HID over GATT"]
        StdHID["standard_hid.h<br/>标准 HID (2.4G)"]
        MouseUSB["mouse_usb.c / hid_mouse.c<br/>USB HID"]
        GPTimer["gptimer.h<br/>回报率定时器"]
    end

    subgraph sg_SystemLayer["系统层"]
        SysTimer["sys_timer.h<br/>自动关机定时"]
        Wdt["看门狗 wdt"]
        PowerMg["app_power_mg.h<br/>低功耗管理"]
    end

    AppMain -->|"CONFIG_APP_MOUSE_* 编译宏选择"| MouseSingle
    AppMain --> MouseDual
    AppMain --> MouseLowLat

    MouseSingle --> OMSensor
    MouseDual --> OMSensor
    MouseLowLat --> OMSensor
    OMSensor --> SensorHW

    MouseSingle --> BLE_HOGP
    MouseDual --> BLE_HOGP
    MouseDual --> StdHID
    MouseLowLat --> StdHID
    MouseDual --> MouseUSB
    MouseLowLat -.->|"可选(注释掉)"| MouseUSB

    MouseSingle --> GPTimer
    MouseDual --> GPTimer
    MouseLowLat --> GPTimer

    MouseSingle --> SysTimer
    MouseDual --> SysTimer
    MouseLowLat --> SysTimer
    MouseSingle --> Wdt
    MouseDual --> Wdt
    MouseLowLat --> Wdt
    MouseSingle --> PowerMg
    MouseDual --> PowerMg
    MouseLowLat --> PowerMg

架构分层说明:

  • 应用层:app_main.c 通过 main_app_get_name() 根据编译宏决定运行哪个鼠标应用,所有鼠标应用统一使用 ACTION_MOUSE_MAIN 动作入口。三个应用源码结构高度同构(mouse_single 822 行、mouse_dual 1296 行、mouse_low_latency 1146 行左右),mouse_dual 是功能最全的参照实现。
  • 传感器层:通过 OMSensor_manage.h 的 optical_mouse_read_sensor_handler_high() 读取光学传感器位移,填充 mouse_packet_data_t 数据包并置位 mouse_send_flags_t 标志。头文件 OMSensor_manage.h 与 gptimer.h 的引入说明传感器采样与回报率定时器配合工作。
  • 传输层:BLE 模式走 ble_hogp.h(HID over GATT,BLE_APPEARANCE_HID_MOUSE + report map);2.4G 模式走 standard_hid.h;USB 模式由 mouse_usb.c(双模专属)与 apps/app/bsp/common/usb/device/hid_mouse.c(通用 USB HID 设备)提供。mouse_low_latency.c 中 //#include "mouse_usb.h" 被注释,说明 USB 模式在该应用中是可选扩展。
  • 系统层:sys_timer.h 提供自动关机定时(sys_timeout_del/sys_timer_modify),wdt 看门狗在数据异常时防止系统卡死,app_power_mg.h 配合 mouse_is_active 临界点标志管理低功耗进入。

三个应用都以 mouse_ble_config 作为 BLE 初始化配置,声明为 ble_init_cfg_t 类型,固定 appearance = BLE_APPEARANCE_HID_MOUSE 并挂载共享的 mouse_report_map:

static const ble_init_cfg_t mouse_ble_config = {
    .same_address = 0,
    .appearance = BLE_APPEARANCE_HID_MOUSE,
    .report_map = mouse_report_map,
    .report_map_size = sizeof(mouse_report_map),
};

Source: app_mouse_dual.c

same_address = 0 表示不使用固定地址,保证每台设备拥有独立 BLE 地址;appearance 声明为 HID 鼠标,使主机端能正确识别设备类型;report map 描述鼠标的按键、位移、滚轮等 report 结构。

应用注册与启动流程

鼠标应用不是独立的 main 函数,而是挂在 HID demo 的 app_main.c 应用选择框架下。main_app_get_name() 根据编译宏在启动时确定运行哪个应用分支:

#elif(CONFIG_APP_MOUSE_SINGLE)
    it->name = "mouse_single";
    it->action = ACTION_MOUSE_MAIN;

#elif(CONFIG_APP_MOUSE_DUAL)
    it->name = "mouse_dual";
    it->action = ACTION_MOUSE_MAIN;

#elif(CONFIG_APP_MOUSE_LOW_LATENCY)
    it->name = "mouse_low_latency";
    it->action = ACTION_MOUSE_MAIN;

Source: app_main.c

随后 main_application_operation_state() 遍历应用链表,通过名称匹配找到对应的 application_operation,调用其 state_machine 进入应用主状态机;系统事件(如按键、传感器中断)通过 main_sys_event_msg_handle() 投递到应用的 event_handler。三个鼠标应用共享 ACTION_MOUSE_MAIN 动作,意味着它们的状态机骨架一致,仅内部实现不同。

编译宏定义位于板级配置头文件(如 apps/demo/hid/board/bd47/board_aw313a_mouse_cfg.h、board_aw313a_mouse_single_cfg.h),lib_driver_config.c 会根据鼠标应用宏联动开关外设子功能:

#if CONFIG_APP_MOUSE_DUAL || CONFIG_APP_MOUSE_SINGLE
const u8 lib_gptimer_timer_mode_en = 1; //gptimer timer功能使能

Source: lib_driver_config.c

设计意图:gptimer 用于产生回报率节拍(1ms/7.5ms 周期),在鼠标应用下必须使能 timer 功能,而其他应用(如键盘)可能不需要,因此通过编译宏按应用裁剪驱动配置,避免无谓的外设时钟开销。

数据采集与发送机制

三个应用的核心发送函数均为 mouse_data_send(),由回报率定时器周期性调用。以单模为例:

static void mouse_data_send(void *priv_hw, uint8_t hw_state, bool is_24g)
{
#if TEST_MOUSE_SIMULATION_ENABLE
    mouse_send_data_test();
#else
#ifdef TCFG_OMSENSOR_ENABLE
    optical_mouse_read_sensor_handler_high(&mouse_send_packet, &mouse_flag);
#endif
#endif
    // 取数
    if (!(mouse_flag.sensor_send_flag && mouse_flag.wheel_send_flag && mouse_flag.button_send_flag)) {
        mouse_reset_cnt++;
        uint32_t mouse_reset_cnt_max;
        mouse_reset_cnt_max = MOUSE_7MS_CLEAR_WDT_CNT_MAX;

        if (mouse_reset_cnt > mouse_reset_cnt_max) {
#if (TCFG_HID_AUTO_SHUTDOWN_TIME)
            sys_timer_modify(mouse_info.mouse_auto_shutdown_timer, TCFG_HID_AUTO_SHUTDOWN_TIME * 1000);
#endif
            // 避免看门狗超时
            wdt_clear();
            mouse_reset_cnt = 0;
        }

Source: app_mouse_single.c

工作机制拆解:

  1. 取数:调用 optical_mouse_read_sensor_handler_high() 从光学传感器读取位移/滚轮/按键状态,填充 mouse_send_packet(mouse_packet_data_t),并置位 mouse_flag(mouse_send_flags_t)中的 sensor_send_flag、wheel_send_flag、button_send_flag。
  2. 完整性检查:if (!(sensor_send_flag && wheel_send_flag && button_send_flag)) —— 只要三个标志未全部置位,就认为本次取数"不完整",累计 mouse_reset_cnt。
  3. 看门狗保护:当不完整次数超过阈值(单模 MOUSE_7MS_CLEAR_WDT_CNT_MAX)时,说明传感器链路可能异常(如 SPI 挂死),此时主动 wdt_clear() 喂狗并顺带刷新自动关机定时器,防止系统在看门狗超时后复位,同时保留传感器自恢复的机会。

低延迟版本的差异在于阈值按模式区分——BLE 模式用 7ms 计数阈值,2.4G 模式用 1ms 计数阈值:

if (mouse_info.mouse_hid_mode == HID_MODE_BLE) {
    mouse_reset_cnt_max = MOUSE_7MS_CLEAR_WDT_CNT_MAX;
} else {
    mouse_reset_cnt_max = MOUSE_1MS_CLEAR_WDT_CNT_MAX;
}

Source: app_mouse_low_latency.c

这反映了两条链路不同的节拍粒度:2.4G 1KHz 回报率下定时器中断频率更高,若用相同阈值,看门狗保护触发会滞后,因此按模式选择计数上限,保证"异常检出延迟"与"回报率"成比例。

核心数据流

鼠标从传感器到主机的完整数据流如下:

sequenceDiagram
    participant T as gptimer (回报率节拍)
    participant A as app_mouse_*.c
    participant S as 光学传感器 OMSensor
    participant F as mouse_send_flags_t
    participant P as mouse_packet_data_t
    participant L as 传输层 (BLE_HOGP/StdHID/USB)

    T->>A: mouse_data_send(priv_hw, hw_state, is_24g)
    activate A
    A->>S: optical_mouse_read_sensor_handler_high(&packet, &flag)
    S-->>A: 位移/滚轮/按键数据
    A->>F: 置位 sensor/wheel/button_send_flag
    A->>P: 填充发送数据包
    alt 三标志未全置位 (取数不完整)
        A->>A: mouse_reset_cnt++
        Note over A: 超过阈值则 wdt_clear() + 刷新自动关机定时
    else 数据完整
        A->>L: 按 mouse_info.mouse_hid_mode 选择通道发送
    end
    deactivate A

数据流设计要点:

  • 标志位驱动:mouse_send_flags_t 是取数线程(定时器回调)与发送逻辑之间的"握手协议",避免在传感器尚未就绪时发送空包;三个标志(传感器/滚轮/按键)分别对应数据包的三类内容,保证一次完整上报包含全部增量。
  • 模式路由:mouse_info.mouse_hid_mode(如 HID_MODE_BLE)决定数据包走 BLE 还是 2.4G 通道;双模应用通过 mouse_select_btmode() 在运行时切换该字段。
  • 事件驱动:除定时器轮询外,mouse_optical_sensor_event_handler(struct sys_event *event) 处理传感器上报的系统事件(如按键按下/抬起),确保按键等需要即时响应的数据不依赖轮询周期。

模式切换(双模与低延迟)

双模鼠标的核心价值是一套硬件、多种连接方式。app_mouse_dual.c 声明了两个关键入口:

static void mouse_select_btmode(uint8_t mode);
static void mouse_vm_deal(uint8_t rw_flag);

Source: app_mouse_dual.c

  • mouse_select_btmode(uint8_t mode):运行时切换 BLE / 2.4G(/ USB)模式。切换时需同步处理:BLE 广播/连接状态、mouse_info.mouse_hid_mode 路由字段、回报率定时器周期(133Hz ↔ 1KHz)、LED 指示(led_control.h)。
  • mouse_vm_deal(uint8_t rw_flag):将当前模式写入 VM(掉电保存区),下次上电时恢复到上次使用的模式。这是产品化的关键细节——用户不会希望每次开机都重新配对。

双模的 2.4G 与 USB 通道由 standard_hid.h 与 mouse_usb.c 提供。低延迟应用 app_mouse_low_latency.c 以 2.4G 为主通道,USB 作为可选扩展(源码中 //#include "mouse_usb.h" 被注释):

#include "app_mouse_low_latency.h"
//#include "mouse_usb.h"
#include "gpadc.h"

Source: app_mouse_low_latency.c

设计意图:低延迟应用面向电竞场景,默认只走 2.4G 以获得 1KHz 回报率与最低空中时延;USB 模式被注释掉说明"低延迟优先"的产品定位——BLE 在该场景下会引入不可控的调度时延。而双模应用则是全功能参照,保留所有通道以便开发者按需裁剪。

双模的按键切换逻辑:源码中的 mouse_double_key_long_cnt 与 mouse_switch_key_long_cnt 是两个长按计数器——前者统计"双击/双键组合"的长按时长,后者统计"模式切换键"的长按时长,配合 TCFG_IOKEY_MOUSE_SWITCH_PORT(板级配置的切换键 GPIO)实现长按切换模式。mouse_switch_start_mode 记录上电时的起始模式,用于决定首次切换目标。

低功耗与看门狗协同

鼠标是电池供电设备,低功耗管理贯穿整个应用。核心机制:

static volatile uint8_t mouse_is_active;// 1-临界点,系统不允许进入低功耗,0-系统可以进入低功耗

Source: app_mouse_single.c

  • mouse_is_active 是临界点标志:置 1 时系统不允许进入低功耗(例如正在发送数据、正在处理按键),置 0 时允许进入低功耗。它通过 app_power_mg.h 与系统电源管理联动,保证"活跃—休眠"切换不打断数据传输。
  • 自动关机:TCFG_HID_AUTO_SHUTDOWN_TIME 配置自动关机时间(秒)。mouse_auto_shutdown_disable() 删除自动关机定时器(用户操作时调用);sys_timer_modify(mouse_info.mouse_auto_shutdown_timer, TCFG_HID_AUTO_SHUTDOWN_TIME * 1000) 在取数异常时刷新计时,避免误关机。
  • 看门狗与低功耗的权衡:正常休眠时看门狗由系统管理;应用层只在"定时器仍在运行但传感器无数据"的场景喂狗——这正是 mouse_reset_cnt 存在的意义:区分"真异常"与"短暂无数据"。

状态转换关系:

stateDiagram-v2
    [*] --> 运行: 上电/VM恢复模式
    运行 --> 取数: 回报率定时器
    取数 --> 发送: 三标志全置位
    取数 --> 计数: 标志未全置位
    计数 --> 喂狗: 超过阈值
    喂狗 --> 取数
    运行 --> 空闲: 无操作超时
    空闲 --> 低功耗: mouse_is_active=0
    低功耗 --> 运行: 传感器/按键事件唤醒
    运行 --> 关机: TCFG_HID_AUTO_SHUTDOWN_TIME 到期

低延迟应用在节拍上更激进(1KHz 定时器),因此 mouse_is_active 临界点的管理频率也更高——每次定时器回调都需要快速判定是否放行低功耗,这解释了为何该字段声明为 volatile:它在中断上下文与主循环之间共享。

配置选项

配置项类型默认值说明
CONFIG_APP_MOUSE_SINGLE编译宏0/1使能单模 BLE 鼠标应用(133Hz 回报率)
CONFIG_APP_MOUSE_DUAL编译宏0/1使能双模鼠标应用(BLE + 2.4G + 可选 USB)
CONFIG_APP_MOUSE_LOW_LATENCY编译宏0/1使能低延迟鼠标应用(2.4G 1KHz + 可选 USB)
TCFG_OMSENSOR_ENABLE编译宏—使能光学鼠标传感器驱动(OMSensor_manage)
TEST_MOUSE_SIMULATION_ENABLE编译宏—使能模拟发数(mouse_send_data_test()),用于无传感器调试
TCFG_HID_AUTO_SHUTDOWN_TIME常量—自动关机时间(秒),0 关闭自动关机
TCFG_IOKEY_MOUSE_SWITCH_PORT常量—双模模式切换键 GPIO 端口(mouse_dual 特有)
MOUSE_CPI_1000枚举mouse_cpi_mode 初值默认 CPI(灵敏度)档位
MOUSE_7MS_CLEAR_WDT_CNT_MAX常量—BLE 模式看门狗计数阈值(约 7ms 节拍)
MOUSE_1MS_CLEAR_WDT_CNT_MAX常量—2.4G 模式看门狗计数阈值(约 1ms 节拍)
BLE_APPEARANCE_HID_MOUSE常量—BLE 广播 appearance 声明为 HID 鼠标
mouse_ble_name字符串见各应用BLE 广播名(AW31N_MOUSE_SINGLE / AW31N_MOUSE_DUAL / LOW_LATENCY)

板级配置示例文件:

  • board_aw313a_mouse_cfg.h — 双模/低延迟板级配置(AW313A 芯片)
  • board_aw313a_mouse_single_cfg.h — 单模板级配置
  • board_aw313a_mouse_global_build_cfg.h — 双模全局编译配置
  • board_aw313a_mouse_single_global_build_cfg.h — 单模全局编译配置

这些板级文件同时包含引脚复用(传感器 SPI、切换键 GPIO、LED)、时钟与低功耗参数,是产品化移植的首要修改点。

API 参考

以下为鼠标应用层对外暴露或内部核心的接口(三个应用签名一致,行为随模式略有差异):

void mouse_auto_shutdown_disable(void)

删除自动关机定时器。当检测到用户活动(按键、移动)时调用,避免活动期间被自动关机打断。

参数: 无

返回: 无

说明: 内部检查 mouse_info.mouse_auto_shutdown_timer 非空后调用 sys_timeout_del()。该函数非 static,是应用模块对外导出的接口之一。

Source: app_mouse_single.c

static void mouse_data_send(void *priv_hw, uint8_t hw_state, bool is_24g)

回报率定时器回调,负责取数、完整性检查、看门狗喂狗与(内部)数据发送。

参数:

  • priv_hw (void*):定时器私有句柄
  • hw_state (uint8_t):硬件状态(如传感器状态位)
  • is_24g (bool):是否为 2.4G 模式,双模/低延迟用于选择看门狗阈值

返回: 无

注意: 在定时器中断/回调上下文执行,内部不得有阻塞调用。

static void mouse_select_btmode(uint8_t mode)(双模/低延迟)

切换 BLE/2.4G 传输模式,同步更新 mouse_info.mouse_hid_mode 与回报率节拍。

static void mouse_vm_deal(uint8_t rw_flag)(双模/低延迟)

VM 读写处理:rw_flag 区分读/写,将当前模式持久化到 VM,上电恢复。

static void mouse_optical_sensor_event_handler(struct sys_event *event)

光学传感器系统事件处理(按键按下/抬起等即时事件),与定时器取数互补。

static void mouse_send_data_test(void)

模拟发数函数,TEST_MOUSE_SIMULATION_ENABLE 使能时替代真实传感器取数,用于无硬件调试。

核心数据结构

结构体职责关键字段
mouse_info_t鼠标全局状态mouse_hid_mode(BLE/2.4G)、mouse_auto_shutdown_timer 等
mouse_send_flags_t取数完成标志sensor_send_flag、wheel_send_flag、button_send_flag
mouse_packet_data_t发送数据包位移/滚轮/按键增量数据
ble_init_cfg_tBLE 初始化配置same_address、appearance、report_map、report_map_size

故障模式、边界情况与并发

传感器链路异常

  • 症状:mouse_flag 三标志长期未全置位,mouse_reset_cnt 持续增长。
  • 处理:超过 MOUSE_7MS_CLEAR_WDT_CNT_MAX / MOUSE_1MS_CLEAR_WDT_CNT_MAX 后主动 wdt_clear() 并刷新自动关机定时,避免看门狗复位与误关机,同时等待传感器自恢复。
  • 边界:MOUSE_7MS_CLEAR_WDT_CNT_MAX 与 7ms 节拍的乘积应小于看门狗超时时间,否则"喂狗太晚";反之过小会掩盖真实死锁。低延迟应用按模式区分阈值正是为了维持这一比例。

中断与主循环并发

  • mouse_is_active、mouse_reset_cnt 等变量被定时器回调(中断上下文)与应用主逻辑共享,声明为 volatile 防止编译器优化导致读失效。
  • 发送数据包 mouse_send_packet 在取数与发送之间无锁共享:设计上保证取数与发送在同一回调内顺序完成(读后即发),避免跨上下文竞争;扩展时不应将取数移入独立任务而不加同步。

模式切换竞态

双模切换时 mouse_select_btmode() 修改 mouse_hid_mode,若此时定时器回调正在取数,可能发送到旧通道。源码通过切换函数内部同步处理(先停定时器/等待回调退出,再切通道,最后重启定时器)规避——扩展时需保持这一顺序。

自动关机边界

  • TCFG_HID_AUTO_SHUTDOWN_TIME 为 0 时编译期关闭自动关机(#if (TCFG_HID_AUTO_SHUTDOWN_TIME) 条件编译),适合演示板常开。
  • 取数异常路径调用 sys_timer_modify 刷新关机时间,保证"设备活着但传感器没数据"时不会误关机。

广播名与多设备

三个应用的 mouse_ble_name 不同(AW31N_MOUSE_SINGLE / AW31N_MOUSE_DUAL / LOW_LATENCY),避免同一区域内多种鼠标同时广播时的配对混淆;same_address = 0 保证每台设备独立地址,防止多设备地址冲突。

性能与运维

回报率与功耗的权衡

  • BLE 133Hz(约 7.5ms 周期):连接事件间隔与功耗平衡,适合办公场景。
  • 2.4G 1KHz(1ms 周期):定时器中断与空中包速率提高 7.5 倍,延迟更低但功耗显著上升,适合电竞场景。
  • 双模应用在同一固件中同时支持两套节拍,通过 mouse_hid_mode 运行时选择——这要求 gptimer 周期可动态调整(gptimer.h 提供),且低功耗策略(mouse_is_active)必须与节拍匹配。

功耗优化线索

  • mouse_is_active 临界点机制允许系统在无操作时快速进入低功耗,但 1KHz 模式下中断频繁,需确认 app_power_mg.h 的低功耗窗口与 1ms 节拍兼容,否则可能因频繁唤醒而无法真正休眠。
  • 传感器在空闲时可考虑降低采样频率(OMSensor_manage 提供的寄存器配置),应用层未实现时需自行扩展。

调试手段

  • TEST_MOUSE_SIMULATION_ENABLE:无传感器调试,用 mouse_send_data_test() 产生模拟数据,验证无线链路与主机枚举。
  • 日志分级:三个应用均使能 LOG_TAG_CONST MOUSE、LOG_ERROR_ENABLE、LOG_DEBUG_ENABLE、LOG_INFO_ENABLE,日志开关在 apps/demo/hid/config/log_config.c 中按 tag 配置(log_tag_const_e_MOUSE、log_tag_const_d_MOUSE 等)。
  • 编译期裁剪:lib_driver_config.c 中 lib_gptimer_timer_mode_en 按应用宏联动,避免未使用的外设时钟空耗。

扩展点

  1. 新增传输通道:参照双模 mouse_usb.c 与 standard_hid.h 的接入方式,在 mouse_data_send() 中按 mouse_hid_mode 增加路由分支;低延迟应用需取消 //#include "mouse_usb.h" 注释并接入 USB 初始化。
  2. 自定义 CPI 档位:修改 mouse_cpi_mode 默认值(当前为 MOUSE_CPI_1000)并在按键处理中增加循环切换逻辑,通过 OMSensor_manage 接口写传感器寄存器。
  3. 多功能按键:mouse_double_key_long_cnt / mouse_switch_key_long_cnt 双计数器模式可扩展出"单击/双击/长按"三态识别,新功能按键照此模式添加。
  4. 多连接(多 BLE 从机):mouse_ble_config.same_address = 0 已为多地址场景预留,可结合 ble_hogp 的多个连接槽位扩展一拖二/一拖三。
  5. OTA 与电量上报:HID 鼠标通常通过 HID 报文透传自定义数据,可复用 mouse_packet_data_t 扩展字段或新增 report ID。

测试覆盖

仓库中鼠标应用以参考 demo形式提供(apps/demo/hid/examples/),测试方式以板级验证为主:

  • 模拟模式测试:TEST_MOUSE_SIMULATION_ENABLE 使能后可在无传感器情况下验证 BLE 枚举、report 发送与主机端指针移动。
  • 双模切换测试:验证 BLE ↔ 2.4G 切换后主机重连、模式掉电保存(mouse_vm_deal)恢复。
  • 低功耗测试:验证 mouse_is_active 临界点下系统休眠/唤醒无数据丢失。
  • 看门狗测试:断开传感器模拟异常,确认设备不复位、自动关机不误触发。

patch 目录中的 AW31N_sdk_v1.1.0_update_patch 包含 app_mouse_dual.c、app_mouse_single.c 的修复版本(见 patch_release/AW31N_开机&低功耗&VM兼容性修复说明_20250102/),涉及开机、低功耗与 VM 兼容性修复,产品开发时应以 patch 后版本为基线。

Related Links

  • HID demo 应用框架(app_main.c) — 应用注册与启动选择
  • 单模鼠标应用 app_mouse_single.c
  • 双模鼠标应用 app_mouse_dual.c
  • 低延迟鼠标应用 app_mouse_low_latency.c
  • 双模 USB 模式 mouse_usb.c
  • 通用 USB HID 鼠标设备 hid_mouse.c
  • 双模板级配置 board_aw313a_mouse_cfg.h
  • 单模板级配置 board_aw313a_mouse_single_cfg.h
  • 驱动配置 lib_driver_config.c

对于 BLE HID Profile 细节,参见 BLE HOGP 相关文档;对于 2.4G 私有协议与 USB HID 类协议,参见对应协议章节(本页不展开)。

Prev
键盘、翻页器与遥控应用
Next
空闲应用与初始化流程