HiSpark编程指南

- 调测资料
  - SDK Sample使用指南
    - 前言
    - 概述
    - Sample框架
    - 外设 Sample
    - SLE UART Sample
    - SLE UART DMA Sample
    - SLE Mouse Sample
    - SLE amic vdt with dongle
    - SLE microphone
    - SLE measure dis
    - BLE Lowpower Sample
    - BLE UART Sample
    - BLE Keyboard Sample
    - BLE SLE TAG Sample
    - BLE Mouse Sample
    - USB Keyboard Sample
    - USB Mouse Sample
    - USB AMIC VDT Sample
    - RCU
    - 多连接
    - air mouse
    - SLE MOUSE with Dongle
    - SLE OTA dongle
    - game mouse
    - BLE UUID
    - 缩略语
  - SDK二次开发网络安全注意事项
    - 前言
    - 产品安全解决方案
    - 结论
  - SDK开发环境搭建用户指南
    - 前言
    - 开发环境搭建
    - 编译SDK
    - 新建APP
  - 内存维测指导书
    - 前言
    - 简介
    - 内存维测功能
  - 射频AT测试指南
    - 前言
    - 射频测试AT指令
    - AT指令组包示例
    - 注意事项
  - 维测指导书
    - 前言
    - 概述
    - 日志说明
    - 日志分析
    - 问题定位
    - 典型案例
    - 常见问题FAQ
- 软件资料
  - AT命令使用指南
    - 前言
    - 指令说明
    - 通用AT指令
    - BT业务AT指令
    - 新增AT指令方法
  - DFU升级APK开发指南
    - 前言
    - 功能特性
    - 系统框架
    - 工程文件部署
    - 界面实现
    - 升级界面Fragment实现
    - 关于界面Fragment实现
    - 应用清单AndroidManifest
  - DFX软件开发指南
    - 前言
    - DIAG维测功能
    - 死机诊断
    - Dump解析
  - EFUSE使用指南
    - 前言
    - 概述
    - 使用软件接口读写EFUSE
    - 使用BurnTool烧写EFUSE
  - NFC TAG软件开发指导书
    - 前言
    - 概述
    - 开发指导
  - NV存储用户指南
    - 前言
    - NV简介
    - NV编译预置
    - NV API指南
    - 定制化NV结构使用介绍
    - 通过NV自定义传输数据最大长度
  - Release notes
    - 1.0.18版本描述文件
    - 1.0.17版本描述文件
    - 1.0.16版本描述文件
  - SDK开发指南
    - 前言
    - 概述
    - 系统接口
  - SDK接口变更说明书
    - 前言
    - BLE SDK接口变更说明
  - SP31 SLP使用指南
    - 开源版本
  - USB HID复合设备开发指南
    - 前言
    - 概述
    - 实现方式
  - 代码框架说明
    - 前言
    - SDK模块框架
    - SDK目录结构
    - SDK目录说明
  - 低功耗FAQ
    - 前言
    - 系统无法睡眠
    - IO无法唤醒系统
    - 唤醒后外设异常
    - 低功耗导致OTA升级异常
    - 功耗比预期高
    - 锁中断导致BT业务阻塞
    - 概率性狗超时
    - 供电模式&软件配置
    - 提前唤醒时间问题
  - 低功耗sample使用指南
    - 前言
    - 编译&测试
    - 系统状态管理
    - 用户指南
  - 低功耗开发指南
    - 前言
    - 低功耗概述
    - 低功耗方案
    - 开发指引
    - 功耗优化
    - 常见问题
  - 功率配置说明书
    - 前言
    - 射频功率配置说明
  - 升级方案使用指南
    - 前言
    - 概述
    - 升级包制作
    - 升级包传输
    - 升级包保存
    - 升级包本地升级
    - FAQ
  - 快速入门指南
    - 前言
    - 文档目录
    - 环境搭建
    - 基础功能开发
    - 调优
    - 特性开发
    - 测试报告
  - 星闪应用层SLE-Link协议
    - 前言
    - 概述
    - SLE Frame格式定义
    - 服务接口定义
    - 交互流程示例
  - 星闪软件开发指导书
    - 前言
    - 概述
    - Device Discovery接口
    - Connection Manager接口
    - SSAP Server接口
    - SSAP client接口
    - Low Latency接口
    - Transmission Manager接口
    - SLE Passkey接口
    - SLE Channel Map 接口
  - 红外学习使用指南
    - 前言
    - 红外学习方式
    - 通过比较器进行红外学习
    - 使用指南
  - 蓝牙软件开发指导书
    - 前言
    - 概述
    - GAP接口
    - GATT server接口
    - GATT client接口
  - 设备驱动开发指南
    - 前言
    - Pinctrl
    - GPIO
    - UART
    - SPI
    - I2C
    - ADC
    - DMA
    - PWM
    - WDT
    - Timer
    - Systick
    - TCXO
    - Flash
    - SFC
    - QDEC
    - KEYSCAN
    - PDM
    - USB_HID
    - USB_DFU
    - I2S
    - TRNG
    - 附：MIDDLEWARE
  - 音频编解码开发指导书
    - 前言
    - 概述
    - Audio Encoder
    - Audio Decoder
    - 调试与功能
- 工具资料
  - BurnTool工具使用指导书
    - 前言
    - BurnTool工具简介
    - 操作指南
    - FAQ
  - HiSpark Studio使用指南
    - 前言
    - 工具简介
    - 开发环境搭建
    - 工程管理
    - 工程配置
    - 编译运行
    - 软件包烧录
    - 栈分析和镜像分析
    - 工程调试
    - 串口控制台工具
    - Kconfig配置
    - GUI工程创建与使用
    - 高阶分析功能使用
    - 常见错误

### 该页内容

- 前言
- 系统无法睡眠
- IO无法唤醒系统
- 唤醒后外设异常
- 低功耗导致OTA升级异常
- 功耗比预期高
- 锁中断导致BT业务阻塞
- 概率性狗超时
- 供电模式&软件配置
- 提前唤醒时间问题

# 前言

概述

本文档详细的描述了BS2XV100低功耗调测时可能遇到的问题，并根据经验提供了问题解决的方法，用户调测低功耗时遇到问题可以进行参考。

读者对象

本文档主要适用于以下工程师：

- 技术支持工程师

- 软件开发工程师

符号约定

在本文中可能出现下列标志，它们所代表的含义如下。

符号 | 说明
--- | ---
| 表示如不避免则将会导致死亡或严重伤害的具有高等级风险的危害。
| 表示如不避免则可能导致死亡或严重伤害的具有中等级风险的危害。
| 表示如不避免则可能导致轻微或中度伤害的具有低等级风险的危害。
| 用于传递设备或环境安全警示信息。如不避免则可能会导致设备损坏、数据丢失、设备性能降低或其它不可预知的结果。 “须知”不涉及人身伤害。
| 对正文中重点信息的补充说明。 “说明”不是安全警示信息，不涉及人身、设备及环境伤害信息。

修改记录

文档版本 | 发布日期 | 修改说明
--- | --- | ---
04 | 2025-03-26 | 更新“IO无法唤醒系统”章节内容。
03 | 2024-08-29 | 更新“低功耗导致OTA升级异常”章节内容。 新增“提前唤醒时间问题”章节内容。
02 | 2024-07-04 | 更新“系统无法睡眠”章节内容。 更新“IO无法唤醒系统”章节内容。
01 | 2024-05-24 | 第一次正式版本发布。 更新“功耗比预期高”章节内容。 新增“供电模式&软件配置”章节内容。
00B02 | 2024-04-12 | 更新“系统无法睡眠”章节内容。
00B01 | 2024-03-01 | 第一次临时版本发布。

# 系统无法睡眠

参考《BS2XV100 低功耗 开发指南》，BS2X想要进入睡眠需满足两个条件，即“不存在睡眠投票”和“系统空闲时间足够”。

图 1 睡眠条件

- 睡眠否决票

  1. 投票总数：uapi_pm_add_sleep_veto添加的投票，需使用uapi_pm_remove_sleep_veto移除。

  2. 超时投票：uapi_pm_add_sleep_veto_with_timeout投了不允许睡眠的时间。

  3. 客制化投票：pm_port_get_customized_sleep_veto。

  以上投票，有一个存在则无法满足睡眠条件。票型信息可通过uapi_pm_veto_get_info获取查看，通过查看veto_counts成员即可查看当前投票箱状态。

- 系统空闲时间

  系统空闲时间受LiteOS管理，在睡眠投票满足时，睡眠管理接口中会判断睡眠时间是否满足深睡阈值，满足即进到深睡流程。

根据上述睡眠条件介绍，下面将举例一些原因：

1. 定时器不合理（定时器时间小于睡眠阈值）

   - 举例：启动10ms周期定时器。

   - 分析：系统在入睡前会检查是否有定时器即将到期，如果定时器即将到期，系统则不允许进入睡眠模式。

   - 建议：根据实际业务启动定时器，业务控制进睡眠前将定时器合理关闭。

2. 任务不合理

   - 举例：任务体中循环操作，使用osal_msleep让出CPU时间过短，或者信号量/事件/消息等频繁触发。

   - 分析：系统在入睡前会检查任务阻塞时间，任务让出时间太短也会导致系统无法睡眠。

   - 建议：任务应当合理设置阻塞时间，如果不同场景需阻塞的时间不一样，也可以通过判断设置不同的阻塞时间；或者在睡眠前将任务挂起，唤醒的时候再恢复。

3. 投票接口使用不合理

   - 举例：投票接口未成对使用。

   - 分析：系统在睡眠前会检查睡眠否决状态，只要存在否决票，则系统就无法睡眠。

   - 建议：严格检查是否成对使用，并保证否决睡眠的时间尽量短，以保证系统能睡眠更多。

4. 日志打印不合理

   - 举例：在判断睡眠投票前添加了打印。

   - 分析：客制化睡眠投票接口（pm_port_get_customized_sleep_veto）有判断UART TX是否有数据，如果TX还有数据，则投否决票。

   - 建议：减少日志打印，避免在睡眠流程中添加不合理的维测。

5. 蓝牙参数设置不合理

   - 举例：BT连接参数配置问题，如interval配置过短。

   - 分析：interval配置过短会导致系统无法进睡眠或者睡眠后马上被唤醒。

   - 建议：合理设置BT连接参数，或者抓取数据包看BT数据包间隔，一般地，间隔太短无法睡眠。

6. 异常中断频来

   - 举例：某GPIO管脚由于配置或硬件问题导致中断频来。如：gpio17管脚，无法在系统深睡过程中保持上拉；gpio9和gpio10有时候会受nfc影响导致波形频繁发生变化。

   - 分析：中断频来，一来会导致中断处理大量CPU时间导致空闲时间少，二来中断到来时会上报给CPU进而打断WFI流程。

   - 建议：可以通过《BS21V100 低功耗 开发指南》中介绍的维测方法排查。

> 说明： “系统无法睡眠”有时并非“未睡眠”，有可能是“频唤醒”，需合理利用维测分析。 业务开发用户应当对整个系统运行非常熟悉，熟悉之后不仅利于问题定位，更有利于写出更优的软件代码，进而降低功耗。

# IO无法唤醒系统

1. 硬件上该IO管脚确实没有触发相应的中断脉冲。

   - 举例：鼠标睡眠后，按键可以唤醒，但移动无法唤醒。

   - 解释：鼠标移动时会拉低motion管脚，sensor数据读取完毕会拉高motion管脚。一般睡眠前会注册motion管脚的下降沿中断，如果睡眠前motion数据未被读走，那么睡眠后再移动鼠标，motion管脚也不会来下降沿波形的，进而无法产生GPIO中断，那么系统便不能唤醒。

   - 分析：通过抓取硬件波形，辅助软件进行分析。

2. 中断注册时脉冲/电平参数设置不合理。

3. ulp_gpio接口未初始化或者ulp_gpio中断设置错误。

4. IO管脚没有在睡眠前配置配置为gpio模式。

   - 解释：由于系统睡眠前会将所有gpio管脚信息刷到pad_out_en和pad_out寄存器中，之前保存的其他管脚模式的信息会被覆盖掉，故而对应的管脚无法在深睡中正常工作。

   - 分析：通过管脚波形，再读取0x5702c820 ~ 0x5702c82c寄存器查看IO管脚模式是否被覆盖掉。

   - 方案：在功能对应的suspend函数中通过uapi_pin_set_mode()将管脚配置为gpio模式。

   - 补充说明：

     BS2XV100睡眠时，uapi_gpio下电，所以通过uapi_gpio接口注册的中断无法唤醒系统，需要切换到ulp_gpio注册中断唤醒系统。

     ulp_gpio和io管脚并非一一对应的关系，ulp_gpio只有8个。

     低功耗sample中有ulp_gpio使用方法的示例如下。

         static ulp_gpio_int_wkup_cfg_t g_pm_wk_cfg[] = {
             { 0, PM_SAMPLE_GPIO_NUM, true, ULP_GPIO_INTERRUPT_FALLING_EDGE, pm_ulpgpio_wkup_handler },    // ulpgpio唤醒
         };
         static void pm_gpio_slp_cfg(void)
         {
             uapi_gpio_deinit();
             ulp_gpio_init();
             ulp_gpio_int_wkup_config(g_pm_wk_cfg, sizeof(g_pm_wk_cfg) / sizeof(ulp_gpio_int_wkup_cfg_t));
         }

# 唤醒后外设异常

1. 唤醒后外设未恢复。

   > 说明： 睡眠时CPU和绝大多数外设是下电的，唤醒后SDK只恢复了CPU和部分必要外设（tcxo、sfc、uart等）。 所以由用户初始化的外设，如spi、qdec、adc、pwm等，在唤醒后及使用之前应当由用户自行恢复，外设恢复都需要时间，SDK中无法在每次唤醒后都对这些外设进行恢复，这会增加保连功耗。

2. 唤醒后访问外设异常。

   - 举例：唤醒后读取spi数据时挂死。

   - 分析：唤醒流程可能用时较长，如果spi尚未恢复就调用spi读取数据接口时，那么这一操作必然导致系统异常。

   - 建议：关于低功耗的很多问题，往往是业务状态机管理问题，业务代码设计合理，自然能避免这些稳定性问题。

# 低功耗导致OTA升级异常

1. OTA升级一半时系统睡眠。

   这是系统状态机管理问题，OTA升级时应当保证系统状态不被动发生切换，应当设计出合理的代码主动消灭这一可能性。

2. 系统非工作状态触发了OTA升级。

   OTA升级前需确保当前状态是工作状态，如非工作状态需要将系统切换到工作状态。

3. 唤醒后OTA升级失败。

   - OTA升级如果会用到外置Flash，请确保升级前外设Flash有正常恢复。

# 功耗比预期高

1. 芯片功耗正常，整机功耗高。

   - Sensor工作异常，reset管脚配置不合理会导致sensor进不了低功耗状态，请确保reset管脚在睡眠时保持正常电平。

   - 外设Flash工作异常，spi_cs管脚拉低会让Flash认为处于工作态，请确保该管脚电流保持拉高。

   - IO电平设置不合理导致板级向芯片漏电：如板级高电平，芯片管脚配置成输入拉低。

     睡眠状态下IO配置：

     - 若管脚有外接上拉电阻，该管脚需配置为浮空。

     - 管脚有外接下拉电阻，该管脚可配置为下拉。

     - 其余情况，该管脚配置为下拉。

2. 芯片工作电流高于预期。

   - 主频设置成64M，导致功耗增加。

   - 热点函数放在Flash中执行，导致CPU WFI占空比低。

   - 一直来异常中断，导致CPU无法空闲。

   - 部分不需要常开外设使用后未及时关闭。

   - BLE和SLE都同时打开。

   - 部分IO配置不合理导致漏电。

   - 日志太多导致CPU空闲时间少。

   - 有不合理的业务经常工作。

3. 芯片睡眠电流高于预期。

   - 部分IO配置不合理导致漏电。

   - 有周期性任务或者定时器导致系统经常唤醒。

   - BT连接参数设置不合理，保连周期短，系统唤醒频繁。

   - 每次唤醒后打印太多日志导致唤醒后工作时间长。

# 锁中断导致BT业务阻塞

唤醒恢复锁中断时间太长：

- 操作时间太长的流程不适合一味的加锁中断，锁中断时BT业务无法及时响应很容易有稳定性问题。

- 做好业务统筹管理，恢复时完全无必要通过过长的锁中断去规避系统管理问题。

# 概率性狗超时

唤醒恢复期间狗超时：

如果恢复流程较长，建议恢复之前先喂狗。

# 供电模式&软件配置

芯片支持BUCK和LDO两种模式供电，默认SDK版本为BUCK模式，使用LDO模式时需打开宏（CONFIG_POWER_SUPPLY_BY_LDO），配置如下：

# 提前唤醒时间问题

系统睡眠时为保证BT在固定的时间窗口进行TRX，需要在BT业务中断来之前提前将系统唤醒，系统唤醒后进行软硬件恢复，软件会配置预留此恢复时间。

如果在某些软件版本中由于一些链接脚本修改导致软件处理变慢，下面这个时间可能不够，会出现蓝牙丢业务中断进而导致睡眠唤醒异常。如果不带蓝牙业务时睡眠正常，带蓝牙业务时也已正常调大interval/latency，系统无法睡眠，并且蓝牙业务异常，大概率是此时间不够，需要适当增加以解决该问题。