1815|0

2014

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

ZIGBEE电源管理POWER_SAVING有关的函数 [复制链接]

POWER_SAVING有关的函数

1、  osal.c 中   osal_start_system()----> osal_pwrmgr_powerconserve();

void osal_pwrmgr_powerconserve( void )
{
    uint16        next;
    halIntState_t intState;

      // Should we even look into power conservation
      if ( pwrmgr_attribute.pwrmgr_device != PWRMGR_ALWAYS_ON )
      {
              if ( pwrmgr_attribute.pwrmgr_task_state == 0 )     // 所有的任务都支持低功耗
               {
                    HAL_ENTER_CRITICAL_SECTION( intState );      // Hold off interrupts.

                    next = osal_next_timeout();     // 得到下一次的睡眠时间    

                    HAL_EXIT_CRITICAL_SECTION( intState );     // Re-enable interrupts.

                      // 进入睡眠模式

                     OSAL_SET_CPU_INTO_SLEEP( next );  //halsleep(next);
                }
         }
}

//==================================================================

void halSleep( uint16 osal_timeout )
{
      uint32        timeout;
      uint32        macTimeout = 0;

      halAccumulatedSleepTime = 0;


      timeout = HAL_SLEEP_MS_TO_320US(osal_timeout);
      if (timeout == 0)
      {
            timeout = MAC_PwrNextTimeout();
      }
      else
      {
   
            macTimeout = MAC_PwrNextTimeout();

   
            if ((macTimeout != 0) && (macTimeout < timeout))
            {
                  timeout = macTimeout;
            }
      }

      //如果timeout =0 进入深度睡眠,否则进入浅睡眠

       halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER;

     //深度睡眠只有在zgPollRate == 0才会产生,这样是为了尽可能的减少进入深度睡眠的次数


#if !defined (RTR_NWK) && defined (NWK_AUTO_POLL)
      if ((timeout > HAL_SLEEP_MS_TO_320US(PM_MIN_SLEEP_TIME)) ||
          (timeout == 0 && zgPollRate == 0))
#else
       if ((timeout > HAL_SLEEP_MS_TO_320US(PM_MIN_SLEEP_TIME)) ||
          (timeout == 0))
#endif
  {
    halIntState_t ien0, ien1, ien2;

    HAL_ASSERT(HAL_INTERRUPTS_ARE_ENABLED());
    HAL_DISABLE_INTERRUPTS();

   //关闭MAC和无线电全部电源
    if (MAC_PwrOffReq(MAC_PWR_SLEEP_DEEP) == MAC_SUCCESS)

{
      while ( (HAL_SLEEP_MS_TO_320US(halAccumulatedSleepTime) < timeout) || (timeout == 0) )
      {
        //关闭外设,进入睡眠,此处函数为空
        HalKeyEnterSleep();

#ifdef HAL_SLEEP_DEBUG_LED
        HAL_TURN_OFF_LED3();
#else
        //关闭LED灯,进入睡眠
        HalLedEnterSleep();
#endif

     

                      //启动睡眠定时器中断
                         if (timeout != 0)
                        {
                              if (timeout > HAL_SLEEP_MS_TO_320US( MAX_SLEEP_TIME ))
                              {
                                    timeout -= HAL_SLEEP_MS_TO_320US( MAX_SLEEP_TIME );
                                    halSleepSetTimer(HAL_SLEEP_MS_TO_320US( MAX_SLEEP_TIME ));
                              }
                              else
                              {
                                     halSleepSetTimer(timeout);  //设置睡眠定时器时间
                              }

         
                              HAL_SLEEP_TIMER_CLEAR_INT();//清除中断标志
                              HAL_SLEEP_TIMER_ENABLE_INT();//启动定时器
                        }

#ifdef HAL_SLEEP_DEBUG_LED
                       if (halPwrMgtMode == CC2530_PM1)
                        {
                              HAL_TURN_ON_LED1();
                        }
                        else
                        {
                              HAL_TURN_OFF_LED1();
                        }
#endif

       
                        HAL_SLEEP_IE_BACKUP_AND_DISABLE(ien0, ien1, ien2);
                        HAL_ENABLE_INTERRUPTS();

                        //设置SLEEP.MODE=halPwrMgtMode,PCON.IDLE=1
                        HAL_SLEEP_SET_POWER_MODE(halPwrMgtMode);  

                        HAL_DISABLE_INTERRUPTS();

       
                        HAL_SLEEP_IE_RESTORE(ien0, ien1, ien2);

       
                        HAL_SLEEP_TIMER_DISABLE_INT();

       
                        halAccumulatedSleepTime += (HalTimerElapsed() / TICK_COUNT);

       
                       if ( osal_timeout > halAccumulatedSleepTime)
                        {
                              osal_timeout -= halAccumulatedSleepTime;
                        }

#ifdef HAL_SLEEP_DEBUG_LED
                        HAL_TURN_ON_LED3();
#else
                        HalLedExitSleep();
#endif      

                        //如果有按键按下,跳出睡眠模式,使能所有中断

                      if ( HalKeyExitSleep() )
                      {
                          break;
                      }

       
                     if ( timeout == 0 ) break;
              }//end while   //while ( (HAL_SLEEP_MS_TO_320US(halAccumulatedSleepTime) < timeout) || (timeout == 0) )

     
              MAC_PwrOnReq();//打开MAC和无线电电源

        }//end if         if (MAC_PwrOffReq(MAC_PWR_SLEEP_DEEP) == MAC_SUCCESS)

        HAL_ENABLE_INTERRUPTS();
      }
}

2、osal_pwrmg.c 中 osal_pwrmgr_powerconserve()

3、osal_timer.c 中  osal_adjust_timers(),osal_next_timeout

4、hal_mcu.h  中

#ifdef POWER_SAVING

  #define CLEAR_SLEEP_MODE() st(SLEEPCMD &= ~PMODE;) 
#else
  #define CLEAR_SLEEP_MODE()
#endif

5、hal_driver.c中

Hal_ProcessEvent()函数中 只对系统消息事件,按键,睡眠定时器事件进行处理

uint16 Hal_ProcessEvent( uint8 task_id, uint16 events )
{
    uint8 *msgPtr;

      (void)task_id;  // Intentionally unreferenced parameter

      if ( events & SYS_EVENT_MSG )  //系统消息事件

      {
            msgPtr = osal_msg_receive(Hal_TaskID);

            while (msgPtr)
            {

                 osal_msg_deallocate( msgPtr );
     
                  msgPtr = osal_msg_receive( Hal_TaskID );
            }
            return events ^ SYS_EVENT_MSG;
      }

      if ( events & HAL_LED_BLINK_EVENT )  //灯事件
      {
#if (defined (BLINK_LEDS)) && (HAL_LED == TRUE)
            HalLedUpdate();
#endif
            return events ^ HAL_LED_BLINK_EVENT;
      }

      if (events & HAL_KEY_EVENT)   //处理按键事件
      {

#if (defined HAL_KEY) && (HAL_KEY == TRUE)
           HalKeyPoll();

          if (!Hal_KeyIntEnable)
          {
              osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT, 100);
            }
#endif // HAL_KEY

            return events ^ HAL_KEY_EVENT;
          }

#ifdef POWER_SAVING
          if ( events & HAL_SLEEP_TIMER_EVENT )  //该部分处理睡眠定时器事件
          {
                halRestoreSleepLevel();//为空函数

                return events ^ HAL_SLEEP_TIMER_EVENT;
          }
#endif


  return 0;

}

6、ZDApp.c 中

ZDApp_DeviceAuthEvt()函数

#if defined ( POWER_SAVING )
    osal_pwrmgr_device( PWRMGR_BATTERY );
#endif

ZDApp_ProcessNetworkJoin()函数中

#if defined ( POWER_SAVING )
      osal_pwrmgr_device( PWRMGR_BATTERY );
#endif

void osal_pwrmgr_device( uint8 pwrmgr_device )
{
//PWRMGR_BATTERY 低功耗,PWRMGR_ALWAYS_ON正常工作模式

pwrmgr_attribute.pwrmgr_device = pwrmgr_device;

}

此帖出自无线连接论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表