低功耗模式
根据PHY的规格书描述,有四种模式:
基于规格书的介绍,就这四种模式细聊聊个人见解:
1.普通模式:即整个系统不会进入睡眠,适用于对功耗没有要求的场景
2.CPU休眠和深度睡眠模式,其实可以理解为同一种模式,因为他们支持唤醒源的方式都是一样的,均支持GPIO唤醒和定时器唤醒,可以自定义任意唤醒IO(注意看该IO是否支持作为唤醒IO),SRAM保持数量(64K SRAM被分为3块SRAM)以及蓝牙是否开启或关闭广播,我们可以称之为普通睡眠模式;
3.standy模式:看代码,该模式在睡眠状态下只保持AON 和一块 SRAM0 区域内存,蓝牙状态也会被关闭,以及仅支持Io唤醒,唤醒后相当于系统重启
4.关机模式:也称之为power off模式;,整个系统以及外设都进入睡眠状态,仅支持IO唤醒,唤醒后相当于系统重启
so,根据笔者的项目经验,在考虑功耗的情况下,建议使用普通睡眠模式或者power off模式是最优方案选择,不要纠结standy模式,要纠结就自己去试,多问无意义。
功耗测试
环境
SDK路径:release_bbb_sdk-PHY62XX_SDK_3.1.3\example\ble_peripheral\simpleBlePeripheral
硬件:PHY6222开发板(带DCDC)
测试仪器:DMM7510仪器
测试数据
该数据仅个人测试参考
影响功耗的因素
从上述测试数据情况可以看出,影响蓝牙功耗的主要由这些因素:demo传送门提取码:j4ny
连接参数–》连接间隔-connection interval,从机延迟-Slave latency
连接间隔-connection interval减小,主从机通信更加频繁,功耗增加;
连接间隔-connection interval增加,主从机通信频率降低,功耗减少。
Slave Latency减少或为0,每次连接事件都有蓝牙交互,功耗增加;
Slave Latency增加,功耗减少。
// Minimum connection interval (units of 1.25ms, 80=100ms) if automatic parameter update request is enabled
#define DEFAULT_DESIRED_MIN_CONN_INTERVAL 24//32//80
// Maximum connection interval (units of 1.25ms, 800=1000ms) if automatic parameter update request is enabled
#define DEFAULT_DESIRED_MAX_CONN_INTERVAL 800//48//800
// Slave latency to use if automatic parameter update request is enabled
#define DEFAULT_DESIRED_SLAVE_LATENCY 0
// Supervision timeout value (units of 10ms, 1000=10s) if automatic parameter update request is enabled
#define DEFAULT_DESIRED_CONN_TIMEOUT 500//1000
广播间隔
广播间隔advInt 时间越大,功耗越小,反之越高;
{
uint16 advInt = 800;//2400;//1600;//1600;//800;//1600; // actual time = advInt * 625us
GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MIN, advInt );
GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MAX, advInt );
GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MIN, advInt );
GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MAX, advInt );
}
SRAM的断电保持
保持数越多,功耗越大,,多保持一块SRAM应该给会多几个uA;
hal_pwrmgr_RAM_retention(RET_SRAM0|RET_SRAM1|RET_SRAM2);
// hal_pwrmgr_RAM_retention(RET_SRAM0);
发送功率以及主频
最大发射功率设置为0x3f,板子出来的发射功率应该在8±2dB;最高主频是64M。
发送功率和主频越高,功耗越大;反之越低;
static void hal_rfphy_init(void)
{
//Watchdog_Init(NULL);
//============config the txPower
g_rfPhyTxPower = RF_PHY_TX_POWER_0DBM ;
int main(void)
{
g_system_clk = SYS_CLK_XTAL_16M;//SYS_CLK_DBL_32M;//SYS_CLK_XTAL_16M;//SYS_CLK_DLL_64M;
设置睡眠模式
打开普通睡眠模式:CFG_SLEEP_MODE=PWR_MODE_SLEEP
关闭睡眠模式:CFG_SLEEP_MODE=PWR_MODE_NO_SLEEP
power off 模式配置
LOG("power off\r\n");
pwroff_cfg_t cfg =
{
.pin = P15,
.type = POL_FALLING,
.on_time = 3000
};
hal_pwrmgr_poweroff(&cfg, 1);
拓展
功耗跟上图出入较大的话,建议:
1.去掉所有LOG的初始化或者使用LOG
2.检查外设在睡眠前是否全部释放,相应的MODULE_e mod要hal_pwrmgr_unlock掉
3.检查所有events事件是否还是周期性触发
4.检查所有的IO在睡眠后是否有漏电的情况,如果IO在睡眠后存在电压差,就会漏电到地,所以一般IO在睡眠前要根据电路设置为输入上拉或者输入下拉;
5.设置广播信道,默认是同时3个信道同时发送广播数据(37,38,39).可以设置为一个或者两个信道应该也能降低一些功耗,不影响实际使用
6.把一些对实时性要求不高的代码放在XIP里面运行,如下图可以参考下,应该可以降低几uA功耗