STM32低功耗實(shí)驗(yàn)總結(jié)
1、首先回答一個(gè)問(wèn)題,STM32能不能做低功耗?
回答是肯定的,這個(gè)是有數(shù)據(jù)支持的,我測(cè)試的STM32101CB,F(xiàn)LASH:128K,RAM:16K并且RTC工作的情況下,測(cè)試到的功耗為16uA應(yīng)該說(shuō)還是相當(dāng)不錯(cuò)的。
2、STM32低功耗有哪些需要注意的地方?
一開始我測(cè)試到STM32為16uA的時(shí)候,還是非常高興的,以為真的可以做為我的應(yīng)用,我的應(yīng)用是讓MCU定時(shí)醒來(lái)干活,干一會(huì)就睡覺(jué),可能干活的時(shí)間就幾十個(gè)毫秒??墒呛髞?lái)發(fā)現(xiàn)有些問(wèn)題(工作在STOP模式):
1)時(shí)鐘問(wèn)題:STM32被喚醒以后的時(shí)鐘自動(dòng)切換到內(nèi)部HIS RC振蕩器,大家都是知道的,RC振蕩器的精度是不高的。而且,睡覺(jué)前對(duì)于時(shí)鐘的設(shè)置都是恢復(fù)到復(fù)位狀態(tài),只是時(shí)鐘這個(gè)地方復(fù)位,其他的沒(méi)有。這也會(huì)帶來(lái)一個(gè)問(wèn)題,可能你睡覺(jué)前使用的是內(nèi)部時(shí)鐘,可是睡覺(jué)后,時(shí)鐘卻變了,帶來(lái)的問(wèn)題就是UART和定時(shí)器?;蛟S你想不使用PLL,就是8M,這樣醒來(lái)后的時(shí)鐘HIS也是8M,這樣雖然在時(shí)鐘上沒(méi)有差別了,但是時(shí)鐘卻不穩(wěn)定了。UART波特率肯定不能太高,否則通信會(huì)有問(wèn)題。
2)醒來(lái)時(shí)間:這個(gè)問(wèn)題也是個(gè)非常大的問(wèn)題,datasheet上給出的醒來(lái)時(shí)間是7us,這個(gè)可能真的不假,但是醒來(lái),不能馬上干_你的活,為什么。初始化IO,你可能問(wèn),我不初始化不行嗎,回答應(yīng)該是否定的。因?yàn)椋绻阆胧褂玫凸牡脑?,睡覺(jué)前IO口都應(yīng)該設(shè)置為模擬輸入,這樣才能達(dá)到datasheet上的14uA,但是這樣也帶來(lái)一個(gè)問(wèn)題,那就是初始化IO,醒來(lái)必須要初始化IO。如果你還想把時(shí)鐘切換到外部時(shí)鐘,耗時(shí)會(huì)更加長(zhǎng),接近200ms,因?yàn)镾TM32會(huì)等待外部時(shí)鐘穩(wěn)定后才能工作,然后還要在重新初始化所有IO,這個(gè)非常的耗時(shí)??赡芪抑恍枰褋?lái)10ms,但是這些活干完就需要100ms。
3)RTC喚醒:RTC這個(gè)也是個(gè)問(wèn)題,為什么?大家需要注意的是RTC只能使用報(bào)警才能喚醒MCU,秒中斷是不可以喚醒的。并且報(bào)警中斷必須不停的設(shè)置,設(shè)置一次只生效一次,中斷完了,還需要設(shè)置下次中斷的時(shí)間。并且還有個(gè)問(wèn)題,報(bào)警中斷必須等待到秒中斷到了之后才能設(shè)置,也就是正好秒寄存器更新了一次的時(shí)候設(shè)置,這就帶來(lái)一個(gè)問(wèn)題,等待秒中斷。如果睡前還想再能被報(bào)警喚醒的話必須重新設(shè)置報(bào)警中斷,而且設(shè)置報(bào)警中斷的時(shí)候需要等到秒中斷才能設(shè)置新的值。這個(gè)等待的時(shí)間是不定的??赡軙?huì)幾百個(gè)毫秒。說(shuō)以要空空的耗費(fèi)幾百個(gè)毫秒等到秒中斷標(biāo)志來(lái)設(shè)置報(bào)警中斷??赡芪业腗CU只需要執(zhí)行10ms就需要睡覺(jué)了。還是要空空的耗費(fèi)掉幾百個(gè)毫秒
總結(jié):在使用的過(guò)程中發(fā)現(xiàn)的問(wèn)題,我都在上面說(shuō)明了,我覺(jué)得STM32的低功耗太假,雖然在睡眠的時(shí)候性能不錯(cuò),但是醒來(lái),和進(jìn)入睡眠的設(shè)置太麻煩,耗時(shí)太多,這是個(gè)弊端,我覺(jué)得MSP430估計(jì)是做的最好的了,即使是AVR也比他好點(diǎn),沒(méi)有那么麻煩。
評(píng)論