工作之後接觸了「低功耗」,開始搜尋各種各樣的低功耗mcu。網路是乙個非常自由的地方,你總可以看到各種關於哪個mcu功耗更低的論戰,在這些論戰中我查閱了幾乎所有低功耗mcu的特性,例如msp430、efm32還有stm32l等,網路論戰的核心便是哪款mcu的休眠電流更低。看多了資料我便發現,這些低功耗的mcu如何使用,低功耗mcu的程式編寫和普通mcu程式設計有什麼區別。
帶著這些疑問我繼續品味關於低功耗mcu的」論戰「,直到我購買了《msp430系列微控制器系統工程設計與實踐》。在該書中提到了低功耗mcu程式設計的基本思想,大致可以總結為:
1.善用節拍
2.消除阻塞
下面就結合stm8談談如何實踐以上兩點。(雖然stm8並不是嚴格意義上的低功耗mcu,但是只要有低功耗指令的mcu都可以使用以上兩點,發揮它的低功耗特性)
定時休眠是低功耗mcu常用的手段,定時休眠便是讓mcu先休眠再工作,在休眠和工作之間不停轉換。stm8有多種低功耗方式,例如等待模式便是其中的一種,等待模式時僅mcu停止工作,其他外設可正常工作。使用等待模式可以保證定時器或uart等可以正常的進入中斷。當然也可以使用停止模式進一步降低功耗,在這裡則使用等待模式做乙個「方法性質」的說明。
圖1 前後臺系統中的低功耗節拍
可以這樣理解,定時進入低功耗模式也可以理解為乙個任務,這個「任務」會阻塞cpu使得其他任務無法得到執行,但這並不是真正意義的阻塞cpu,而是使得cpu停止只能通過定時器中斷才可以退出該」任務「。實現部分的**如下:
void main(void)
}void enter_waitmode(void)
}interrupt_handler(tim4_upd_ovf_irqhandler, 23)
以上****現了waitflag標誌位,該標誌位出現在enter_waitmode函式和tim4_upd_ovf_irqhandler中斷中,該標誌位的作用是保證喚醒cpu繼續工作的一定是定時器4溢位中斷,其他中斷例如uart接收中斷則不能使cpu重新執行。stm8的等待模式和定時器4溢位中斷組成了低功耗節拍」任務「。
從上文的分析可以看出,在整個的執行週期中總是希望低功耗任務所佔的比重大(從時間角度切入),其他任務所佔的比重小。那麼其他任務應該儘量減少對cpu的占用,例如實現led間隔閃爍便可使用以下**:
void led_process(void)
}
由於led_process在低功耗任務之後執行,而低功耗任務所占用cpu的時間為固定時間——定時器4溢位週期,也就意味著led任務的呼叫週期為1ms,利用該特性可以結合乙個計數變數ledcounter實現led閃爍功能,當然更複雜的時序可以通過有限狀態機實現。
節拍執行和消除阻塞算是低功耗mcu程式設計的基本思想,理解了低功耗mcu程式設計的基本思路那麼不是低功耗的mcu也可以用來開發出低功耗應用。前段時間上tb檢視mcu的**,stm8的**真的把我嚇了一跳,自己也購置了stm8開發板,結合低功耗方法於是總結了該文章。
工程**分享
若結合作業系統實現低功耗,請參考以下
博文未來的安排——嘗試一下stm8和si4432如何!
MSP430 我的低功耗系統程式設計模板
主要應用前後台程式結構來實現,前台程式是各種中斷等突發事件,後台程式就是主迴圈,處理各種事件引起的各種任務 include msp430g2553.h int gtaskflag 0 任務標誌 位 void sysinit void main void if gtaskflag 0x0002 0x0...
低功耗微控制器系統的設計策略
嵌入式系統的低功耗設計需要全面分析各方面因素,統籌規劃。在設計之初,各個因素往往是相互制約 相互影響的,乙個降低系統功耗的措施有時會帶來其他方面的 負效應 因此,降低系統整體功耗,需要仔細分析和計算。本文從硬體和應用軟體設計兩個方面,闡述乙個以 微控制器為核心的嵌入式系統低功耗設計時所需考慮的一些問...
微控制器系統ram的低功耗測試方法
在各種微控制器應用系統中,儲存器的正常與否,直接關係到該系統的正常工作。為了提高系統的可靠性,對系統的可靠性進行測試是十分必要的。通過測試可以有效地發現並解決因儲存器發生故障對系統帶來的破壞問題。常用的微控制器系統ram測試方法,並在march g演算法的基礎上提出了一種低功耗的改進方法。它具有測試...