休眠唤醒机制
LP0 |
LP1 |
LP2 |
LP3 |
|
|---|---|---|---|---|
RAM Retention |
On |
On |
Off |
Off |
Low Power Clock (32K) |
On |
Off |
On |
Off |
Power Consumption |
12-14uA (64K RAM) |
≈LP0-1uA |
<1uA |
<500nA |
Scenario |
BLE ADV/CONN |
Wakeup from RTC or IO & Reboot |
Wakeup from IO & Reboot |
|
Scheduled By SDK Automatically |
Triggered by APP |
Triggered by APP |
LP0
LP0通常用于BLE广播和连接状态下降低功耗。BLE广播和连接都是周期性地收发数据,仅仅在收发数据的时间段内,需要系统正常工作,其余时段,除了需要维持协议时序的低速时钟工作外,其余模块均不需要工作。
Bare-Metal应用,大循环消息队列没有待处理的消息
RTOS应用,除了Idle任务外,没有其他就绪态的任务
上述两种情况下,系统都会调用休眠检查相关代码,若片上外设均处于空闲状态,且BLE在当前一段时间内没有活动(如收发数据和协议处理),则进入LP0休眠流程。
在BLE应用场景里,工作、空闲状态是周期性交替出现的,在空闲状态下,系统就会启动LP0休眠,这是由SDK软件框架自动完成的,不需要应用层专门调用。
外设与LP0
在HAL外设库中,xxx_Init、xxx_DeInit分别会设置、清除标记该外设忙状态的全局变量。所以外设每一段连续工作阶段开始时都应该调用初始化函数,结束时都应该调用相应的反初始化函数,否则外设忙状态会阻止系统进入LP0。但也有一类应用,需要保持外设处于常监听状态,比如串口数据接收和SPI从设备收发,这时相应外设一直处于工作状态,系统不会休眠。需要进入休眠时,应用必须主动结束监听。
LP0模式下,为了避免漏电,IO状态须维持不变。对于使用IO复用功能的外设,需要在外设初始化前,调用对应的外设IO初始化函数(xxx_io_init),在外设反初始化后,调用对应的外设IO反初始化函数(xxx_io_deinit)。外设IO初始化函数会配置IO复用功能,外设IO反初始化函数会关闭IO复用功能,恢复为GPIO,且输入输出状态保持不变。如果外设反初始化后,不进行外设IO反初始化,会造成IO管脚复用状态依然维持,一旦进入LP0后,外设模块掉电,复用状态的IO无法得到正确的输入输出配置,可能产生漏电。
LP2、LP3
LP2和LP3的特点是RAM不保持。因此唤醒后,无法恢复现场,只能重新执行启动流程。调用进入LP2、LP3的函数后,可认为程序的运行到此结束,直到唤醒条件满足,再重新启动系统。
LE501X
LE501X进入LP2,LP3后,所有管脚均会变为输入使能状态,而上下拉配置可以维持。为了避免引起PCB上IO漏电,进入LP2、LP3的函数进行了如下配置:
所有输出高的IO,配置上拉
所有输出低的IO,配置下拉
所有输入使能的IO,维持之前的上下拉配置
所有输入未使能的IO,配置下拉