<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                * 導師視頻講解:[**去聽課**](https://www.bilibili.com/video/BV1k34y1D7Vz?p=15) >[success] **技術支持說明:** >**1**.一般以自主學習為主 > **2**.可到官方問答社區中提問:[**去提問**](https://bbs.csdn.net/forums/zigbee) > **3**.工程師**會盡快**解答社區問題,但他們是一線開發,【**難以保證**】解答時效,解答辛苦,感謝理解! <br/> ## **理論基礎** * **休眠及喚醒**:CC2530內部有很多模塊,例如定時器模塊、收發器模塊和51內核等等,這些數字模塊不工作時就不耗電,我們把模塊這種狀態稱為“**休眠**”。這些模塊由“休眠”狀態進入工作狀態時,這個過程稱為“**喚醒**”。 ### * **低功耗**:低功耗是指芯片耗電量非常少。一般地,耗電量的大小取決于芯片內部有多少模塊處于休眠狀態,有多少模塊處于工作狀態。我們也可以給低功耗分等級:芯片內部的越多模塊處于休眠狀態,其功耗就越低。 ### * **低功耗定時器**:也稱為休眠定時器,可以定時一段時間,在這段時間內會讓相關模塊進入休眠狀態,時間到了再將其喚醒。 CC2530中的休眠定時器是一個24 位的定時器,其時鐘頻率為:32768kHz <br/> ## **電源管理模式** CC2530有以下集中電源管理模式: * **全功能模式**:高頻晶振(16M或者32M)和低頻晶振(32.768K RCOSC/XOSC)全部工作,數字處理器模塊正常工作 ### * **空閑模式**:除了CPU內核停止運行之外,其他和全功能模式一樣 ### * **PM1**:高頻晶振關閉,低頻晶振正常工作,數字核心模塊正常工作 ### * **PM2**:低頻晶振工作,數字核心模塊關閉,系統通過RESET,外部中斷或者休眠計數器溢出喚醒 ### * **PM3**:晶振全部關閉,數字處理器核心模塊關閉,系統只能通過RESET或者外部中斷喚醒,此模式功耗最低 <br/> ## **相關寄存器** ![](https://img.kancloud.cn/0a/82/0a82c060fc9609e0fa8df5ecc37098c6_982x1076.png =500x) <br/> ## **寄存器配置** 休眠定時器初始化配置: ### ``` 1.ST2?=?0;??ST1?=?0;??ST0?=?0;??//?清零休眠定時器計數器?? 2.STIE?=?1;??//?開啟休眠定時器中斷?? 3.STIF?=?0;??//?清零休眠定時器中斷標志?? 4.EA??=?1;???//?打開中斷總開關 ``` ### 配置休眠時間: 1. 由于休眠定時器工作的時鐘頻率是32768HZ,也就是計數32768次為1秒! ### 2. 配置休眠時間時,只需要把當前的計數器數值讀出來,加上我們需要定時的時間計數值再重新設置到寄存器中即可: 讀取當前休眠定時器的計數值: ### ``` 1.uint32_t?sleepTimer?=?0;?? 2.sleepTimer??=?(uint32_t)ST0;?? 3.sleepTimer?|=?(uint32_t)ST1?<<?8;?? 4.sleepTimer?|=?(uint32_t)ST2?<<?16; ``` ### 加上我們需要定時的時間對應的計數次數,因為計數32768次為1秒,假設我們需要定時sec秒,那就是計數 sec \* 32768次: ### ``` 1.//?更新睡眠時間?? 2.sleepTimer?+=?(uint32_t)sec?*?32768;?? 把計數值重新配置到寄存器中 1.ST2?=?(uint8_t)(sleepTimer?>>?16);?? 2.ST1?=?(uint8_t)(sleepTimer?>>?8);?? 3.ST0?=?(uint8_t)(sleepTimer); ``` ### 配置休眠模式: ``` 1.SLEEPCMD?|=?mode;???//?設置該定時器Bit[1:0],mode:?0~3?????????? 2.PCON?=?0x01;????????//?進入睡眠模式 ``` 退出休眠模式: ``` 1.//?退出休眠?? 2.PCON?=?0x00; ``` <br/> ## **源碼分析** ### 主函數: ``` void main() { initLed(); initSleepTimer(); while(1) { uint8_t i; for (i = 0; i < 6; i++) { LED = (LED == LED_ON)?LED_OFF : LED_ON; delayMs(SYSCLK_32MHZ ,250); } DEBUG_LOG("Sleeping...\r\n"); setSleepPeriod(5); setPowerMode(POWER_MODE_PM2); } } ``` &emsp;&emsp;主函數初始化后做了兩件事情,閃爍3次LED燈,然后設置休眠定時器的定時時間為5秒,接著設置電源管理模式為PM2,然后就開始啟動進入休眠狀態了(CPU不工作)。 ### &emsp;&emsp;睡眠定時器中斷服務函數(休眠定時器到時間后會中斷,在中斷處理程序中,CPU重新工作起來): ``` /* * Sleep timer ISR */ #pragma vector = ST_VECTOR __interrupt void SleepTimer_ISR(void) { STIF = 0; // Clear interrupt flag setPowerMode(POWER_MODE_ACTIVE); // Entry active power mode DEBUG_LOG("Activing...\r\n"); } ``` ### 初始化休眠定時器函數: ``` static void initSleepTimer(void) { ST2 = 0; ST1 = 0; ST0 = 0; STIE = 1; STIF = 0; EA = 1; } ``` 設置休眠定時器定時時間,即讀出當前計數值、加入新的數值、重新設置計數器: ``` static void setSleepPeriod(uint8_t nS) { uint32_t sleepTimer = 0; sleepTimer = (uint32_t)ST0; sleepTimer |= (uint32_t)ST1 << 8; sleepTimer |= (uint32_t)ST2 << 16; sleepTimer += (uint32_t)nS * 32768; ST2 = (uint8_t)(sleepTimer >> 16); ST1 = (uint8_t)(sleepTimer >> 8); ST0 = (uint8_t)(sleepTimer); } ``` 設置電源模式(低功耗模式): ``` static void setPowerMode(PowerMode_t mode) { if (mode > _POWER_MODE_MAX) { DEBUG_LOG("Power mode not found: %d\r\n", (int)mode); return; } if (mode == POWER_MODE_ACTIVE) { PCON = 0x00; return; // Don't sleep } SLEEPCMD |= mode; // Set power mode PCON = 0x01; // Entering sleep mode } ``` 休眠定時器有4種電源模式,我們把這幾種模式定義為類型PowerMode\_t: ``` /* * Power modes: Active mode, PM1, PM2, PM3 */ typedef enum { POWER_MODE_IDLE = 0, POWER_MODE_PM1 = 1, POWER_MODE_PM2 = 2, POWER_MODE_PM3 = 3, POWER_MODE_ACTIVE = 4, _POWER_MODE_MAX = POWER_MODE_ACTIVE, }PowerMode_t; ``` <br/> ## **調試仿真** >[danger] 在學習本節課前,需要先掌握基本的程序下載及仿真操作,參考:[程序下載及仿真](2482302) 編譯完成后,通過仿真器連接開發板和電腦,進入仿真模式: ![](https://img.kancloud.cn/96/e9/96e92a299fc68c70bdf883d73423d163_444x504.png =300x) &emsp;&emsp;可以看到,開發板在LED閃爍3次后就打印Sleep...,這個時候CC2530進入了休眠狀態。休眠定時器在定時時間到了后會觸發中斷,中斷服務函數中會讓芯片重新進入正常工作狀態。 <br/> <br/> ## **項目定制** * 如需項目定制開發,可掃碼添加項目經理好友(注明“**項目定制**”) * 定制范圍:**NB-IoT**、**CATn(4G)**、**WiFi**、**ZigBee**、**BLE Mesh**以及**STM32**、**嵌入式Linux**等IoT技術方案 * 善學坊官網:[www.sxf-iot.com](https://www.sxf-iot.com/) ![](https://img.kancloud.cn/ca/73/ca739f92cab220a3059378642e3bd502_430x430.png =200x) * 非項目定制**勿擾**,此處**非**技術支持
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看