《電子技術應用》
您所在的位置:首頁 > 電源技術 > 設計應用 > CC2430的睡眠功能及喚醒方法
CC2430的睡眠功能及喚醒方法
摘要: 一篇,我們來討論一下CC2430的睡眠功能及喚醒方法。在實際運用中的CC2430節點一般是靠電池來供電,因此對其功耗的控制顯得至關重要。
Abstract:
Key words :

  一、承上啟下

  這一篇,我們來討論一下CC2430的睡眠功能及喚醒方法。在實際運用中的CC2430節點一般是靠電池來供電,因此對其功耗的控制顯得至關重要。

  下面是摘自CC2430中文手冊對CC2430的4種功耗模式的介紹:

  查看原圖(大圖)

  從上表中可看出,CC2430共有4種電源模式:PM0(完全清醒),PM1(有點瞌睡)、PM2(半醒半睡)、PM3(睡的很死)。越靠后,被關閉的功能越多,功耗也越來越低。它們之間的轉化關系如下:

  

  把 PM1、PM2 喚醒到PM0,有三種方式:復位、外部中斷、睡眠定時器中斷;但把 PM3 喚醒到 PM0,只有兩種方式:復位、外部中斷(這是因為在 PM3 下,所有振蕩器均停止工作,睡眠定時器當然也熄火啦~)

  下面我們通過一個小實驗,來介紹如何進入睡眠模式,以及如何喚醒到 PM0 狀態。

  二、系統睡眠及中斷喚醒實驗

 ?。?)實驗簡介

  系統初始化,處于PM0

  → 進入PM1

  → 1s后被睡眠定時器喚醒為PM0

  → 進入PM2

  → 2s后被睡眠定時器喚醒為PM0

 

  → 進入PM3

  → 等待按鍵S1按下,觸發外部中斷,被喚醒為PM0 

  (2)程序流程圖

  查看原圖(大圖)

 ?。ㄗⅲ荷蠄D中的圓角框表示系統的運行狀況)

  (3)實驗源碼及剖析(下面的框框是可以點的~)

  頭文件及宏定義

/*

  實驗說明:中斷喚醒睡眠實驗,分別介紹三種睡眠模式下的喚醒

*/

#include 

#define LED_ON 0

#define LED_OFF 1

#define led1 P1_0     

#define led2 P1_1     

#define led3 P1_2     

#define led4 P1_3  

  子函數

/*系統時鐘初始化

-------------------------------------------------------*/

void xtal_init(void)

{

 SLEEP &= ~0x04;       //都上電

 while(!(SLEEP & 0x40));   //晶體振蕩器開啟且穩定

 CLKCON &= ~0x47;     //選擇32MHz 晶體振蕩器

 SLEEP |= 0x04;

}

/*LED初始化

-------------------------------------------------------*/

void led_init(void)

{

 P1SEL = 0x00;     //P1為普通 I/O 口

 P1DIR |= 0x0F;     //P1.0 P1.1 P1.2 P1.3 輸出

 led1 = LED_OFF;     //關閉所有LED

 led2 = LED_OFF;

 led3 = LED_OFF;

 led4 = LED_OFF;

}

/*外部中斷初始化

-------------------------------------------------------*/

void io_init(void)

{

  P0INP &= ~0X02;  //P0.1有上拉、下拉

  EA = 1;      //總中斷允許

  IEN1 |= 0X20;  // P0IE = 1,P0中斷使能

  PICTL |= 0X09;  //P0.1允許中斷,下降沿觸發

  P0IFG &= ~0x02;  //P0.1中斷標志清0

}

/*睡眠定時器中斷初始化

-------------------------------------------------------*/

void sleepTimer_init(void)

{

 STIF=0;  //睡眠定時器中斷標志清0

 STIE=1;  //開睡眠定時器中斷

 EA=1;   //開總中斷

}

/*設置睡眠定時器的定時間隔

-------------------------------------------------------*/

void setSleepTimer(unsigned int sec)

{

 unsigned long sleepTimer = 0;

 sleepTimer |= ST0;           //取得目前的睡眠定時器的計數值

 sleepTimer |= (unsigned long)ST1 << 8;

 sleepTimer |= (unsigned long)ST2 << 16;

 sleepTimer += ((unsigned long)sec * (unsigned long)32768);  //加上所需要的定時時長

 ST2 = (unsigned char)(sleepTimer >> 16);  //設置睡眠定時器的比較值

 ST1 = (unsigned char)(sleepTimer >> 8); 

 ST0 = (unsigned char)sleepTimer;

}

/*選擇電源模式

-------------------------------------------------------*/

void PowerMode(unsigned char mode)

{

 if(mode<4)

 {

  SLEEP &= 0xfc;    //將SLEEP.MODE清0

  SLEEP |= mode;    //選擇電源模式

  PCON |= 0x01;    //啟用此電源模式

 }

}

/*延時函數

-------------------------------------------------------*/

void Delay(unsigned int n)

{

 unsigned int i,j;

 for(i=0;i

  for(j=0;j<1000;j++);

}

 

主函數

/*主函數

-------------------------------------------------------*/

void main(void)

{ 

 xtal_init();     

 led_init();     

 //PM0狀態,亮燈并延時

 led1 = LED_ON;     //亮LED1,表示統在PM0模式工作

 Delay(10);

 //PM1狀態,滅燈

 setSleepTimer(1);   //設置睡眠定時器的定時間隔為1s

 sleepTimer_init();   //開睡眠定時器中斷

 led1 = LED_OFF;

 PowerMode(1);     //設置電源模式為PM1

 //1s后,由PM1進入PM0,亮燈并延時

 led1 = LED_ON;

 Delay(50);

 //PM2,滅燈

 setSleepTimer(2);   //設置睡眠定時器的定時間隔為2s

 led1 = LED_OFF;

 PowerMode(2);     //設置電源模式為PM2

 //2s后,由PM2進入PM0,亮燈并延時

 led1=0;

 Delay(50); 

 //PM3,滅燈 

 io_init();       //初始化外部中斷

 led1 = LED_OFF;

 PowerMode(3);     //設置電源模式為PM3

 //當外部中斷發生時,由PM3進入PM0,亮燈

 led1 = LED_ON;

 while(1);

}

  中斷服務程序

/*外部中斷服務程序

-------------------------------------------------------*/

#pragma vector = P0INT_VECTOR

__interrupt void P0_ISR(void)

{

 EA = 0;             //關中斷

 Delay(50);

 if((P0IFG & 0x02 ) >0 )     //按鍵中斷

 {

  P0IFG &= ~0x02;        //P0.1中斷標志清0

 }

 P0IF = 0;            //P0中斷標志清0

 EA = 1;             //開中斷

}

/*睡眠定時器中斷服務程序

-------------------------------------------------------*/

#pragma vector= ST_VECTOR

__interrupt void sleepTimer_IRQ(void)

{

 EA=0;   //關中斷

 STIF=0;  //睡眠定時器中斷標志清0

 EA=1;   //開中斷

}

 

  關于如何使用睡眠定時器來喚醒系統,可以總結為如下流程:開睡眠定時器中斷 → 設置睡眠定時器的定時間隔 → 設置電源模式

 ?。ㄗⅲ?ldquo;設置睡眠定時器的定時間隔”這一步一定要在“設置電源模式”之前,因為進入睡眠后系統就不會繼續執行程序了)

  接下來,我們重點關注一下設置睡眠定時器定時間隔的子函數:setSleepTimer

  首先對睡眠定時器簡單的介紹一下:它是運行于32.768kHz的24位定時器,當系統運行在除了PM3之外的所有的電源模式下,睡眠定時器都會不間斷運行。

  睡眠定時器使用的寄存器有:ST0,ST1,ST2。下面是摘自CC2430中文手冊對其功能的詳細介紹:

  查看原圖(大圖)

  查看原圖(大圖)

  查看原圖(大圖)

 

  可以看出,它們的功能包括兩方面:讀,寫。

  讀:用于讀取當前定時器的計數值,讀的順序必須遵循:讀ST0 → 讀ST1 → 讀ST2

  寫:用于設置定時器的比較值(當定時器的計數值=比較值時,產生中斷),寫的順序必須遵循:寫ST2 → 寫ST1 → 寫ST0

  OK,接下來我們結合源碼來講解:

  (1)首先,定義一個unsigned long型變量(32位)sleepTimer,用于接收睡眠定時器的當前計數值:

 unsigned long sleepTimer = 0;

 sleepTimer |= ST0;           //取得目前的睡眠定時器的計數值

 sleepTimer |= (unsigned long)ST1 << 8;

 sleepTimer |= (unsigned long)ST2 << 16;

 ?。?)然后加上所需要的定時間隔:

 sleepTimer += ((unsigned long)sec * (unsigned long)32768);  //加上所需要的定時時長

  此處需要稍微解釋一下:

  為什么1s就代表著32768?因為定時器是工作在32.768kHz之下,所以定時器每加1,需耗時1/32768 s;加32768,就需要1s;

 ?。?)最后將sleepTimer的值作為定時器的比較值:

 ST2 = (unsigned char)(sleepTimer >> 16);  //設置睡眠定時器的比較值

 ST1 = (unsigned char)(sleepTimer >> 8); 

 ST0 = (unsigned char)sleepTimer;

  這樣,就可成功設置定時器的定時周期啦~

 ?。ㄗⅲ褐劣谠创a的其他部分,相信結合著詳細的注釋,大家可以輕松看懂,在此不作贅述)

 ?。?)實驗結果

  運行程序,觀察LED1,現象為:LED1閃爍(即亮->滅1次),1s后再次閃爍,2s后再次閃爍,然后保持熄滅狀態,然后按下S1,LED1亮。

 

  實驗現象和預期完全吻合,Over~

  三、結語

  吁~ 抽出2天的課余時間,終于搞定了這篇日志。真的發現寫博,特別是寫一篇“讀者友好”的博文,的確是一項體力活:嚴謹性、美觀性、邏輯性...都是要考慮的事兒。

  每次貼代碼都嫌太長,但又不太愿意使用博客園自帶的折疊工具。因此在本篇博文中,筆者試探性的加入了一些JQuery元素,實現了代碼的平滑折疊,還是有小小的成就感嘀,呵呵(JQuery菜鳥,高手勿笑~)。但當局者迷,我并不知這樣做是否真正增強了文章的可讀性,歡迎讀者朋友作出評論 :)

  這一個月,筆者真正決定在博客園扎下根來,于是花費了大量的課余時間在博文的寫作上。初次寫博,雖然評論很少,但大部分日志都有500以上的點擊率,也算是對我的小小的鼓勵!在博客園發表關于單片機的內容,的確需要勇氣,不過我會堅持寫下去的~

  從開始到現在的九篇博文,重點是CC2430芯片上的基本硬件模塊的運用。到此為止,我們基本上把CC2430上的大部分外設都過了一遍,但是還有比如Flash存取、隨機數發生器、AES協處理器、射頻通信等,還沒涉及到。不過Zigbee之旅并未結束,筆者打算在下一個主題(Z-Stack 協議的實現)中,再來有選擇性的把這些遺漏之處補齊。

  下一篇博文,筆者打算以一個稍帶綜合性與擴展性的小實驗——“溫度監測系統”來結束Zigbee的首次旅行,講解一下如何去綜合運用前面學到的知識點。

  其實根本沒有資格稱“講解”,作為一個初學者,筆者只希望在寫博的過程中與讀者互勉,共同進步!

此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          国产日韩久久| 亚洲国产成人av好男人在线观看| 日韩亚洲欧美一区| 黄色国产精品| 在线成人av| 欧美日韩综合另类| 国产日韩欧美在线视频观看| 免费观看成人www动漫视频| 欧美视频中文字幕在线| 欧美午夜视频在线| 欧美日韩伦理在线免费| 亚洲精品中文字幕在线| 国产视频在线一区二区| 欧美日韩在线观看一区二区| 亚洲二区精品| 性欧美暴力猛交另类hd| 国产精品嫩草久久久久| 亚洲天堂网站在线观看视频| 亚洲高清毛片| 欧美高清hd18日本| 国产精品国产三级国产普通话99| 久久www免费人成看片高清| 激情久久影院| 欧美视频精品在线观看| 欧美乱人伦中文字幕在线| 日韩视频中午一区| 久久国产欧美精品| 亚洲天堂av图片| 欧美激情一区二区久久久| 影视先锋久久| 国产精品毛片在线| 亚洲欧美在线x视频| 久久精品99国产精品酒店日本| 欧美wwwwww| 亚洲视频999| 韩日欧美一区| 欧美.com| 亚洲精品久久久久久久久久久久久| 国产精品理论片| 欧美日韩一区在线视频| 久热精品视频在线免费观看| 久久久久久夜精品精品免费| 一区二区三区免费网站| 免费不卡欧美自拍视频| 美玉足脚交一区二区三区图片| 久久综合99re88久久爱| 亚洲激情啪啪| 欧美日韩美女| 欧美日韩不卡在线| 国产在线拍揄自揄视频不卡99| 亚洲国产小视频| 欧美成人激情视频免费观看| 韩国欧美一区| 国产精品第一页第二页第三页| 国产伦精品一区二区三区| 亚洲激情社区| 久久久在线视频| 国产精品成人观看视频国产奇米| 欧美一区二区在线免费观看| 欧美一区二区三区喷汁尤物| 国产精品自在在线| 国产一区二区三区不卡在线观看| 亚洲免费在线视频一区 二区| 午夜亚洲福利在线老司机| 国产一区二区精品久久91| 在线电影一区| 亚洲视频一区二区| 欧美日本亚洲| 亚洲一区二区3| 欧美激情1区2区| 影音先锋久久| 欧美不卡视频| 亚洲国产精品美女| 国产在线拍揄自揄视频不卡99| 精品动漫3d一区二区三区免费| 国产精品美女黄网| 亚洲黄色一区二区三区| 欧美一乱一性一交一视频| 久久野战av| 蜜桃精品久久久久久久免费影院| 亚洲免费激情| 国产精品国产a| 亚洲欧美国产精品专区久久| 久久综合免费视频影院| 欧美久久久久中文字幕| 国产精品久久久久免费a∨| 亚洲欧美韩国| 国产精品高潮呻吟久久av无限| 欧美在线观看天堂一区二区三区| 亚洲第一久久影院| 欧美三级视频在线| 午夜精品久久久久久久| 亚洲午夜久久久久久久久电影院| 久久久久久网址| 亚洲香蕉视频| 欧美日韩国产一级| 99成人免费视频| 欧美一区二区三区在| 韩国视频理论视频久久| 免费国产自线拍一欧美视频| 亚洲电影天堂av| 久久人人超碰| 夜夜精品视频| 亚洲国产成人91精品| 欧美大片va欧美在线播放| 欧美va亚洲va日韩∨a综合色| 一区二区欧美在线观看| 欧美jjzz| 国产日韩欧美综合精品| 免费久久99精品国产自| 黄色成人av在线| 欧美日韩亚洲视频一区| 一本久久综合亚洲鲁鲁| 亚洲黄色三级| 欧美韩国一区| 国产乱码精品一区二区三区五月婷| 亚洲美女视频网| 久久香蕉精品| 蜜桃久久av一区| 精品成人一区二区三区四区| 99在线热播精品免费99热| 免费91麻豆精品国产自产在线观看| 欧美日本国产视频| 亚洲综合999| 亚洲一区日韩在线| 亚洲国产成人精品久久久国产成人一区| 欧美国产视频日韩| 国产日韩精品一区二区| 欧美精品一区在线发布| 国产精品一区在线观看你懂的| 日韩天堂av| 亚洲一区二区三区高清不卡| 亚洲伦理网站| 性欧美1819sex性高清| 亚洲欧美日韩视频二区| 国产亚洲欧美日韩精品| 国产精品视频男人的天堂| 亚洲黑丝一区二区| 久久av红桃一区二区小说| 久久一本综合频道| 国产精品乱码一区二三区小蝌蚪| 欧美午夜精品久久久久免费视| 欧美日韩视频在线观看一区二区三区| 国产一区在线免费观看| 最新国产の精品合集bt伙计| 欧美伦理91i| 欧美激情精品久久久久久久变态| 亚洲精品美女91| 欧美性色aⅴ视频一区日韩精品| 国产精品美女久久久久久免费| 亚洲人体影院| 国产精品免费福利| 久久av最新网址| 在线免费高清一区二区三区| 久久精品视频免费| 一区二区三区视频在线播放| 国产精品www| 欧美成人午夜激情在线| 欧美人与性动交α欧美精品济南到| 国产精品日韩在线观看| 国产一区二区三区在线播放免费观看| av成人免费| 亚洲在线播放电影| 亚洲一区二区在线观看视频| 亚洲午夜精品一区二区三区他趣| 性欧美xxxx大乳国产app| 国产精品久久久久久模特| 香蕉久久一区二区不卡无毒影院| 日韩视频中文| 国产欧美69| 美女精品国产| 玖玖精品视频| 久久伊人亚洲| 国产亚洲成av人片在线观看桃| 免费久久久一本精品久久区| 韩国一区二区三区在线观看| 亚洲国产91| 亚洲精品国产精品国自产观看| 国产在线视频欧美一区二区三区| 亚洲精品视频免费| 亚洲欧美日韩国产中文在线| 久久久青草婷婷精品综合日韩| 国产精品igao视频网网址不卡日韩| 韩国一区二区三区在线观看| 蜜桃av噜噜一区二区三区| 欧美日本亚洲韩国国产| 欧美在线综合| 欧美一区二区日韩一区二区| 国产女主播一区二区| 国产深夜精品| 国产免费亚洲高清| 久久久亚洲人| 国产精品av久久久久久麻豆网| 欧美极品色图| 在线亚洲精品福利网址导航| 欧美麻豆久久久久久中文| 黄色精品网站| 欧美在线中文字幕| 欧美精品1区2区3区| 欧美伦理影院| 在线中文字幕日韩| 久久久久99精品国产片| 国产精品久久久久一区二区| 国产一二精品视频| 欧美日韩伦理在线免费| 国产色产综合色产在线视频| 免费观看不卡av| 一区二区不卡在线视频 午夜欧美不卡'| 亚洲国产日韩一区二区| 亚洲欧美日韩一区在线观看| 久久久精品网| 激情综合自拍| 日韩视频在线永久播放| 久久免费精品视频| 久久黄色网页| 亚洲一区二区三区高清| 国产婷婷精品| 亚洲日韩欧美视频一区| 亚洲免费av网站| 亚洲二区三区四区| 欧美日韩国产小视频在线观看| 狠狠综合久久av一区二区老牛| 久久精品一区二区三区中文字幕| 麻豆精品传媒视频| 亚洲国产精品www| 亚洲国产一二三| 欧美aⅴ一区二区三区视频| 亚洲精品久久久久久久久久久久| 亚洲第一中文字幕在线观看| 亚洲一区二区三区777| 国产欧美亚洲视频| 亚洲午夜精品久久久久久浪潮| 在线日韩精品视频| 国产欧美精品一区aⅴ影院| 亚洲欧美www| 久久天天综合| 久久久精品视频成人| 欧美日韩亚洲高清| 国产日韩欧美中文| 国产日韩欧美自拍| 欧美日韩国产大片| 在线精品观看| 欧美综合二区| 国产一区二区三区精品久久久| 国产亚洲激情在线| 午夜在线a亚洲v天堂网2018| 亚洲精品五月天| 欧美视频1区| 国产精品色网| 国产精品久久久久影院亚瑟| 欧美韩国在线| 久久视频国产精品免费视频在线| 欧美日韩一区二区在线观看视频| 国产精品乱码一区二三区小蝌蚪| 欧美日韩国产精品自在自线| 亚洲欧美日本精品| 亚洲深夜福利在线| 国产一级揄自揄精品视频| 伊人一区二区三区久久精品| 欧美精品一区二区视频| 女人天堂亚洲aⅴ在线观看| 国产精品―色哟哟| 国产精品美女久久久久av超清| 国产欧美一区二区三区久久人妖| 欧美在线一二三四区| 国产亚洲精品bv在线观看| 亚洲欧美视频在线观看视频| 久久亚洲私人国产精品va媚药| 亚洲午夜影视影院在线观看| 欧美日本一区| 很黄很黄激情成人| 欧美极品一区二区三区| 亚洲一区二区三区四区在线观看| 在线播放豆国产99亚洲| 亚洲图片自拍偷拍| 国产亚洲欧美日韩一区二区| 亚洲人成亚洲人成在线观看| 国产精品欧美一区喷水| 蜜桃精品久久久久久久免费影院| 国产综合婷婷| 久久久综合香蕉尹人综合网| 欧美高清一区二区| 最新高清无码专区| 中文亚洲免费| 麻豆成人91精品二区三区| 激情综合视频| av成人免费在线观看| 国产精品露脸自拍| 国产精品毛片a∨一区二区三区|国| 亚洲男人第一av网站| 欧美一区二区三区视频免费| 韩国成人理伦片免费播放| 国产欧美日韩精品一区| 欧美一区二区三区在线免费观看| 欧美日韩国产成人在线91| 久久精品一区二区三区不卡牛牛| 亚洲午夜精品久久久久久app| 精品av久久707| 亚洲免费成人av电影| 影音先锋国产精品| 日韩视频三区| 国产精品一区二区三区久久| 亚洲视频一区二区在线观看| 欧美影院精品一区| 欧美激情一区二区三区在线视频观看| 国产日韩精品一区二区三区在线| 国产精品视频男人的天堂| 欧美片在线播放| 亚洲香蕉在线观看| 久久久精品一品道一区| 国产精品久久久久aaaa九色| 欧美日韩久久不卡| 欧美日韩精品一本二本三本| 国产欧美一区二区三区国产幕精品| 欧美日韩国产a| 欧美顶级艳妇交换群宴| 国产美女精品免费电影| 黑人一区二区三区四区五区| 欧美日韩高清在线一区| 亚洲欧洲偷拍精品| 欧美三级精品| 欧美日韩国产精品成人| 国际精品欧美精品| 欧美一级理论片| 亚洲毛片一区二区| 久久伊人精品天天| 亚洲激情视频| 久久视频一区二区|