CC2530有五種工作模式。分別為Active mode、idle mode、PM1、PM2、PM3,PM2模式比較省功耗而且可以被定時喚醒;PM3模式最省電但是只能被外部中斷喚醒。
開啟睡眠功能很簡單:
1、首先確認f8wConfig.cfg文件中DRFD_RCVC_ALWAYS_ON定義為FALSE;
2、然后在IAR的Options->C/C++Compiler->Preprocessor->Defined symbols中添加“POWER_SAVING”;
重要函數
void halSleep( uint16 osal_timeout )實現的功能:
1.首先將osal_timeout轉成以320US為單位
2.獲取下一次MAC定時器到期時間
3. halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER;
//為PM2或PM3模式。 沒有任務要執行就進入PM3深度睡眠,否則進入PM2睡眠,可以定時器喚醒。
4.喚醒
OSAL機制的ZigBee低功耗管理(CC2530)
涉及文件
OSAL_PwrMgr.h OSAL電源管理的API頭文件
OSAL_PwrMgr.C OSAL電源管理的API C文件
hal_sleep.c 底層的電源管理文件
電源管理結構體
typedef struct
{
uint16 pwrmgr_task_state; //任務狀態
uint16 pwrmgr_next_timeout;
//下一次超時
uint16 accumulated_sleep_time;
//睡眠時間
uint8
pwrmgr_device; //電源管理設備屬性,有PWRMGR_ALWAYS_ON和 PWRMGR_BATTERY兩種
} pwrmgr_attribute_t;
#define PWRMGR_ALWAYS_ON 0
#define PWRMGR_BATTERY 1
選擇PWRMGR_ALWAYS_ON的話將不會進入睡眠模式,選擇PWRMGR_BATTERY將
允許HAL管理CPU進入SLEEP LITE或者SLEEP DEEP狀態。
#define PWRMGR_CONSERVE 0
#define PWRMGR_HOLD 1
低功耗標志,主要用於osal_pwrmgr_task_state()這個函數中,用於標志每一任務是否需
要低功耗。
extern pwrmgr_attribute_t pwrmgr_attribute
定義一個電源管理的全局變量。
/*********************************************************************
* @brief 初始化電源管理函數,這個函數在OSAL.C里面的osal_init_system( )調用,
也就是在
OSAL系統初始化的時候將電源管理模式調成了不會進入睡眠模式的狀態。
*/
void osal_pwrmgr_init( void )
{
pwrmgr_attribute.pwrmgr_device = PWRMGR_ALWAYS_ON; //默認沒有睡眠模式
pwrmgr_attribute.pwrmgr_task_state = 0;
//清零
}
OSAL系統在檢查完所有的任務事件之后發現沒有事件需要處理,這樣在POWER_
SAVING宏定義打開的情況下將調用osal_pwrmgr_powerconserve()函數,osal_pwrmgr_powerconserve()函數把獲取os層timerout的下一次的到達時間作為參數,調用hal_sleep()進入pm2睡眠模式,如果當前沒有任務那么將進入pm3。所以說一旦啟用省電模式,系統將根據當前的任務自動進入睡眠,睡眠前設置sleeptimer,醒來的時間剛好等於下次任務到來的時間,當完成任務后再次進入睡眠。
這個timeout主要分為兩類,一類是應用層事件的timeout,另外一類是MAC層事件的timeout,
應用層的timeout時間,是在osal_pwrmgr_powerconserve( void )函數中,通過osal_next_timeout()獲得的。
MAC層的timeout時間,是在halSleep( uint16 osal_timeout )函數中,通過MAC_PwrNextTimeout()獲得的。
退出休眠
當出現IO中斷或者復位時候會退出休眠,或者在休眠定時器中斷時候也將會退出休眠。如果是IO中斷或者休眠定時器中斷退出之后將回到進入休眠的地方繼續向下執行,復位退出的話進入程序的初始部分執行。