要使用电源管理,需要预编译POWER_SAVING.预备知识:#define PWRMGR_ALWAYS_ON 0 //协调器或者路由器不能休眠#define PWRMGR_BATTERY 1 //终端可以休眠#define PWRMGR_CONSERVE 0 //PWRMGR_CONSERVE任务处于省电状态#define PWRMGR_HOLD 1 //PWRMGR_HOLD任务处于工作状态 typedef struct{ uint16 pwrmgr_task_state; //任务的电源管理状态,允许为bit0,不允许为bit1 uint16 pwrmgr_next_timeout; //下一次超时时间 uint16 accumulated_sleep_time; uint8 pwrmgr_device; //电源管理设备属性,PWRMGR_ALWAYS_ON PWRMGR_BATTERY对应} pwrmgr_attribute_t;//电源管理结构体定义了pwrmgr_attribute_t pwrmgr_attribute;1.osal_pwrmgr_init()//初始化电源管理系统,默认为PWRMGR_ALWAYS_ON 和pwrmgr_task_state=0(所有任务支持电源管理);2.osal_pwrmgr_device(uint8 )//设置电源管理设备属性。为PWRMGR_ALWAYS_ON 或者PWRMGR_BATTERY3.osal_pwrmgr_task_state(uint8 task_id, uint8 state)//state为PWRMGR_CONSERVE或者PWRMGR_HOLD,设置任务允不允许电源管理。4.osal_pwrmgr_powerconserve()//判断是否所有的任务都允许电源管理,查找出最低timeout的timeer返回timeout,timer表为空返回0,最后调用halSleep,进入休眠状态。 1在【Zmain.c中】osal_start_system()-------->osal_pwrmgr_powerconserve()2可以使用osal_pwrmgr_task_state( uint8 task_id, uint8 state )来使某个任务支持或不支持电源管理3在ZDApp_event_loop()中 osal_pwrmgr_device( PWRMGR_ALWAYS_ON );//路由器不能使用电源管理 在ZDApp_NetworkStartEvt()中 osal_pwrmgr_device( PWRMGR_ALWAYS_ON );//协调器一直有电 在ZDApp_DeviceAuthEvt()中 #if defined ( POWER_SAVING ) osal_pwrmgr_device( PWRMGR_BATTERY );//end可以选择性的电源管理 #endif在ZDApp_ProcessNetworkJoin()中ZDApp_ProcessNetworkJoin()中 #if defined ( POWER_SAVING ) osal_pwrmgr_device( PWRMGR_BATTERY ); #endif /***************************************************************************/ CC2530有3种睡眠模式:#define CC2530_PM0 0 /* PM0, Clock oscillators on, voltage regulator on */#define CC2530_PM1 1 /* PM1, 32.768 kHz oscillators on, voltage regulator on */#define CC2530_PM2 2 /* PM2, 32.768 kHz oscillators on, voltage regulator off */#define CC2530_PM3 3 /* PM3, All clock oscillators off, voltage regulator off */ #define HAL_SLEEP_OFF CC2530_PM0 //#define HAL_SLEEP_TIMER CC2530_PM2//可通过定时器和外部中断或者复位唤醒#define HAL_SLEEP_DEEP CC2530_PM3//外部中断或者复位唤醒pm2模式比较省功耗而且可以被定时唤醒;pm3模式最省电但是只能被外部中断唤醒 要设置低功耗模式,先确认:1.f8wConfig.cfg文件中DRFD_RCVC_ALWAYS_ON定义为FALSE2.Options->C/C++Compiler->Defined symbols中添加预编译“POWER_SAVING”;在Options->Linker->Linker command line里面把f8w2430.xcl改为f8w2430pm.xcl。重要函数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.唤醒