Zigbee电源管理

要使用电源管理,需要预编译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_BATTERY

3.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定义为FALSE

2.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.唤醒


你可能感兴趣的:(ZigBee学习)