NXP系列MCU共6种低功耗模式。
908X系列BLE SOC支持其中两种,为PD0,PD1。根据手册两种模式区别:
PD1为最低功耗模式,所有外设时钟都关闭,只能通过IO或电压比较唤醒。经测试,PD1下MCU的功耗为0.8uA。
PD0为普通低功耗模式,最主要的区别就是蓝牙内核还开着,所以可以根据这一点,设计低功耗广播的方案,即设备待机时,蓝牙一直广播。
这个方案的好处是,通过蓝牙连接来唤醒设备,不存在误触问题。旧方案是通过手触摸或双击等触摸类唤醒,很多应用场景会误触开机。配合PD1还可以设计为:待机为PD1,触摸后设备低功耗广播,蓝牙连接后进入工作模式,若一段时间无连接退回到PD1。
经测试,蓝牙休眠时功耗为2.5uA~3uA,通过修改广播间隔,可以进一步降低广播的整体平均功耗。
经过查看文档及调试,发现他进入低功耗的原理是在APP IDLE时进入低功耗,真正进入低功耗后阻塞在一段汇编代码中。
PD0模式注意点:
1.手册说PD0可以通过蓝牙事件唤醒,包括广播、连接等事件。低功耗广播时,系统是周期性的被唤醒的,在发广播包时被唤醒。但是一般的应用其实是只想蓝牙连接时唤醒,所以在广播时,不能跑其他业务逻辑。
这个问题其他有的厂家的SOC是这样设计的:广播不会唤醒,只有蓝牙连接时才唤醒,即广播时程序不会唤醒跑自己写的业务,这样我们在开发时更简单一些,无需在广播时把自己的业务干掉。
2.若只想低功耗广播,则不能开启低功耗软定时器,因为这个定时器是使用RTC实现的,RTC会唤醒系统。
3.退出低功耗时需要这样禁止设备再进入低功耗:
// PWR_PreventEnterLowPower(true); //调用这个会增加功耗
PWR_DisallowDeviceToSleep(); //不调用这个会不停的进入低功耗,导致app不能正常运行
(这里看到他函数命名的意思的低功耗 != 休眠? 有待考察)
使能空闲时低功耗:
//进入PDO或PD1
void Enter_PD(uint8_t PDmode)
{
switch(PDmode)
{
case 0:
PWR_ChangeDeepSleepMode(3); //Allow PD0
PWR_AllowDeviceToSleep();
PWR_PreventEnterLowPower(false);
break;
case 1:
PWR_ChangeDeepSleepMode(4); //Allow PD1
PWR_AllowDeviceToSleep();
PWR_PreventEnterLowPower(false);
break;
}
}