新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 前后臺系統的低功耗編程思想——STM8平臺

        前后臺系統的低功耗編程思想——STM8平臺

        作者: 時間:2017-02-28 來源:網絡 收藏

          1.前言

        本文引用地址:http://www.104case.com/article/201702/344589.htm

          工作之后接觸了“低功耗”,開始搜索各種各樣的低功耗。網絡是一個非常自由的地方,你總可以看到各種關于哪個功耗更低的論戰,在這些論戰中我查閱了幾乎所有低功耗的特性,例如MSP430、EFM32還有STM32L等,網絡論戰的核心便是哪款MCU的休眠電流更低??炊嗔速Y料我便發現,這些低功耗的MCU如何使用,低功耗MCU的程序編寫和普通MCU編程有什么區別。

          帶著這些疑問我繼續品味關于低功耗MCU的”論戰“,直到我購買了《MSP430系列單片機系統工程設計與實踐》。在該書中提到了低功耗MCU編程的基本思想,大致可以總結為:

          1.善用節拍

          2.消除阻塞

          下面就結合談談如何實踐以上兩點。(雖然并不是嚴格意義上的低功耗MCU,但是只要有低功耗指令的MCU都可以使用以上兩點,發揮它的低功耗特性)

          2.善用節拍

          定時休眠是低功耗MCU常用的手段,定時休眠便是讓MCU先休眠再工作,在休眠和工作之間不停轉換。有多種低功耗方式,例如等待模式便是其中的一種,等待模式時僅MCU停止工作,其他外設可正常工作。使用等待模式可以保證定時器或UART等可以正常的進入中斷。當然也可以使用停止模式進一步降低功耗,在這里則使用等待模式做一個“方法性質”的說明。

            

         

          圖1 前后臺系統中的低功耗節拍

          可以這樣理解,定時進入低功耗模式也可以理解為一個任務,這個“任務”會阻塞CPU使得其他任務無法得到運行,但這并不是真正意義的阻塞CPU,而是使得CPU停止只能通過定時器中斷才可以退出該”任務“。實現部分的代碼如下:

          void main(void)

          {

          /* Clock configuration -----------------------------------------*/

          CLK_Config();

          /* GPIO configuration -----------------------------------------*/

          GPIO_Config();

          /* TIM4 configuration -----------------------------------------*/

          TIM4_Config();

          while (1)

          {

          // 進入等待模式,CPU停止工作,所有中斷打開

          Enter_WaitMode();

          // LED閃爍任務

          LED_Process();

          }

          }

          void Enter_WaitMode(void)

          {

          WaitFlag = 0;

          // 1ms之后CPU被TIM4中斷喚醒,WaitFlag在中斷中被置位

          while( WaitFlag == 0)

          {

          __wait_for_interrupt();

          }

          }

          INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)

          {

          WaitFlag = 1;

          /* Cleat Interrupt Pending bit */

          TIM4_ClearITPendingBit(TIM4_IT_UPDATE);

          }

          以上代碼中出現了WaitFlag標志位,該標志位出現在Enter_WaitMode函數和TIM4_UPD_OVF_IRQHandler中斷中,該標志位的作用是保證喚醒CPU繼續工作的一定是定時器4溢出中斷,其他中斷例如UART接收中斷則不能使CPU重新運行。STM8的等待模式和定時器4溢出中斷組成了低功耗節拍”任務“。

          3.消除阻塞

          從上文的分析可以看出,在整個的運行周期中總是希望低功耗任務所占的比重大(從時間角度切入),其他任務所占的比重小。那么其他任務應該盡量減少對CPU的占用,例如實現LED間隔閃爍便可使用以下代碼:

          void LED_Process(void)

          {

          static uint16_t LEDCounter = 0;

          if( LEDCounter++ > 500 )

          {

          LEDCounter = 0;

          /* Toggles LEDs */

          GPIO_WriteReverse(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS);

          }

          }

          由于LED_Process在低功耗任務之后運行,而低功耗任務所占用CPU的時間為固定時間——定時器4溢出周期,也就意味著LED任務的調用周期為1ms,利用該特性可以結合一個計數變量LEDCounter實現LED閃爍功能,當然更復雜的時序可以通過有限狀態機實現。

          4.總結

          節拍運行和消除阻塞算是低功耗MCU編程的基本思想,理解了低功耗MCU編程的基本思路那么不是低功耗的MCU也可以用來開發出低功耗應用。前段時間上TB查看MCU的價格,STM8的價格真的把我嚇了一跳,自己也購置了STM8開發板,結合低功耗方法于是總結了該文章。



        關鍵詞: STM8 MCU

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 梁河县| 桂平市| 炎陵县| 共和县| 望谟县| 二手房| 翁源县| 大邑县| 延川县| 固镇县| 虞城县| 巴东县| 九龙坡区| 西林县| 信阳市| 扬中市| 宿州市| 祁门县| 额尔古纳市| 丽水市| 定州市| 陵水| 镇坪县| 江门市| 五台县| 甘洛县| 东乌珠穆沁旗| 宁海县| 宣威市| 井陉县| 定结县| 肥西县| 新密市| 南郑县| 锡林郭勒盟| 周口市| 新乡市| 中山市| 嘉禾县| 云阳县| 惠水县|