CC2541 PM2/PM3與喚醒的設置問題
首先我看了範例中的程式,覺得應該是把options內的power saving設置好,在關閉定時event,應該就可以讓系統自動進入PM2 or PM3。
我做了幾個測試,首先我把程式中有osal_start_timerEx的event都註解掉,並設breakpoint在halsleep()處,可以看到確實執行到了halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER; 同時有觀察到耗電已經有到0.1~0.2mA的狀況。
但今天我不註解掉這些event,改用osal_stop_timerEx停掉這些event,就進不去PM2了,有需要做其它設置嗎?
剛剛trace了一下程序,發現程式跑到 osal_pwrmgr_powerconserve()中的 if ( pwrmgr_attribute.pwrmgr_device != PWRMGR_ALWAYS_ON ) 就直接skip出去了,沒執行到裏頭的OSAL_SET_CPU_INTO_SLEEP( next );
可是我在設定的時候已經有設定power saving且有正確執行到osal_pwrmgr_device( PWRMGR_BATTERY ); 也有觀察到pwrmgr_attribute.pwrmgr_device被設成1,是否有仍有其他因素會將此值清除為PWRMGR_ALWAYS_ON ??
Huazhen Jiang,
只要在工程的属性配置里面,POWER_SAVING没有被注释掉,系统就会自动进行PM2/3的切换,根据实时的工作模式进行自动完成。
看是否有定时任务?
感謝兩位的回答,我應該是把所有定時任務都關閉了。
剛剛trace了下程式,發現是下列函數會持續把pwrmgr_attribute.pwrmgr_task_state 設成2
if (dmaRdyDly == 0)
{
(void)osal_set_event(Hal_TaskID, HAL_PWRMGR_HOLD_EVENT);
}
爬了一下之前的文章,發現將HAL_UART = FALSE的時候,就不會進入這個判斷了,如此可以順利進入休眠,功耗也掉到100uA左右,現在我加入一個再收到我特定CMD之後忽略上述判斷,可以順利進入PM2了。
想請教的是,進入PM2,應該是允許定時事件,可這時候的Timer有準嗎? 因為我看網路上的資料,都說這時候只有sleepTimer才能喚醒,這是不是我原先裏頭的osal_start_timerEx( simpleBLETaskId, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD ); 就不會固定500ms跑了
PS:SBP_PERIODIC_EVT_PERIOD =500ms