当前文档版本为 v1.0.2,您可以访问当前页面的 开发中 版本以获取最近可能的更新。

Solution: Multimode Mouse 4k

重要

此例程仅存在于特殊版本的SDK中,如有需要请联系Panchip。

1 功能概述

此sample为pan108xxb5(64pin芯片)或者pan108xxa3(48pin芯片)在实体鼠标板下的应用

基于1k鼠标,4k鼠标提高了TRX转换时间,去除了部分线程操作等延时操作,应用层使用高速的底层接口以加快收发包速度,并对payload长度有一定限制

需要配合4k Dongle使用,4K Dongle端包含了一颗高速USB芯片(CH32V30x)

具体支持的feature如下:

  • 通用功能:

    1. 光电传感:通过sensor进行鼠标基础坐标获取,可以通过dpi按键进行切换Sensor DPI切换(PAW3325 400(红)-800(蓝)-1600(绿)-3200(紫)-4800(橙))

    2. QDEC滚轮模块:支持去抖的正交解码器,反馈鼠标滚轮变化情况

    3. 按键模块:

      a. 基础按键左中右侧边按键key 4 5,底部按键 rpt dpi

      b. rpt按键在usb和2.4G模式下,第一下按键显示当前上报率,3s内第二次按下切换上报率(4000(橙)-2000(紫)-100(绿)-500(蓝)-125(红)),在BLE模式下,按一下切换不同dev

    4. LED模块:

      1. 包括顶部rgb灯及底部两个rgb灯,顶部显示状态

      2. 2.4G未对码/强制对码快闪白灯,已存储配对信息慢闪白灯,已连接呼吸灯白色

      3. USB模式显示蓝灯

      4. BLE模式根据不同设备显示 紫 绿 蓝色配对快闪灯或者连接呼吸灯

      5. 底部按键关闭,USB连接电源充电时,充电时红灯慢闪,充满后显示彩虹灯

      6. 无线模式下,电量低于3.6V时红灯慢闪

    5. 电量检测:ADC采集电量信息

    6. 供电及模式切换:

      ​ a. 电池供电:底部按键可以切换2.4G模式与蓝牙模式,开关拨到中间中间为断电状态,USB接入PC时为优先级最高的USB模式

      ​ b. USB仅供电:底部按键可以切换2.4G模式与蓝牙模式,中间为保电状态

      ​ c. USB插入PC:USB接入PC时为优先级最高的USB模式

    7. 休眠逻辑:休眠逻辑参考6.1章节说明

  • 2.4G模式(PRF增强型模式)

    1. 跳频:在信号质量不好(连续FREQ_HOP_NOACK_THREHOLD=30个ack未收到)/对码前在8个频点进行跳频

    2. 对码:上电跳频找到dongle端的频点后,通信互发对端的MAC地址后2字节,之后切换到私有地址进行通信

    3. 重传:丢包时会进行重传,以最快速度进行重传直到收到对端回复

    4. ACK:可解析的ACK,具有演示代码,CH32收到bus hound发送的首字节为0x5a的包进行打印

    5. 4k性能:默认上报率4000的情况下,近距离稳定在3900包以上,6米稳定在3800包以上

    6. 测试模式(可选)(组合键):自动画圈;关闭PWM灯测试功耗;ACK测试

  • BLE模式

    1. 蓝牙白名单(未用),切换不同设备

    2. 配对,保存

    3. 连接,重连功能

    4. OTA(未使能):与mcuboot配合通过NRF工具进行升级

    5. 性能:133HZ上报率

    6. 性能:兼容性

  • USB模式

    1. 性能:USB2.0最高速率1000hz

    2. 电脑的休眠唤醒

    3. 升级:与mcuboot配合通过USB工具进行升级

  • EMI测试

2 环境要求

  • board: pan108xxa3(芯片型号)4k鼠标板

  • uart (option): overlay中默认P24显示串口log

  • USB升级工具(USB升级工具获取:https://docs.panchip.com/pan1080dk-doc/latest/docs-zdk/06_dev_tools/pan108x_toolbox_intro.html)

  • 4K鼠标测试工具:05_TOOLS\dev-tools\MouseSupportTool\Polling Rate Tester App_v1.02.00.exe

3 编译和烧录

例程位置:zephyr\samples_panchip\solutions\multimode_mouse_4K

使用 ZAL 工具可以对其进行编译、烧录、打开 VS Code 调试等操作。关于 ZAL 工具的详细介绍请参考:Zephyr APP Launcher 工具介绍

4 演示说明

芯片全部擦除还原默认状态,准备好烧录multimode_mouse_dongle_4K的接收器

4.1 电池供电模式

  1. 电池上电,鼠标端默认中键关闭状态

  2. 鼠标端开关拨到左边为2.4G模式,白色灯快闪,插入接收器至PC,白色灯变为白色呼吸灯,可以测试鼠标基础功能,最大上报率近距离达到4000,远距离6m达到3800+,通过按DPI键切换DPI,通过RPT键切换上报率

  3. 鼠标端开关拨到右边为蓝牙模式,通过RPT键切换dev ID,根据dev ID显示紫/绿/浅蓝灯效,可以在开启蓝牙的PC端搜索到名为Pan_Mouse00/01/02的蓝牙设备,连接后进行控制,最大可以达到133hz左右

  4. 拔出dongle,鼠标端通过拨动模式切换键再次进入2.4G模式,白色灯慢闪,插入dongle变为呼吸灯,鼠标功能恢复

  5. 鼠标端通过拨动模式切换键再次进入BLE模式,等待蓝牙重新连接至PC,鼠标功能恢复

  6. 不拔出dongle,鼠标端再次通过拨动模式切换键进入2.4G模式,白色灯慢闪,随后变为呼吸灯,鼠标功能恢复

  7. 长按左中右3键1s,白色灯快闪,进入强制对码模式,此时重新复位dongle,鼠标对码成功呼吸灯启动,鼠标功能恢复

4.2 USB仅供电模式

​ USB供电与鼠标供电区别在于模式切换键在中间档位不断电,灯的状态暂时未固定,验证非断电模式切换正常即可

​ 模式切换键在中间状态下,插入USB供电,参考电池步骤5.6,测试2.4G与蓝牙下鼠标功能恢复

4.3 USB模式(USB插入PC)

​ 在以上任何情况下(电池供电下任何模式或者关闭/电池未供电),插入USB,鼠标变为USB功能,深蓝色灯效,拔出USB退出到插入之前的状态

​ USB模式下,上报率不支持1000以上,因此1000以上的上报率默认为1000上报率

4.4 测试模式

4.4.1 组合按键测试

按键线程每50ms扫描一次键值

#define KEY_SCAN_INTERVAL_MS                    50

void key_analysis(void)
{
	uint8_t key_value = 0;

	key_get_value(&key_value);
	#if EVB64_TEST
	evb_test_key();
	#endif
	if (mouse_work_mode == mouse_prf_mode) {
		combo_key_detect(key_value);
		unpair_key_detect(key_value);
		report_rate_key_detect(key_value);
	} else if (mouse_work_mode == mouse_usb_mode) {
		combo_key_detect(key_value);
		report_rate_key_detect(key_value);
	} else if (mouse_work_mode == mouse_ble_mode) {
		combo_key_detect(key_value);
		unpair_key_detect(key_value);
		ble_multi_dev_detect(key_value);
	}
	dpi_key_detect(key_value);
	long_press_key_detect(key_value);
}

void thread_key(void *dummy1, void *dummy2, void *dummy3)
{
	printk("T key %d\n", KEY_THREAD_PRIORITY);
	while (1) {
		k_msleep(KEY_SCAN_INTERVAL_MS);
		key_analysis();
	}
}

组合按键说明

按键

检测时间
0代表短按

2.4G模式

USB模式

蓝牙模式

DPI

0

切换传感器灵敏度

切换传感器灵敏度

切换传感器灵敏度

DPI + L

0

Reboot

Reboot

Reboot

DPI + M

0

显示电压

更新USB VID,PID

显示电压

DPI + R

0

擦除配对 + Reboot

擦除配对 + Reboot

L + M + R

3

擦除配对 + Reboot

不重启重新配对

M + R

3

自动画圈

自动画圈

自动画圈

M + L

3

关闭灯效

关闭灯效

关闭灯效

R + 5

3

切换彩虹灯效

空闲进入Deepsleep
会影响灯效

RPT

0

切换上报率4000-2000-1000-500-125

切换上报率1000-500-125

切换蓝牙多设备

4.4.2 ACK回包统计

默认开启了回包打印1s统计,方便记录实际的成功上报率

4.4.3 EMI测试(RF测试模式)

环境要求:

  • PAN1080 鼠标板

  • USB TYPE-C线

  • PAN1080 ToolBox下载

测试说明:

  • TX模式,如下图所示:

    image

    RF TEST TX模式

    发包数必须设为0,当前不支持发包数的设置

  • RX模式,如下图所示:

    image

    RF TEST RX模式

  • TX单载波模式,如下图所示:

    image

    RF TEST 单载波模式

4.5 USB升级(DFU)

USB DFU升级操作可以参考05_TOOLS\DFU工具最新版本的帮助内容内的操作说明,以下说明升级需要注意的点及原理

关于boot的文档可以参考https://docs.panchip.com/pan1080dk-doc/latest/docs-zdk/04_dev_guides/zephyr_bootloader_guidance.html

4.5.1 升级原理

SDK 1.0.2 之前的版本,升级通过App程序区的USB EP3端点进行消息交互,联同上位机进行升级流程,可以升级鼠标和dongle程序,但是需要注意识别过程需要正确写入芯片VID PID扫描到已有设备,为保证升级兼容性,rebuild编译后的工程强烈建议app区和controller区同时升级,并且进行app升级进行controller升级

SDK 1.0.2 包括之后的版本,灵活开放了boot区的编译,并默认提供了一种方式,程序区先写入flash flag确保进入强制升级,未退出强制升级之前,芯片重新上电始终会停留在boot区域,确认好固件正确性后可以退出强制升级

4.5.2 boot编译说明

默认编译的boot固件存放于01_SDK\modules\hal\panchip\panplat\pan1080\bootloader\images,根据不同board选择的不同boot image固件选择逻辑来自01_SDK\modules\hal\panchip\panplat\pan1080\bootloader

因此,客户需要自定义boot或者编译默认强制保护升级方式升级时,需要在ZAL内编译boot之前,开启 CONFIG_MCUBOOT_PAN_USB_DFU=y进行编译,编译后将固件替换至01_SDK\modules\hal\panchip\panplat\pan1080\bootloader\images,然后rebuild鼠标或者dongle工程,此时烧录整个固件会具有强制保护的升级boot

已经准备了适配鼠标的bootdfu固件存放于01_SDK\modules\hal\panchip\panplat\pan1080\bootloader\images\boot_dfu,将此路径下的文件替换上级目录的文件 rebuild鼠标或者dongle程序即可jlink烧录具有保护策略的mcuboot

4.5.3 注意事项

使用具有保护功能的boot时,boot的VID为0x046D,PID为0xC055,usb name 为 boot dfu

  1. 先点击进入强制升级,写入flash flag到boot区,然后芯片自动进行重启,可以工具上重新识别usb设备名称,确认留在boot内

  2. 选择app程序文件进行升级,升级后程序跳转到app程序区

  3. 点击重启芯片再次进入boot区,选择controller程序文件进行升级,升级后程序跳转到app程序区

  4. 确认程序正常运行后,可以点击退出强制升级,擦除boot内的flag使程序可以以后正常启动

PS

​ 程序run在boot区时,点击重启芯片可以跳转到app区域,程序升级正常之前,重新上电即可继续升级正确固件

5 开发说明

5.1 架构说明

multi_model_mouse基于zephyr架构,进行多线程编程,线程静态初始化后,根据优先级进行先后初始化,之后各个线程运行至while(1)等待相应的信号量,以此通过控制信号量控制各个线程的调度关系

架构中应用层主要包含

  • 6个线程

    • 电量检测(包含WDT喂狗)

    • 灯控线程

    • USB发包(根据信号量,取出缓存包发送)

    • 蓝牙线程(监测蓝牙状态)

    • EMI线程(根据emi flag处理定时发包等逻辑)

    • 按键检测(实际产品中可以移除)

  • 3个中断

    • TIMER1中断(1ms刷新灯效)

    • USB中断

    • PRF中断

  • 3个重要接口

    • BLE接口(Zephyr API):FRAME组包后通过调用蓝牙接口进入HOST层进行发包,非阻塞接口,会为ble host填充最多6包数据

      /** @brief Notify attribute value change no wait.
       *
       *  Send notification of attribute value change, if connection is NULL notify
       *  all peer that have notification enabled via CCC otherwise do a direct
       *  notification only the given connection.
       *
       *  The attribute object on the parameters can be the so called Characteristic
       *  Declaration, which is usually declared with BT_GATT_CHARACTERISTIC followed
       *  by BT_GATT_CCC, or the Characteristic Value Declaration which is
       *  automatically created after the Characteristic Declaration when using
       *  BT_GATT_CHARACTERISTIC.
       *
       *  @param conn Connection object.
       *  @param attr Characteristic or Characteristic Value attribute.
       *  @param data Pointer to Attribute data.
       *  @param len Attribute value length.
       *
       *  @return 0 in case of success or negative value in case of error.
       */
      static inline int bt_gatt_notify_no_wait(struct bt_conn *conn,
      				 const struct bt_gatt_attr *attr,
      				 const void *data, uint16_t len)
      
    • USB EP3接口(VENDOR DFU):通过USB中断进入进行DFU升级,EMI测试

      void usb_vendor_ep3_out(void)
      
    • 低功耗接口

      • 应用进入低功耗宏(长时间静止后进入Deepsleep)

        CONFIG_PM_MOUSE=y
        
      • 系统空闲进入Deepsleep宏,注意程序默认开启了CONFIG_PM=y,如果不用系统Deepsleep,需要以下四个宏一起屏蔽,蓝牙模式下生效

        开启 系统空闲进入Deepsleep 模式
        ### open CONFIG_PM ###
        CONFIG_PM=y
        #Clock Source is RCL
        CONFIG_BT_CTLR_SLEEP_CLOCK_SOURCE=1
        #Accuracy is 2000ppm
        CONFIG_BT_CTLR_SLEEP_TIMER_ACCURACY=2000
        #Enable RCL Force CALIBRATION
        CONFIG_SOC_FORCE_CALIB_RCL_CLK=y
        ### open CONFIG_PM ###
        
        关闭 系统空闲进入Deepsleep 模式
        ### not open CONFIG_PM ###
        # CONFIG_PM=y
        # #Clock Source is RCL
        # CONFIG_BT_CTLR_SLEEP_CLOCK_SOURCE=1
        # #Accuracy is 2000ppm
        # CONFIG_BT_CTLR_SLEEP_TIMER_ACCURACY=2000
        # #Enable RCL Force CALIBRATION
        # CONFIG_SOC_FORCE_CALIB_RCL_CLK=y
        ### not open CONFIG_PM ###
        

5.2 线程说明

线程定义方式如下,选用静态线程的方式,由于包含多种reboot操作,实际单模式生效可对其他无用线程进行中止操作,线程之间通过信号量进行切换或者挂起

/**
 * @brief Statically define and initialize a thread.
 *
 * The thread may be scheduled for immediate execution or a delayed start.
 *
 * Thread options are architecture-specific, and can include K_ESSENTIAL,
 * K_FP_REGS, and K_SSE_REGS. Multiple options may be specified by separating
 * them using "|" (the logical OR operator).
 *
 * The ID of the thread can be accessed using:
 *
 * @code extern const k_tid_t <name>; @endcode
 *
 * @param name Name of the thread.
 * @param stack_size Stack size in bytes.
 * @param entry Thread entry function.
 * @param p1 1st entry point parameter.
 * @param p2 2nd entry point parameter.
 * @param p3 3rd entry point parameter.
 * @param prio Thread priority.
 * @param options Thread options.
 * @param delay Scheduling delay (in milliseconds), zero for no delay.
 *
 *
 * @internal It has been observed that the x86 compiler by default aligns
 * these _static_thread_data structures to 32-byte boundaries, thereby
 * wasting space. To work around this, force a 4-byte alignment.
 *
 */
#define K_THREAD_DEFINE(name, stack_size,                                \
			entry, p1, p2, p3,                               \
			prio, options, delay)                            \
	K_THREAD_STACK_DEFINE(_k_thread_stack_##name, stack_size);	 \
	struct k_thread _k_thread_obj_##name;				 \
	STRUCT_SECTION_ITERABLE(_static_thread_data, _k_thread_data_##name) = \
		Z_THREAD_INITIALIZER(&_k_thread_obj_##name,		 \
				    _k_thread_stack_##name, stack_size,  \
				entry, p1, p2, p3, prio, options, delay, \
				NULL, name);				 	 \
	const k_tid_t name = (k_tid_t)&_k_thread_obj_##name

根据线程定义,定义了如下几个线程,并在common.h统一管理线程优先级及栈大小

#define BATTERY_THREAD_PRIORITY                     7
#define BATTERY_THREAD_STACKSIZE                    392

#define FRAME_PACK_THREAD_PRIORITY                  2
#define FRAME_PACK_THREAD_STACKSIZE                 656

#define FREQ_HOP_THREAD_PRIORITY                    2
#define FREQ_HOP_THREAD_STACKSIZE                   480

#define PRF_THREAD_PRIORITY                         1
#define PRF_THREAD_STACKSIZE                        512

#define USB_THREAD_PRIORITY                         2
#define USB_THREAD_STACKSIZE                        376

#define BLE_MONITOR_THREAD_PRIORITY                 3
#define BLE_MONITOR_THREAD_STACKSIZE                432

#define EMI_THREAD_PRIORITY                         2
#define EMI_THREAD_STACKSIZE                        368

#define KEY_THREAD_PRIORITY                         8
#define KEY_THREAD_STACKSIZE                        800

5.2.1 BATTERY线程

电量监测线程,ADC_SCAN_INTERVAL_MS = 100 ms的间隔进行电量采集,并同时进行WDT喂狗,监测到低电量会切换灯效,蓝牙模式会准备电量数据,在不移动鼠标时进行上报

5.2.2 LED线程

灯控线程,通过信号量控制主要灯的状态

5.2.3 USB线程

USB线程,USB插入PC时进入,获取组包并且上报

5.2.4 BLE监测线程

监测蓝牙连接状态并处理进入关灯切换空闲deepsleep并更新latency相关逻辑

5.2.5 EMI线程

通过TIMER0触发EMI测试中发包相关逻辑

5.2.6 KEY线程

按键检测线程,相对独立,实际应用中可以移除

5.3 RF中断说明

5.3.1 RF中断

鼠标端为PRF TX端,增强型模式会在TX后自动转入RX

中断中处理跳频相关逻辑

5.3.2 TIMER中断

TIMER中断产生多线程的控制信号量,并且根据不同上报率切换timer中断间隔

5.4 主要数据结构说明

5.4.1 枚举状态

5.4.1.1 配对状态
enum prf_pair_stat_t {
	prf_pair_start,
	prf_pair_comm,
	prf_pair_addr,
	prf_pair_end,
	prf_paired_private,
	prf_paired_public,
};
5.4.1.2.连接状态
enum ble_connect_stat_t {
	ble_disconnect_stat,
	ble_connect_stat,
};
5.4.1.3 工作模式
enum mouse_work_mode_t {
	mouse_null_mode,
	mouse_usb_mode,
	mouse_prf_mode,
	mouse_ble_mode,
};
5.4.1.4 2.4G RF状态
enum prf_trx_stat_t {
	prf_idle_stat,
	prf_tx_done_stat,
	prf_rx_done_stat,
	prf_rx_timeout_stat,
	prf_rx_crc_err_stat,
	prf_rx_pid_err_stat,
};
5.4.1.5 跳频状态
enum prf_freq_hop_stat_t {
	freq_hop_disconnect_stat,
	freq_hop_connecting_stat,
	freq_hop_done_stat,
};
5.4.1.6 USB状态
enum usb_plug_mode_t {
	usb_plug_in,
	usb_plug_out,
};
5.4.1.7 灯状态
enum mouse_led_stat_t {
	led_unpair_stat,
	led_paired_stat,
	led_low_batt_stat,
	led_prf_connected,
	led_key_stat,
};
5.4.1.8 休眠唤醒低功耗状态
enum mouse_low_power_stat_t {
	active_stat,
	prf_off_stat,
	deep_sleep_v1_stat,
	deep_sleep_v2_stat,
	standby_stat,
};

5.4.2 全局结构

5.4.2.1 组包ring_buf(zephyr)
/**
 * @brief A structure to represent a ring buffer
 */
struct ring_buf {
	uint32_t head;	 /**< Index in buf for the head element */
	uint32_t tail;	 /**< Index in buf for the tail element */
	union ring_buf_misc {
		struct ring_buf_misc_item_mode {
			uint32_t dropped_put_count; /**< Running tally of the
						     * number of failed put
						     * attempts.
						     */
		} item_mode;
		struct ring_buf_misc_byte_mode {
			uint32_t tmp_tail;
			uint32_t tmp_head;
		} byte_mode;
	} misc;
	uint32_t size;   /**< Size of buf in 32-bit chunks */

	union ring_buf_buffer {
		uint32_t *buf32; /**< Memory region for stored entries */
		uint8_t *buf8;
	} buf;
	uint32_t mask;   /**< Modulo mask if size is a power of 2 */

	struct k_spinlock lock;
};
5.4.2.2 传感器结构体
struct sensor_data_t {
	uint8_t motion;
	uint8_t observation;
	uint8_t x_delta_l;
	uint8_t x_delta_h;
	uint8_t y_delta_l;
	uint8_t y_delta_h;
};
5.4.2.3 packet格式结构体

鼠标发送的2.4G帧格式如下

前导码

接入地址

signal

payload

crc

3B

5B

10bit

10B

2B

0x550f71

固定的

增强型的字段

鼠标数据包

16bit crc

其中鼠标Payload为用户可以修改的数据段,Payload 10B格式如下

Type

sequence num

reserved

key

x_value

y_value

roll_value

1B

1B

1B

1B

2B

2B

2B

鼠标包 0x40

己端MAC地址后两个字节

预留位

按键值

传感器x变化量

传感器y变化量

滚轮数据

4k鼠标长时间解析超过2B的ACK情况下不能保证上报率,但支持配合dongle进行固定头为0x5a上报长包ACK,最多测试35B数据的解析测试,长包ACK由dongle端CH32 USB OUT端点获取,鼠标端会打印显示数据

5.4.2.4 收包计数结构体
struct prf_pkt_cnt_t {
	uint32_t tx_cnt;
	uint32_t rx_cnt;
	uint8_t prf_repeat_cnt;
};
5.4.2.5 配对信息结构体
struct pair_ctrl_t {
	enum prf_pair_stat_t prf_pair_stat;
	uint32_t prf_pair_timeout;
	uint8_t pair_own_addr[2];
	uint8_t pair_peer_addr[2];
	bool paired_flag;
};

5.5 主要逻辑图示

5.5.1 鼠标端多线程流程图

5.5.1.1 模式检测及中断、低功耗接口流程图
image

鼠标主框架流程图

5.5.1.2 其他线程流程图
image

其他线程流程图

5.5.2 2.4G对码重传跳频

5.5.2.1 对码逻辑
image

对码逻辑

5.5.2.2 重传逻辑
image

重传逻辑

5.5.2.3 跳频逻辑

跳频基础逻辑同1k鼠标,鼠标端跳频逻辑阈值增加,30包未收到后进行跳频,配合dongle端timeout 10ms逻辑

/* mouse */
#define ACK_HOP_CNT          30
/* dongle */
panchip_prf_rx_timeout(10000); /*rx lost cnt hop 10ms*/
image

跳频逻辑

6 补充说明

补充说明当前功耗测试情况,支持中遇到的问题(供参考)及已知仍可能存在的问题

6.1 功耗说明

功耗测试时,左键加中键长按3s关闭灯效进入关灯测试

磐启目前休眠逻辑

  1. 2.4G:划线停止10s后(10s内功耗3~5mA(不同上报率不同)),进入一级休眠(<200uA)(目前100uA+),10s后进入二级休眠(<60uA);一、二级休眠状态均可随时移动/按键唤醒(2级休眠逻辑上多了LP TIMER唤醒);

  2. BLE:划线停止后(此状态维持30s,关闭灯效情况下,空闲进入deepsleep,interval保持7.5mS,功耗3mA),进入保持蓝牙连接的一级休眠(<200uA)(方便测试目前设置维持30s,目前500uA+,latency 120mS),10min后进入断开蓝牙连接的二级休眠(进入standby,移动可以唤醒,功耗100uA左右); 一、二级休眠状态均可随时移动/按键唤醒;(一级相当于idle deepsleep,二级为standby),二级休眠唤醒后蓝牙自动重连时间低于500ms;

2.4G功耗

| 设备 | LED灯(clk off) | ADC配置 | apb div | 上报率 | 状态1-电流(移动) | 状态2-移动停止500ms后 | 状态3-10s后deepsleep | 状态4-10s后deepsleep | 自动画圈mA |

(mA)

关闭RF (mA)

传感器唤醒,rcl唤醒 (uA)

传感器唤醒 (uA)

鼠标B

OFF

100ms,空闲关闭

4

4000

14.31

4.11

103/109

103/109

13.9

鼠标B

OFF

100ms,空闲关闭

4

2000

11.33

2.23

103/109

103/109

10.79

鼠标B

OFF

100ms,空闲关闭

4

1000

4.48

2.21

103/109

103/109

3.86

鼠标B

OFF

100ms,空闲关闭

4

500

3.51

2.18

103/109

103/109

2.98

鼠标B

OFF

100ms,空闲关闭

4

125

2.8

2.17

103/109

103/109

2.37

蓝牙功耗

| 设备 | LED灯(clk off) | ADC配置 | apb div | 上报率 | 状态1-电流(移动) | 状态2-不移动 (mA) | 状态3-BLE_LED_OFF_S后关灯 | 状态4-BLE_IDLE_SLEEP后断链 uA | 自动画圈mA |

(mA)

持续BLE_LED_OFF_S

idle deepsleep,修改latency(uA)

standby移动按键唤醒 (uA)

鼠标B

OFF

100ms,空闲关闭

4

133

4.43

2.48

384.52

102

3.85

6.2 蓝牙启动时间说明

2.4G和蓝牙启动需要对controller进行初始化,controller初始化时间可以由log观测,目前测试启动时间为66ms

6.3 已知问题

No

已知问题

目前状态

1

休眠模式下切换模式过快需要复位

由于鼠标处于休眠状态,切换模式本应该经过断电状态,但如果切换过快,休眠状态放电不充分,芯片不能完全断电复位,仍处于休眠状态,此时唤醒可以恢复对应模式的正常运行状态

7 RAM/Flash资源使用情况

FLASH部分包含蓝牙controller固定资源120K,不包含初始位置开始的60K MCUBOOT程序

默认开启了调试log(flash占用11K左右),并且需要CONFIG_SPEED_OPTIMIZATIONS=y及中断ramfunc处理,会消耗一定资源

ramfunc可以后续进行一部分裁剪优化(参考1k)

Memory region

Used Size

Region Size

%age Used

FLASH

136268 B

152 KB

87.55%

SRAM

47000 B

50 KB

91.80%