[ZigBee] 10、ZigBee之睡眠定時器


 

0、概述

  睡眠定時器用於設置系統進入和退出低功耗睡眠模式之間的周期。睡眠定時器還用於當進入低功耗睡眠模式時,維持定時器2 的定時。

  睡眠定時器的主要功能如下:

● 24 位的定時器正計數器,運行在32kHz 的時鍾頻率
● 24 位的比較器,具有中斷和DMA 觸發功能
● 24 位捕獲

 

1、概述

  睡眠定時器是一個24 位的定時器,運行在一個32kHz 的時鍾頻率(可以是RCOSC 或XOSC)上。定時器在復位之后立即啟動,如果沒有中斷就繼續運行。定時器的當前值可以從SFR 寄存器ST2:ST1:ST0 中讀取。

 

2、定時器比較

  一次定時器比較發生在定時器的值等於24位比較器的值,寄存器ST2:ST1:ST0可以用來設置比較器的值。 當STLOAD.LDRDY=1寫入ST0發起加載新的比較值。當STLOAD.LDRDY=0軟件不能開始一個新的加載,直到它為1。 

  Reading ST0 captures(捕獲) the current value of the 24-bit counter. Thus, the ST0 register must be read before ST1 and ST2 to capture a correct Sleep Timer count value.

  When a timer compare occurs the interrupt flag STIF is asserted.

  The current timer value is updated each time a positive clock edge on the 32 kHz clock is detected by the system clock. Thus, when returning from PM1/2/3 (where the system clock is shut down) the Sleep Timer value in ST2:ST1:ST0 is not up-to-date if a positive edge on the 32 kHz clock has not been detected yet. To ensure an updated value is read, wait for a positive transition on the 32 kHz clock by polling(輪詢) the SLEEPSTA.CLK32K bit, before reading the Sleep Timer value.

  The interrupt enable bit for the ST interrupt is IEN0.STIE, and the interrupt flag is IRCON.STIF.

  當運行在除了PM3之外的所有供電模式,睡眠定時器才會運行。因此,睡眠定時器的值在PM3模式下不保存。在PM1和PM2模式下,睡眠定時器捕獲事件用來喚醒設備到active模式進行active操作。The default value of the compare value after reset is 0xFF FFFF。

  The Sleep Timer compare can also be used as a DMA trigger, here I don't want to talk about.

  Note that: if supply voltage drops below 2 V while in PM2, 睡眠間隔 might be affected.

 

3、定時器捕獲 

  當設置了已選I/O 引腳的中斷標志,且32 kHz 時鍾檢測到這一事件時,發生定時器捕獲。 Sleep Timer capture is enabled by setting STCC.PORT[1:0] and STCC.PIN[2:0] to the I/O pin that is to be used to trigger the capture. When STCS.VALID goes high, the capture value in STCV2:STCV1:STCV0 can be read.

  捕獲值多於在I/O 引腳上的事件瞬間的值,因此如果時序需要,軟件必須從捕獲的值中間減去一個。要使能一個新的捕獲,遵循以下步驟:

1. 清除STCS.VALID。
2. 等待直到SLEEPSTA.CLK32K 變為低電平。
3. 等待直到SLEEPSTA.CLK32K 變為高電平。
4. 清除P0IFG/P1IFG/P2IFG 寄存器中的引腳中斷標志。

  This sequence, using rising edge on P0.0 as an example, is shown in following:

 

  It is not possible to switch input capture pin while capture is enabled. Capture must be disabled before a new input capture pin can be selected. To disable capture follow these steps (if disabling interrupts for up to half a 32 kHz cycle (~15.26 ms) is OK):

1. Disable interrupts
2. Wait until SLEEPSTA.CLK32K is high.
3. Set STCC.PORT[1:0] to 3. This disables capture.

 

4、睡眠定時器寄存器

  睡眠定時器使用的寄存器是:

• ST2 – 睡眠定時器2
• ST1 – 睡眠定時器1
• ST0 – 睡眠定時器0
· STLOAD – 睡眠定時器加載狀態
· STCC – 睡眠定時器捕獲控制
· STCS – 睡眠定時器捕獲狀態
· STCV0 – 睡眠定時器捕獲值字節0
· STCV1 – 睡眠定時器捕獲值字節1
· STCV2 – 睡眠定時器捕獲值字節2

 

5、DEMO PROJECT——系統睡眠中斷喚醒

  Zigbee的特點是遠距離低功耗的無線傳輸設備,節點模塊閑時可以進入睡眠模式,在需要傳輸數據時候進行喚醒,能進一步節省電量。

    系統電源有以下幾種管理模式:

  • * 全功能模式:高頻晶振(16M或者32M)和低頻晶振(32.768K RCOSC/XOSC)全部工作,數字處理器模塊正常工作;
    * PM1:高頻晶振關閉,低頻晶振正常工作,數字核心模塊正常工作;
    * PM2:低頻晶振工作,數字核心模塊關閉,系統通過RESET,外部中斷或者睡眠計數器溢出喚醒;
    * PM3:晶振全部關閉,數字處理器核心模塊關閉,系統只能通過RESET或者外部中斷喚醒,此模式功耗最低;

  本工程實現的功能是:將睡眠模式下的CC2530通過安檢中斷喚醒,觀察LED閃爍現象。

代碼:

  1 /****************************************************************************
  2 * 文 件 名: main.c
  3 * 描    述: LED1閃爍3次后進入睡眠狀態,通過按下按鍵S1產生外部中斷進行喚醒
  4 ****************************************************************************/
  5 #include <ioCC2530.h>
  6 
  7 typedef unsigned char uchar;
  8 typedef unsigned int  uint;
  9 
 10 #define LED1 P1_0            //P1.0口控制LED1
 11 #define KEY1 P0_1            //P0.1口控制S1
 12 
 13 
 14 /****************************************************************************
 15 * 名    稱: DelayMS()
 16 * 功    能: 以毫秒為單位延時 16M時約為535,系統時鍾不修改默認為16M
 17 * 入口參數: msec 延時參數,值越大,延時越久
 18 * 出口參數: 無
 19 ****************************************************************************/
 20 void DelayMS(uint msec)
 21 { 
 22     uint i,j;
 23     
 24     for (i=0; i<msec; i++)
 25         for (j=0; j<535; j++);
 26 }
 27 
 28 /****************************************************************************
 29 * 名    稱: InitLed()
 30 * 功    能: 設置LED燈相應的IO口
 31 * 入口參數: 無
 32 * 出口參數: 無
 33 ****************************************************************************/
 34 void InitLed(void)
 35 {
 36     P1DIR |= 0x01;           //P1.0定義為輸出口
 37     LED1 = 1;                //LED1燈上電默認為熄滅 
 38 }
 39 
 40 /****************************************************************************
 41 * 名    稱: InitKey()
 42 * 功    能: 設置KEY相應的IO口,采用中斷方式 
 43 * 入口參數: 無
 44 * 出口參數: 無
 45 ****************************************************************************/
 46 void InitKey()  47 {  48 P0IEN |= 0x2; // P0.1 設置為中斷方式 1:中斷使能  49 PICTL |= 0x2; //下降沿觸發   50 IEN1 |= 0x20; //允許P0口中斷;   51 P0IFG = 0x00; //初始化中斷標志位  52 EA = 1; //打開總中斷  53 }  54 
 55 /****************************************************************************
 56 * 名    稱: SysPowerMode()
 57 * 功    能: 設置系統工作模式
 58 * 入口參數: mode等於0為PM0 1為PM1 2為PM2 3為PM3             
 59 * 出口參數: 無
 60 ****************************************************************************/
 61 void SysPowerMode(uchar mode)  62 {  63 if(mode > 0 && mode < 4)  64  {  65 SLEEPCMD |= mode; //設置系統睡眠模式   66 PCON = 0x01; //進入睡眠模式 ,通過中斷喚醒  67  }  68 else  69 PCON = 0x00; //主動/空閑模 通過中斷喚醒系統   70 }  71 
 72 /****************************************************************************
 73 * 名    稱: P0_ISR(void) 中斷處理函數 
 74 * 描    述: #pragma vector = 中斷向量,緊接着是中斷處理程序
 75 ****************************************************************************/
 76 #pragma vector = P0INT_VECTOR 
 77 __interrupt void P0_ISR(void) 
 78 { 
 79     if(P0IFG > 0) 
 80     { 
 81         P0IFG = 0;           //清標志位
 82     } 
 83     
 84     P0IF = 0; //清中斷  85     SysPowerMode(4); //正常工作模式
 86 } 
 87 
 88 /****************************************************************************
 89 * 程序入口函數
 90 ****************************************************************************/
 91 void main(void)
 92 {   
 93     uchar i=0;  
 94       
 95     InitLed();                 //設置LED燈相應的IO口     
 96     InitKey();               //設置KEY相應的IO口
 97     
 98     while(1)
 99     {
100         for (i=0; i<6; i++)  //LED1閃爍3次提醒用戶將進入睡眠模式
101         {
102             LED1 = ~LED1;
103             DelayMS(500);
104         }
105 
106         SysPowerMode(3); //進入睡眠模式PM3,按下按鍵S1中斷喚醒系統 
107     }
108 }

第46~53行按鍵中斷可以參考[ZigBee] 4、ZigBee基礎實驗——中斷中的介紹,我們重點看:

 61 void SysPowerMode(uchar mode) 62 { 63 if(mode > 0 && mode < 4) 64  { 65 SLEEPCMD |= mode; //設置系統睡眠模式 66 PCON = 0x01; //進入睡眠模式 ,通過中斷喚醒 67  } 68 else 69 PCON = 0x00; //主動/空閑模 通過中斷喚醒系統 70 }

其中SLEEPCMD:在main函數中設置為3表示進入10模式即power mode2模式,此時低頻晶振工作,數字核心模塊關閉,系統可通過RESET,外部中斷或者睡眠計數器溢出喚醒,也就是進入了休眠模式~ 

 

PCON為:給該位賦值1導致設備強制進入SLEEPCMD.MODE設置的Power Mode,在活動時任何使能的中斷都會導致該位被清0,設備重新進入活動模式。因此當觸發按鍵中斷傳入SysPowerMode中的參數為4,將執行PCON=0x00,使系統重新進入活動狀態。

 

該工程本應該在電源管理部分講完之后講,不過放在這里大家就照着寄存器逐行代碼去理解吧~~~

 

 

Zigbee系列文章:

[ZigBee] 1、 ZigBee簡介

[ZigBee] 2、 ZigBee開發環境搭建

[ZigBee] 3、ZigBee基礎實驗——GPIO輸出控制實驗-控制Led亮滅

[ZigBee] 4、ZigBee基礎實驗——中斷

[ZigBee] 5、ZigBee基礎實驗——圖文與代碼詳解定時器1(16位定時器)(長文)

[ZigBee] 6、ZigBee基礎實驗——定時器3和定時器4(8 位定時器)

[ZigBee] 7、ZigBee之UART剖析(ONLY串口發送)

[ZigBee] 8、ZigBee之UART剖析·二(串口收發)

[ZigBee] 9、ZigBee之AD剖析——AD采集CC2530溫度串口顯示

 

 

PS:如果您覺得還不錯,點個贊,讓更多人受益~

@beautifulzzzz 2016-07-16 continue~  
e-mail:beautifulzzzz@qq.com 
sina:http://weibo.com/beautifulzzzz?is_all=1

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM