轉: ZigBee/Z-Stack CC2530實現低功耗運行的配置簡介

轉: ZigBee/Z-Stack CC2530實現低功耗運行的配置簡介
http://bbs.elecfans.com/jishu_914377_1_1.html
(出處: 中國電子技術論壇)html

設備支持低功耗運行是ZigBee網絡的一大特色,該特性藉助CC2530芯片可以很好地體現出來。CC2530芯片有五種運行模式,分別爲主動模式、空閒模式、PM一、PM2和PM3。主動模式是通常運行模式;空閒模式除了CPU內核中止運行外,其餘和主動模式同樣;PM一、PM二、PM3是低功耗運行模式,CC2530經過關閉沒必要要的部分和調整系統時鐘來達到低功耗的效果。網絡

    PM1:穩壓器的數字部分開啓,32 MHzXOSC和 16 MHz RCOSC都不運行。32 kHz RCOSC或32 kHz XOSC運行。復位、外部中斷或睡眠定時器溢出時系統將轉到主動模式。
    PM2:穩壓器的數字內核關閉。32 MHzXOSC和 16 MHz RCOSC都不運行。32kHz RCOSC或32 kHz XOSC運行。復位、外部中斷或睡眠定時器過時時系統將轉到主動模式。less

    PM3:穩壓器的數字內核關閉。全部的振盪器都不運行。復位或外部中斷時系統將轉到主動模式。
幾種運行模式的對好比下表所示:函數

  

 

    PM2模式又叫LITE SLEEP模式,其功耗在毫安級別,多用於須要定時喚醒的場合,好比周期性地喚醒傳感器來進行數據的採集。
    PM3模式又叫作DEEP SLEEP模式,在幾種運行模式中功耗最低,在微安級別,多用於遠程遙控場合,好比使用CC2530作一個遠程遙控器,在沒有按鍵按下時,可以使其進入PM3模式以減小電能消耗。ui

     Z-STACK提供了兩種低功耗運行模式,PM2和PM3。PM2模式可被睡眠定時器,外部中斷和復位喚醒,PM3模式可被外部中斷和復位喚醒。htm

  在Z-Stack的使用文檔中得知爲了使設備可以進入睡眠模式,必須知足如下的條件:
       一、經過添加預編譯項POWER_SAVING來使能睡眠模式
       二、ZDO節點描述符指定「在空閒時發送功能是關閉的」,經過在f8wConfig.cfg文件中將RFD_RCVC_ALWAYS_ON設置爲FALSE來實現。
       三、全部的Z-Stack任務支持powersaving
       四、Z-Stack的各個任務沒有預約的活動事件
       五、MAC沒有預約的活動事件
  在進行設置以前,咱們先來了解一下Z-Stack進入睡眠模式的流程。blog

1、Z-Stack進入睡眠模式的流程分析
  在main函數的最後,程序進入osal_start_system函數開始進行輪詢機制,在osal_start_system函數的最後,程序經過判斷宏來肯定是否進行電源管理,以下所示:
#if defined( POWER_SAVING )
    else  // Complete pass through all task events with no activity?
    {
      osal_pwrmgr_powerconserve();  // Put the processor/system into sleep
    }
#endif隊列


[color=rgb(51, 102, 153) !important]複製代碼
  
  能夠看出若是咱們在預編譯時定義了宏POWER_SAVING,且知足else條件,程序就會調函數osal_pwrmgr_powerconserve,與else對應的if的條件是if (idx< tasksCnt) ,分析可知if是用來判斷當前系統有沒有要執行的任務,也就是說,要進入電源管理,還必須知足系統當前沒有正在執行的任務或者將要執行的任務。事件

  進入osal_pwrmgr_powerconserve函數後首先要進行兩次判斷,第一次判斷設備是否爲電池設備:pwrmgr_attribute.pwrmgr_device !=PWRMGR_ALWAYS_ON其中PWRMGR_ALWAYS_ON宏在OSAL_PwrMgr.h定義,使用電池供電的設備用宏PWRMGR_BATTERY來表示。
/* With PWRMGR_ALWAYS_ON selection, there is no power savings and the
* device is most likely on mains power. The PWRMGR_BATTERY selection allows
* the HAL sleep manager to enter SLEEP LITE state or SLEEP DEEP state.
*/
#define PWRMGR_ALWAYS_ON  0
#define PWRMGR_BATTERY    1路由


[color=rgb(51, 102, 153) !important]複製代碼
  第二次判斷是判斷是否全部的任務都支持power saving:
                                              if ( pwrmgr_attribute.pwrmgr_task_state == 0 )

  確認這兩個條件都知足後先關閉中斷HAL_ENTER_CRITICAL_SECTION( intState );而後獲取下一次任務截止的時間,next = osal_next_timeout(); 而後再使能中斷HAL_EXIT_CRITICAL_SECTION(intState );在獲取下一次任務截止時間時關閉中斷是爲了避免影響時間的獲取,獲取一個準確的時間,最後調用宏OSAL_SET_CPU_INTO_SLEEP( next );追蹤發現該宏其實是調用了函數halSleep,該函數在文件hal_sleep.c中,在hal_sleep函數中,首先來獲取Z-Stack下一次任務截止時間和MAC任務下一次截止時間的最小值,使用語句以下:
if (timeout == 0)//Z-Stack下一次任務截止時間爲0,即沒有預約的Z-Stack任務
  {
    timeout = MAC_PwrNextTimeout();//獲取MAC下一次任務的截止時間
  }
  Else //有預約的Z-Stack任務
  {
    /* get next MAC timer expiration */
    macTimeout = MAC_PwrNextTimeout();/獲取MAC下一次任務的截止時間
/* get lesser of two timeouts */
//獲取Z-Stack下一次任務截止時間和MAC任務下一次截止時間的最小值
    if ((macTimeout != 0) && (macTimeout < timeout))
    {
      timeout = macTimeout; //將最小的值做爲休眠時間
    }
  }


[color=rgb(51, 102, 153) !important]複製代碼
  獲取timeout後,接着經過判斷timeout來決定是進入PM2仍是PM3模式,halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER; 若是timeout爲0,及Z-Stack和MAC都沒有預約的任務,則系統進入PM3模式,若是不爲0就進入PM2模式。

  電源管理理念一般被電池供電的設備採納,而爲了維護網絡的完整性、穩定性,協調器和路由器通常不採用電池供電,也就是說只有終端設備常用電池供電,因此在使用時儘可能不要對協調器和路由器開啓POWER_SAVING選項。
  瞭解完大體過程後接下來介紹一下在Z-Stack中開啓PM二、PM3的方法。

2、Z-Stack開啓PM二、PM3的方法

第一步:添加預編譯項POWER_SAVING。
  右鍵工程名稱,選擇Options->C/C++Compiler/Preprocessor選項,在Defined Symbols框裏添加POWER_SAVING。

 

 


第二步:修改f8wConfig.cfg文件。

       找到-DRFD_RCVC_ALWAYS_ON將值改成-DRFD_RCVC_ALWAYS_ON=FALSE
  將-DPOLL_RATE=1000改成-DPOLL_RATE=0
  將-DQUEUED_POLL_RATE=0改成-DQUEUED_POLL_RATE=0
  將-DRESPONSE_POLL_RATE=100改成-DRESPONSE_POLL_RATE=0

下面對以上設置進行說明。
     Z-Stack工程中的ENDDEVICE默認狀況下是不使用電源管理的,所以自動輪詢消息機制是打開的。在工程中有三個輪詢選項,每個都有一個定時延時時間,所以每一個輪詢都會影響到睡眠機制,定時的時間延遲不能使設備進入PM3模式,這在必定程度上了增長了電能的消耗。這三個輪詢選項的描述分別以下:
      一、Data Request Polling, 週期性地向父節點發送數據請求來輪詢消息隊列。輪詢的時間間隔由NLME_SetPollRate函數或者zgPollRate設定,若是先前是被禁止的,那麼在調用NLME_SetPollRate函數時就會當即開始輪詢。
      二、Queued Data Polling, 在收到數據指示後,就會向父節點請求消息,這個時間間隔能夠經過函數NLME_SetQueuedPollRate或者zgQueuedPollRate參數來設定。
      三、Response DataPolling,在收到數據確認指示後,就會向父節點請求響應消息,這個時間間隔能夠由NLME_SetResponsePollRate函數或者是zgResponsePollRate參數來設定。
  上述的三個參數和函數都是僅終端設備可用,在ZStack中,默認地使用指定參數值的方法來設置輪詢時間,在ZGlobals.c中能夠看到:
                                                          // Polling values
                                                         uint16 zgPollRate= POLL_RATE;
                                                         uint16zgQueuedPollRate = QUEUED_POLL_RATE;
                                                         uint16zgResponsePollRate = RESPONSE_POLL_RATE;
                                                         uint16 zgRejoinPollRate =REJOIN_POLL_RATE;
  而POLL_RATE、QUEUED_POLL_RATE、RESPONSE_POLL_RATE三個參數則在文件f8wConfig.cfg被設置,如上所述。對於上述三個參數,若是隻是使用默認的設置,則只能進入PM2模式,要想可以進入PM3模式,就必須將上述三個參數的值設置爲0.
  在f8wConfig.cfg文件的最後還有一個輪詢的參數——從新加入參數,就是在加入網絡不成功的時候會在設定的時間到後從新請求加入網絡,-DREJOIN_POLL_RATE。若是想在只有終端節點沒有協調器的狀況下作低功耗的實驗,能夠將這個參數設置爲0,這樣設備就不會每440毫秒(默認值爲440)進入PM2模式一次了。
第三步:配置存在輪詢的程序,也就是有預約活動的任務。

  上面提到過預約活動的任務會使系統只能進入PM2模式,這些預約的互動包括Z-Stack和MAC的,而在Z-Stack中凡是使用到函數osal_start_timerEx的地方都會產生預約的任務活動。在Z-Stack中,有兩個地方會用到osal_start_timerEx函數,一個是使用輪詢法來掃描按鍵時,另外一個是在應用層中一些用戶自定義的定時任務,因此要想使設備可以進入PM3模式,就要屏蔽掉這兩處。第一是將按鍵的機制改成中斷方式,在InitBoard函數的else分支中將OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE;改成OnboardKeyIntEnable= HAL_KEY_INTERRUPT_ENABLE;而後將應用層中全部使用到osal_start_timerEx函數的地方都屏蔽掉就好了。
第四步:

  上面提到在進入osal_pwrmgr_powerconserve函數後會對電源管理屬性進行兩次判斷,以肯定設備爲電池供電設備,同時全部的任務支持powersaving,這部分的設置在函數osal_pwrmgr_init中完成,將函數修改成以下便可:void osal_pwrmgr_init( void ){  //pwrmgr_attribute.pwrmgr_device = PWRMGR_ALWAYS_ON; // Default to no power //conservation.  pwrmgr_attribute.pwrmgr_device = PWRMGR_BATTERY;  pwrmgr_attribute.pwrmgr_task_state = 0;            // Cleared.  All set to conserve

相關文章
相關標籤/搜索