新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 前后臺(tái)系統(tǒng)的低功耗編程思想——STM8平臺(tái)

        前后臺(tái)系統(tǒng)的低功耗編程思想——STM8平臺(tái)

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

          1.前言

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

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

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

          1.善用節(jié)拍

          2.消除阻塞

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

          2.善用節(jié)拍

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

            

         

          圖1 前后臺(tái)系統(tǒng)中的低功耗節(jié)拍

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

          void main(void)

          {

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

          CLK_Config();

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

          GPIO_Config();

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

          TIM4_Config();

          while (1)

          {

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

          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);

          }

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

          3.消除阻塞

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

          4.總結(jié)

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



        關(guān)鍵詞: STM8 MCU

        評(píng)論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 怀柔区| 彭州市| 长岭县| 保康县| 申扎县| 清水河县| 东乡族自治县| 定结县| 黄骅市| 县级市| 科尔| 双辽市| 德清县| 溧水县| 金华市| 双城市| 鞍山市| 盘山县| 黔南| 江油市| 吴川市| 乌审旗| 湟中县| 监利县| 稷山县| 梁平县| 克东县| 安龙县| 松溪县| 弥勒县| 绥化市| 新邵县| 英吉沙县| 乐陵市| 旺苍县| 蒲城县| 赤城县| 苍南县| 义乌市| 二连浩特市| 崇信县|