低功耗
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会断开。