<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

作者: 時(shí)間:2017-02-28 來(lái)源:網(wǎng)絡(luò ) 收藏

  1.前言

本文引用地址:http://dyxdggzs.com/article/201702/344589.htm

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

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

  1.善用節拍

  2.消除阻塞

  下面就結合談?wù)勅绾螌?shí)踐以上兩點(diǎn)。(雖然并不是嚴格意義上的低功耗MCU,但是只要有低功耗指令的MCU都可以使用以上兩點(diǎn),發(fā)揮它的低功耗特性)

  2.善用節拍

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

    

 

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

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

  void main(void)

  {

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

  CLK_Config();

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

  GPIO_Config();

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

  TIM4_Config();

  while (1)

  {

  // 進(jìn)入等待模式,CPU停止工作,所有中斷打開(kāi)

  Enter_WaitMode();

  // LED閃爍任務(wù)

  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繼續工作的一定是定時(shí)器4溢出中斷,其他中斷例如UART接收中斷則不能使CPU重新運行。STM8的等待模式和定時(shí)器4溢出中斷組成了低功耗節拍”任務(wù)“。

  3.消除阻塞

  從上文的分析可以看出,在整個(gè)的運行周期中總是希望低功耗任務(wù)所占的比重大(從時(shí)間角度切入),其他任務(wù)所占的比重小。那么其他任務(wù)應該盡量減少對CPU的占用,例如實(shí)現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在低功耗任務(wù)之后運行,而低功耗任務(wù)所占用CPU的時(shí)間為固定時(shí)間——定時(shí)器4溢出周期,也就意味著(zhù)LED任務(wù)的調用周期為1ms,利用該特性可以結合一個(gè)計數變量LEDCounter實(shí)現LED閃爍功能,當然更復雜的時(shí)序可以通過(guò)有限狀態(tài)機實(shí)現。

  4.總結

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



關(guān)鍵詞: STM8 MCU

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>