BLE 协议栈中电源低功耗的管理与CC2530的模式一样,都有PM1,PM2,PM3三种低功耗状态,其中PM2在可以用定时器唤醒,在PM3中只能使用外部中断的方式才能唤醒。
下面的程序实现的是在CC2541片子上使用低功耗电源管理芯片TPS62730,控制引脚在P1_0位置。
程序运行到osal_start_system();后继而运行到osal_run_system();
在里面有一个 osal_pwrmgr_powerconserve();函数,是系统自动检测当前是否有任务在执行,没哟的话将进入低功耗模式。
void osal_pwrmgr_powerconserve( void ) // 系统自动调用 如果当前没有任务,将进入低功耗模式
{
uint32 next;
halIntState_t intState;
// Should we even look into power conservation
if ( pwrmgr_attribute.pwrmgr_device != PWRMGR_ALWAYS_ON )
{
// Are all tasks in agreement to conserve
if ( pwrmgr_attribute.pwrmgr_task_state == 0 )
{
// Hold off interrupts.
HAL_ENTER_CRITICAL_SECTION( intState );
// Get next time-out
next = osal_next_timeout(); //选取最近事件的Timeout 作为实际休眠时间
// Re-enable interrupts.
HAL_EXIT_CRITICAL_SECTION( intState );
// Put the processor into sleep mode
OSAL_SET_CPU_INTO_SLEEP( next ); // 进入低功耗模式
}
}
}
进入低功耗模式之后,会执行halsleep()函数进行低功耗模式设置。
里面进行了低功耗时间等设置,进行电源控制的启动就在这里使能!
void halSleep( uint32 osal_timeout )
{
uint32 timeout;
uint32 llTimeout;
uint32 sleepTimer;
#ifdef DEBUG_GPIO
// TEMP
P1_0 = 1;
#endif // DEBUG_GPIO
// max allowed sleep time in ms
if (osal_timeout > MAX_SLEEP_TIMEOUT)
{
osal_timeout = MAX_SLEEP_TIMEOUT;
}
// get LL timeout value already converted to 32kHz ticks
LL_TimeToNextRfEvent( &sleepTimer, &llTimeout );
// check if no OSAL timeout