低功耗是MCU的一項(xiàng)非常重要的指標(biāo),比如某些可穿戴的設(shè)備,其攜帶的電量有限,如果整個電路消耗的電量特別大的話,就會經(jīng)常出現(xiàn)電量不足的情況,影響用戶體驗(yàn)。
平時我們在做產(chǎn)品的時候,基本的功能實(shí)現(xiàn)很簡單,但只要涉及低功耗的問題就比較棘手了,比如某些可以低到微安級的MCU,而自己設(shè)計(jì)的低功耗怎么測都是毫安級的,電流竟然能夠高出標(biāo)準(zhǔn)幾百到上千倍,遇到這種情況千萬不要怕,只要認(rèn)真你就贏了。下邊咱們仔細(xì)分析一下這其中的原因。
第一條:掐斷外設(shè)命脈——關(guān)閉外設(shè)時鐘
先說最直觀的,也是工程師都比較注意的方面,就是關(guān)閉MCU的外設(shè)時鐘,對于現(xiàn)在市面上出現(xiàn)的大多數(shù)的MCU,其外設(shè)模塊都對應(yīng)著一個時鐘開關(guān)。只需要打開這個外設(shè)的時鐘,就可以正常的使用這個外設(shè)了,當(dāng)然,此外設(shè)也就會產(chǎn)生相應(yīng)的功耗;反之,如果想要讓這個外設(shè)不產(chǎn)生功耗,只需關(guān)閉它的時鐘即可。
第二條:讓工作節(jié)奏慢下來——時鐘不要倍頻
除了外設(shè)模塊功率消耗之外,還有一個功耗大戶需要注意一下,這就是PLL和FLL模塊。PLL和FLL主要是用來對原始的時鐘信號進(jìn)行倍頻操作,從而提高系統(tǒng)的整體時鐘,相應(yīng)的,其功耗也會被提上去。所以在進(jìn)入低功耗之前,需要切換是種模式,旁路掉PLL和FLL模塊,從而盡可能的降低MCU的功耗,等到MCU喚醒之后再把時鐘切換回去。
第三條:圍堵涓涓細(xì)流——注意I/O口的電平狀態(tài)
如果認(rèn)為只要關(guān)閉外設(shè)時鐘就能夠保證外設(shè)不再耗電,那么你就太天真了。如果IO口沒有做好處理的話,它就會在暗地里偷走功耗,而你卻渾然不知。具體原因是這樣的,一般的IO的內(nèi)部或者外部都會有上下拉電阻,舉個例子,如下圖所示,假如某個IO口有個10KΩ的上拉電阻,把引腳拉到3.3V,然而當(dāng)MCU進(jìn)入低功耗模式的時候,此IO口被設(shè)置成輸出低電平,根據(jù)歐姆定律,此引腳就會消耗3.3V/10K=0.33mA的電流,假如有四、五個這樣的IO口,那么幾個mA就貼進(jìn)去了,太可惜了。所以在進(jìn)入低功耗之前,請逐個檢查IO口的狀態(tài):
如果此IO口帶上拉,請?jiān)O(shè)置為高電平輸出或者高阻態(tài)輸入;
如果此IO口帶下拉,請?jiān)O(shè)置為低電平輸出或者高阻態(tài)輸入;
總之一句話,不要把上好的電流浪費(fèi)在產(chǎn)生熱量的功能上,咱可不靠這點(diǎn)溫度去暖手。
第四條:睦鄰友好合作——注意I/O與外設(shè)IC的統(tǒng)籌
IO口的上下拉電阻消耗電流這一因素相對比較明顯,下邊咱來說一個不明顯的因素:IO口與外部IC相連時的電流消耗。假如某個IO口自帶上拉,而此與IO相連的IC引腳偏偏是自帶下拉的,那么無論這個引腳處于什么樣的電平輸出,都不可避免的產(chǎn)生一定的電流消耗。所以凡是遇見這一類的情況,首先需要閱讀外設(shè)IC的手冊,確定好此引腳的的狀態(tài),做到心中有數(shù);然后在控制MCU睡眠之前,設(shè)置好MCU的IO口的上下拉模式及輸入輸出狀態(tài),要保證一絲兒電流都不要被它消耗掉。
第五條:斷開調(diào)試器連接,不要被假象所迷惑
還有一類比較奇特,檢測出來的電流消耗很大,可實(shí)際結(jié)果是自己杞人憂天,什么原因呢?是因?yàn)樵跍y試功耗的時候MCU還連接著調(diào)試器呢!這時候大部分電流就會被調(diào)試器給擄走,平白無故的讓工程師產(chǎn)生極度郁悶的心情。所以在測低功耗的時候,一定不要連接調(diào)試器,更不能邊調(diào)試邊測電流。
總結(jié)
MCU的低功耗設(shè)計(jì)是一個細(xì)致活,要養(yǎng)成良好的習(xí)慣,做到每添加一個功能都要重新驗(yàn)證一下低功耗是否符合要求,這樣就可以隨時隨地干掉消耗功率的因素。如果把所有功能都設(shè)計(jì)好了才去考慮低功耗的問題,一個不小心,就可能要更改程序的架構(gòu)——即便如此也不一定能把功耗給徹底降下去。