低功耗

1. 基本功能介绍

  • GR5xx芯片支持以下四种功耗模式:

    • Active:CPU处于全速运行状态。MCU子系统(包括ARM处理器、SRAM和外设等)一直处于就绪或工作状态;蓝牙子系统(包括RF收发机、通信内核等)一直处于就绪或工作状态;PMU子系统(包括DC-DC、LDO、RTC等)一直处于工作状态。

    • IDLE:CPU处于空闲状态,未运行任何程序。

    • Sleep:HFXO_32M时钟停止运行,MCU子系统(Retention SRAM除外)与蓝牙子系统均处于断电状态,仅Always-on(AON)模块的电源开启,以保证Retention SRAM中存储的数据不丢失,同时为具有唤醒功能的模块(如Bluetooth LE Timer、Sleep Timer、Real Time Calendar、AON GPIO)供电。

    • Ultra Deep Sleep:一种特殊的Sleep模式。在该模式下,除Always-on(AON)模块的电源开启外,其他模块(包括Retention SRAM)的电源均关闭。通过AON GPIO或Sleep Timer唤醒后,程序将执行冷启动流程。

  • GR5xx低功耗典型值如下(更多详情见对应芯片Datasheet):

SoC Seep Current (μA) Ultra Deep Sleep Current (μA)
GR551x 2.7 (256 KB SRAM retention) 1.8
GR5525 7.3 (256 KB SRAM retention) 5.0
GR5526 3.3 (128 KB SRAM retention) 2.4
GR533x 2.6 (48 KB SRAM retention) 1.9

2. 应用笔记

  • 功耗模式选择:

    • 一般选择Sleep模式即可,即pwr_mgmt_mode_set(PMR_MGMT_SLEEP_MODE),此模式可以兼顾睡眠功耗和唤醒时间。

    • 若睡眠时间较长(如一天)且对低功耗要求比较高,可以根据能量消耗选择一种合适的睡眠模式,因为虽然Ultra Deep Sleep睡眠功耗较Sleep模式更低,但是唤醒后会执行冷启动流程,所需时间更长。

  • 低功耗代码配置

    • Sleep低功耗模式代码配置:

      • 在代码初始化时调用pwr_mgmt_mode_set(PMR_MGMT_SLEEP_MODE)设置Sleep低功耗模式。

      • 在裸机(无RTOS)开发中,需要在主循环调用pwr_mgmt_schedule,系统会在条件满足(如外设都Idle,MCU和Bluetooth LE没有需要做的事)进入Sleep模式。

      // Loop
      while (1)
      {
          app_log_flush();
          pwr_mgmt_schedule();
      }
      
      • 在RTOS开发环境中,借用了RTOS的低功耗机制,如FreeRTOS,当系统Idle的时间大于等于5 ms,此时系统就会配置睡眠的时间,然后进入睡眠。当FreeRTOS需要做事时,系统会被Sleep Timer唤醒,接着恢复上下文,然后FreeRTOS接着工作,整个过程中客户无感。

      TINY_RAM_SECTION void vPortEnterDeepSleep(TickType_t xExpectedIdleTime)
      {
          s_rtos_idle_ticks = xExpectedIdleTime;
          if (xExpectedIdleTime < 5)
          {
              ultra_wfi();
              return;
          }
          if (PMR_MGMT_SLEEP_MODE != pwr_mgmt_mode_get())
          {
              ultra_wfi();
              return;
          }
      
          pwr_mgmt_enter_sleep_with_cond(xExpectedIdleTime);
      }
      
    • Ultra Deep Sleep代码配置:

      • 客户可调用void pwr_mgmt_ultra_sleep(uint32_t time_ms)进入Ultra Deep Sleep模式,time_ms代表睡眠的时间,单位为ms,若等于0,此时只能被AON GPIO唤醒,不能被Sleep Timer定时器唤醒。

  • 功耗测量:可用SK做功耗评估,每款芯片SK的功耗测量方式有差异,可参考具体芯片的SK功耗测量文档,如GR551x SK的功耗测量方式可参考《GR551x功耗模式及功耗测量说明》。

  • 芯片是否睡眠检测:

    • 可以测量芯片电流,若是μA级别,芯片肯定睡眠了。

    • 测量DCDC/DIGCORE电压,若芯片没有睡眠,DCDC在1.1 V左右(不同芯片电压略有差异),DIGCORE在1.0 V左右(不同芯片电压略有差异)。

  • 虽然芯片已经进入睡眠,但此时测量出来的电流偏高,可从以下几个方向入手:

    • 睡眠后不需要工作的外围是否都已经关闭。

    • 睡眠后的IO电平是否匹配?IO电平不匹配可能造成IO的漏电,IO电平配置参考《GR551x功耗模式及功耗测量说明》。

  • APP层Driver(如app_i2c)实现了对外设低功耗的管理(睡眠唤醒后,不用再调用相应模块的de_init和init即可正常使用),SoC睡眠时会对外设寄存器做备份和恢复,HAL/LL层Driver(如hal_i2c和ll_i2c)未实现对外设的低功耗管理,用户需自行对外设的低功耗进行管理。建议使用APP层Driver,避免客户自己对外设进行低功耗管理而引入的开发工作量。

  • 睡眠后RTC/Calendar/BLE Timer/Sleep Timer能唤醒系统,tim和dual_tim不能唤醒系统。

  • 若客户使用了AON WDT(在睡眠时也工作),这时要考虑喂狗的时间,否则可能错过喂狗时间,导致系统复位。

  • 系统睡眠后,J-Link会断开。