低功耗
看到低功耗有:
EM0: 是active,活跃状态
EM1:是sleep,休眠状态
EM2:是deepsleep,深度休眠状态
EM3:只有片上外设,I2C和外部中断可用
EM4:是shutoff,最低功耗模式,只有低功耗时钟,射频OOK检测,GPIO等工作。系统从EM4唤醒后会复位。
EM0
EM0提供所有系统功能。
- Cortex-M33正在执行代码
- 无线电功能可用
- 高频和低频时钟树是活跃的
- 所有振荡器都可用
- 所有外围功能可用
EM1
EM1使核心失效,但使其余系统完全可用。
- Cortex-M33处于休眠模式。核心时钟关闭
- 无线电功能可用
- 高频和低频时钟树是活跃的
- 所有振荡器都可用
- 所有外围功能可用
EM1P
EM1P是EM1的一个子集,它允许无线电在核心和高速外设关闭以节省能源时运行。当无线电处于活动状态且软件请求输入EM2时输入。
- Cortex-M33处于睡眠模式。
- 核心时钟和所有高速外设都关闭
- 无线电和HFXO仍然有效所有能够EM2, EM3或EM4操作的外设和振荡器都是可用的
EM2
这是进入低功耗能量模式的第一级。大部分高频外设被禁用或功能降低。内存和寄存器保留它们的值。
- Cortex-M33处于睡眠模式。核心时钟关闭。
- radio不活跃
- RFSENSE可用
- 高频时钟树不活跃
- 低频时钟树处于激活状态
- 以下振荡器可用LFRCO, LFXO, ULFRCO, FSRCO(如果IADC使用,则按需提供)
- 有以下几种低频外设可供选择RTCC、BURTC、WDOG、LETIMER
- 以下模拟外设可用(在功能上有潜在限制)IADC
- 唤醒EM0,接通外设中断,复位引脚,上电复位,异步引脚中断,I2C0地址识别,EUART0中断,或RFSENSE
- 唤醒到EM1通过无线电数据传输请求传输完成后,部分返回EM2
- RAM和寄存器值被保留RAM块可以选择性地关闭电源以降低功率
- GPIO引脚状态保留
- RTCC内存保留
- 默认情况下,调试连接不可用,以减少电流消耗。调试连接可以通过在EMU_CTRL寄存器中设置EM2DBGEN位来启用,并且将消耗大约0.5 uA的额外电源电流。
EM3
EM3在这种低能量模式下,所有低频振荡器(LFXO、LFRCO)和由它们衍生的所有低频时钟以及所有高频时钟都停止。大多数外设被禁用或功能降低。内存和寄存器保留它们的值。
- Cortex-M33处于睡眠模式。核心时钟关闭。
- 无线电非活跃
- RFSENSE有效
- 高频时钟树不活跃
- 所有低频时钟树源自低频振荡器(LFXO, LFRCO)是无效的
- 下面的振荡器是可用的ULFRCO、FSRCO(按需提供,如果被IADC使用)
- 以下低频外设如果被ULFRco定时,则可用RTCC、BURTC和WDOG
- 以下模拟外设可用(在功能上有潜在的限制)IADC
- 唤醒EM0,接通外设中断,复位引脚,上电复位,异步引脚中断,I2C0地址识别,或RFSENSE
- 唤醒到EM1通过无线电数据传输请求传输完成后,部分返回EM3
- RAM和寄存器值被保留RAM块可以选择性地关闭电源以降低功率
- GPIO引脚状态保留
- RTCC内存保留
- 默认情况下,调试连接不可用,以减少电流消耗。调试连接可以通过在EMU_CTRL寄存器中设置EM2DBGEN位来启用,并且将消耗大约0.5 uA的额外电源电流。
EM4
EM4是该部件的最低能量模式。除了GPIO PAD状态和BURAM值外,没有保留。从EM4唤醒需要重置系统,将其返回到EM0
- Cortex-M33关闭
- 无线电关闭
- RFSENSE可用
- 高频时钟树关闭
- 低频时钟树可能处于活动状态除了BURAM外,不保留RAM或寄存器值。如果BURTC使用
- 以下振荡器,则会打开:LFRCO、LFXO、ULFRCO
- 以下低频外设可用BURTC
- 唤醒EM0,接通BURTC中断,复位引脚,上电复位,异步引脚中断(仅对GPIO_EM4WUx引脚),或RFSENSE
- GPIO引脚状态可能保留(取决于EMU->EM4CTRL.EM4IORETMODE配置)
功耗模式切换
IADC和无线电等外设能够暂时将组件从EM2或EM3唤醒到EM1,以便传输数据。一旦完成,组件将自动放置回EM2或EM3模式。在EM0期间,Core总是可以使用WFI或WFE命令请求转到EM1。如果无线电正在传输数据或如果闪存正在编程或擦除,核心将被阻止进入EM2或EM3。对于每种能量模式,系统通常会默认为其最低功耗配置,非必要的时钟和外设将被禁用。然后,功能可以通过软件选择性地启用。
不同休眠模式下的时钟情况:
唤醒方式
EM4的唤醒
唤醒方式如下:
- BURTC中断
- Reset管脚或断电复位
- RFSENSE(需要使用OOK协议)
- gpio中断(只可用带有EM4WU功能的gpio管脚,且需要配置EM4WUEN)
代码API
这个工程在使用广播扫描的时候,它会自动进入低功耗的模式;
EMU_ENterEM1(true);
EMU_ENterEM2(true);
EMU_ENterEM3(true);
EMU_ENterEM4(true);
上面的API是进入EM1-EM4的函数;
还有官方提供了接口
/*
检查此时MCU是否可以休眠。这个函数在系统即将进入睡眠状态时被调用,
中断被禁用,它允许软件在最后一分钟事发生时取消进入睡眠状态
(函数调用和中断禁用之间的窗口)
@return True, if the system can go to sleep.
* False, otherwise.
*/
__WEAK bool app_is_ok_to_sleep(void)
{
return true;
}
/*
检查MCU是否可以在中断后休眠。这个函数在中断发生并被处理后调用。
它允许电源管理器知道它是否必须回到睡眠状态或唤醒状态。
@return SL_POWER_MANAGER_IGNORE, 如果模块没有触发ISR并且它不会对决策做出贡献
*
* SL_POWER_MANAGER_SLEEP, 该模块是导致系统唤醒的模块,系统应该返回睡眠状态
*
* SL_POWER_MANAGER_WAKEUP, 该模块是引起系统唤醒的模块,系统绝对不能回到睡眠
*/
__WEAK sl_power_manager_on_isr_exit_t app_sleep_on_isr_exit(void)
{
return SL_POWER_MANAGER_IGNORE;
}
这个接口可以用来在APP阶段控制进入低功耗的时机;
进入低功耗的函数,这个函数在while(1)中执行
sl_power_manager_sleep();