待机模式
备注
前置知识: 电源管理单元 (PMU)
睡眠模式 (Sleep Mode) 以开关CPU核内时钟域的方式,降低CPU空闲场景下的SoC动态功耗。 而 待机模式 (Standby Mode) 和 休眠模式 (Hibernate Mode) 的引入,则是通过电源管理单元(PMU)的操作, 开关SoC层级的电源域,以影响全体SoC外设的方式,进一步降低指定场景的功耗。
待机模式 (Standby Mode) 特性
待机模式下:
CPU与常规外设单元关闭,其内部寄存器状态保留(Retention)。
SRAM与L2 Cache数据保留。
待机模式的进入
配置 PMU_STATE_CTL.STATE_SET = 0x1 选择待机模式。
配置 PMU_STATE_CTL.STATE_MODE = 1,即“延迟触发”,SoC需经由睡眠模式进入待机模式。 这样操作的优点是可以确保CPU当前工作切实完成(指令处置、BUS访问等),唤醒后程序能够从可控的状态开始运行。
调用wfi指令,SoC进入低功耗状态。
待机模式的唤醒
PMU提供4种机制用于将SoC从低功耗待机模式(Standby Mode)唤醒。用户可以同时选择多种唤醒机制。 任意被选中的唤醒机制在触发后将同时产生PMU低功耗唤醒信号PMU_WAK和PMU中断请求信号PMU_IRQ, PMU_WAK用于将SoC从待机模式唤醒至睡眠模式,PMU_IRQ信号继续将SoC从睡眠模式唤醒至工作模式(Active Mode) 继续从执行待机前的代码位置执行程序。
按键唤醒(ONOFF)机制
通过指定管脚的数字输入电平事件触发低功耗唤醒信号。请阅读章节 ONOFF多功能单元 内容。
定时唤醒(ALARM)机制
通过PMU内部定时器ALARM在指定时间后产生低功耗唤醒信号。请阅读章节 定时检测单元 (ALARM) 内容。
低电压检测唤醒(LVD)机制
PMU内部低电压检测模块(LVD)可以实时监测电源电压,当其下降至设定的阈值时,产生低功耗唤醒信号。 请阅读章节 低电检测单元 (LVD) 内容。
低电压复位唤醒(LVR)机制
LVD事件发生后,可以继续触发低电压复位(LVR)事件,导致SoC复位。请阅读章节 低电检测单元 (LVD) 内容。
需要提示的是:以上4种唤醒方式同时也是 PMU 提供的4种 PMU 中断触发方式,用户完全可以在非低功耗场景下部署使用, 用于实时监控供电电压等必要动作。
待机模式配置方法
多功能按键唤醒(ONOFF)配置
根据需求选择指定的输入通道配置ONOFF按键, ONOFF-PMU通道对应
lpm_set_onoff_pmu(), ONOFF-GPIO通道对应lpm_set_onoff_gpio()。调用
lpm_standby_enter()函数,进入待机模式。当ONOFF事件触发,将SoC从待机模式唤醒,CPU从待机位置继续执行程序,包括用户可自定义的流程
lpm_standby_wakeup_handler()。
定时唤醒(ALARM)配置
调用
lpm_set_alarm()函数,配置ALARM定时。调用
lpm_standby_enter()函数,进入待机模式。指定时间后ALARM触发,将SoC从待机模式唤醒,CPU从待机位置继续执行程序,包括用户可自定义的流程
lpm_standby_wakeup_handler()。
低电压检测唤醒(LVD)配置
调用
lpm_set_lvd()函数,配置LVD定时检测。调用
lpm_standby_enter()函数,进入待机模式。当LVD触发,将SoC从待机模式唤醒,CPU从待机位置继续执行程序,包括用户可自定义的流程
lpm_standby_wakeup_handler()。
低电压复位唤醒(LVR)配置
API说明
-
void lpm_set_alarm(alarm_time_t period)
设置低功耗定时唤醒(ALARM)时间。
- 参数
period – ALARM低功耗唤醒定时设置,通过枚举定义
alarm_time_t选择。
- 返回
无
-
void lpm_set_lvd(lvd_volt_t volt, lvd_event_t event, lvd_debounce_time_t debounce, alarm_time_t period)
设置LVD低功耗唤醒。
- 参数
volt – LVD输入电压阈值,通过枚举定义
lvd_volt_t选择。event – LVD输出电平事件,通过枚举定义
lvd_event_t选择。debounce – LVD输出消抖时间,通过枚举定义
lvd_debounce_time_t选择。period – ALARM定时周期,通过枚举定义
alarm_time_t选择。
- 返回
无
-
void lpm_set_onoff_pmu(gpio_pin_t pin, onoff_pmu_pin_pull_t pull, onoff_event_t event, onoff_debounce_time_t debounce)
设置ONOFF-PMU低功耗唤醒。
- 参数
pin – ONOFF管脚,通过枚举定义
gpio_pin_t选择,GPIO00-07可选。pull – ONOFF-PMU通道上拉电阻配置,通过枚举定义
onoff_pmu_pin_pull_t选择。event – ONOFF电平事件设置,通过枚举定义
onoff_event_t选择。debounce – ONOFF电平消抖时间设置,通过枚举定义
onoff_debounce_time_t选择。
- 返回
无
-
void lpm_set_onoff_gpio(gpio_pin_t pin, gpio_pin_pull_t pull, onoff_event_t event, onoff_debounce_time_t debounce)
设置ONOFF-GPIO低功耗唤醒。
- 参数
pin – ONOFF管脚,通过枚举定义
gpio_pin_t选择,GPIO00-26可选。pull – ONOFF-GPIO通道上下拉电阻配置,通过枚举定义
gpio_pin_pull_t选择。event – ONOFF电平事件设置,通过枚举定义
onoff_event_t选择。debounce – ONOFF电平消抖时间设置,通过枚举定义
onoff_debounce_time_t选择。
- 返回
无
-
void lpm_standby_enter()
进入低功耗待机模式,等待低功耗唤醒源唤醒信号。
- 返回
无
-
void lpm_standby_wakeup_handler(uint32_t pmu_pend)
低功耗待机模式唤醒后必要动作的用户自定义函数,用户请参考SDK提供的弱定义版本准备。
- 返回
无
__WEAK void lpm_standby_wakeup_handler(uint32_t pmu_pend)
{
switch(_rv32_ctz(pmu_pend)) {
case PMU_Lpm_Wakeup_Source_ONOFF:
break;
case PMU_Lpm_Wakeup_Source_ALARM:
break;
case PMU_Lpm_Wakeup_Source_LVD:
break;
case PMU_Lpm_Wakeup_Source_LVR:
break;
default:
break;
}
}