本文主要解讀STM32低功耗模式的機(jī)制,并不側(cè)重STM32低功耗的程序?qū)崿F(xiàn),而且借助STM32固件庫實(shí)現(xiàn)STM32低功耗會(huì)變的非常簡單。
一、STM32芯片性能
使用芯片型號(hào):stm32f030f4,CORTEX-M0.封裝TSSOP20.
運(yùn)行模式:內(nèi)部時(shí)鐘(HSI),系統(tǒng)時(shí)鐘頻率采用48MHZ。
工作電壓:3.3V
芯片具體參數(shù)如下:
二、芯片功耗
功耗:
芯片工作模式:
工作模式:外設(shè)正常運(yùn)行,內(nèi)核CPU及SRAM供電,未使用外設(shè)的時(shí)鐘默認(rèn)關(guān)閉。
睡眠模式:只有CPU停止工作,各個(gè)外設(shè)正常工作,依靠任何中斷/事件喚醒。
停機(jī)模式:1.8V供電區(qū)域時(shí)鐘被停止,內(nèi)部HSI,PLL,外部時(shí)鐘HSE均關(guān)閉,同時(shí)電壓檢測(cè)器也可進(jìn)入低功耗模式,但SRAM和寄存器不斷電,此時(shí)只能依靠外部中斷(EXTI)和RTC時(shí)鐘才能喚醒。
待機(jī)模式:1.8V供電區(qū)域被時(shí)鐘停止,內(nèi)部HSI,PLL,外部時(shí)鐘HSE均關(guān)閉,同時(shí)電壓檢測(cè)器也可進(jìn)入低功耗模式,SRAM和不屬于待機(jī)電路的寄存器也被斷電關(guān)閉,此時(shí)即使是外部中斷(EXTI)也不能將其喚醒,只能通過復(fù)位(外部復(fù)位,看門狗復(fù)位)、喚醒引腳、RTC時(shí)鐘來喚醒。
注意:無論是在停止模式還是待機(jī)模式下,RTC和IWDG及其時(shí)鐘源不會(huì)被關(guān)閉。
各個(gè)模式功耗:
功耗計(jì)算方式:功耗=工作電壓*工作電流。
I/O模塊損耗:
靜態(tài)損耗:
內(nèi)部上下拉電阻損耗:這部分損耗主要取決于內(nèi)部電阻的大小,一般為了降低內(nèi)部電阻損耗常常需要降低電阻兩端電壓,若引腳為低電壓則采用下拉電阻,若引腳為高電壓則采用上拉電阻。
I/O額外損耗:當(dāng)引腳設(shè)為輸入I/O時(shí),用來區(qū)分電壓高低的斯密特觸發(fā)器電路會(huì)產(chǎn)生一部分消耗,為此可將引腳設(shè)為模擬輸入模式。
動(dòng)態(tài)損耗:對(duì)于懸浮的引腳,由于其電壓不穩(wěn)定會(huì)產(chǎn)生外部電磁干擾和損耗,因此必須把懸浮引腳設(shè)為模擬模式或輸出模式,引腳電壓的切換會(huì)對(duì)外部和內(nèi)部電容負(fù)載產(chǎn)生動(dòng)態(tài)損耗,其損耗與電壓切換頻率和負(fù)載電容有關(guān)。具體損耗值如下:
三、CORTEX-M0低功耗功能、指令、相關(guān)寄存器
CORREX內(nèi)核支持低功耗模式有2種:
睡眠模式:CPU時(shí)鐘停止,對(duì)應(yīng)stm32睡眠模式
深度睡眠模式:系統(tǒng)時(shí)鐘停止,PLL,FLASH關(guān)閉,對(duì)應(yīng)stm32停機(jī)模式。
進(jìn)入睡眠模式:
當(dāng)CPU處理完中斷后軟件必須能使其進(jìn)入睡眠模式,當(dāng)CPU執(zhí)行WFI指令,其將會(huì)立即進(jìn)入睡眠模式,當(dāng)異常產(chǎn)生或中斷被掛起時(shí),其立即被喚醒。
當(dāng)CPU執(zhí)行WFE指令時(shí),它首先會(huì)檢查對(duì)應(yīng)的事件標(biāo)志位,當(dāng)事件標(biāo)志寄存器為0時(shí)進(jìn)入睡眠模式,否則將寄存器事件標(biāo)志清0并繼續(xù)執(zhí)行程序。事件標(biāo)志可由外部事件標(biāo)志或SEV指令產(chǎn)生。
返回方式:通過設(shè)置內(nèi)核SCB寄存器的Sleep-on-exit位,可以選擇系統(tǒng)被喚醒執(zhí)行完中斷服務(wù)程序后進(jìn)入主線程模式后是否立即進(jìn)入睡眠模式。
從睡眠中喚醒:
WFI喚醒或sleep-on-exit:
一般來說,使能的異??梢詥拘褍?nèi)核。對(duì)于一些系統(tǒng),在喚醒后執(zhí)行中斷處理程序前需要先執(zhí)行重新恢復(fù)的任務(wù),則首先需要屏蔽所有中斷(PRIMASK=1),中斷發(fā)生后內(nèi)核被喚醒但不執(zhí)行中斷處理,待執(zhí)行完恢復(fù)任務(wù)后再將PRIMASK設(shè)為0,此后執(zhí)行中斷處理任務(wù)。
WFE喚醒:
使能異??梢詥拘褍?nèi)核。外部事件或SEV指令發(fā)送的事件也可喚醒內(nèi)核。
注意:當(dāng)SCR的SEVONPEND設(shè)置為1時(shí),任何使能/非使能中斷或事件都可喚醒內(nèi)核。
中斷喚醒控制器(WIC):
WIC只有在SCR寄存器DEEPSLEEP位設(shè)為1時(shí)才能使能,WIC不可編程也沒有相關(guān)的控制寄存器,它僅與硬件信號(hào)有關(guān),當(dāng)進(jìn)入深睡眠時(shí)內(nèi)核大部分模塊被關(guān)閉,系統(tǒng)計(jì)數(shù)器也被關(guān)閉,因此當(dāng)內(nèi)核被喚醒時(shí)需要較多的時(shí)間恢復(fù)到睡眠前的狀態(tài)并處理中斷。
外部事件輸入:可在WFE模式下喚醒內(nèi)核。
相關(guān)指令:
WFE等待事件,若無事件則睡眠,中斷、事件喚醒
WFI等待中斷,立即進(jìn)入睡眠,中斷喚醒
SEV軟件發(fā)送一個(gè)事件,在核系統(tǒng)中可喚醒另一個(gè)內(nèi)核。
微控制器軟件接口標(biāo)準(zhǔn):
由指令對(duì)應(yīng)的C語言接口:
//core_cmInstr.h
void__WFE(void)//WaitforEvent
void__WFI(void)//WaitforInterrupt
void__SEV(void)//SendEvent
相關(guān)寄存器:
SCR寄存器:
SEVONPEND:
0:只有使能的中斷或事件才能喚醒內(nèi)核。
1:任何中斷和事件都可以喚醒內(nèi)核。
SLEEPDEEP:
0:低功耗模式為睡眠模式。
1:進(jìn)入低功耗時(shí)為深度睡眠模式。
SLEEPONEXIT:
0:被喚醒進(jìn)入線程模式后不再進(jìn)入睡眠模式。
1:被喚醒后執(zhí)行完相應(yīng)的中斷處理函數(shù)后進(jìn)入睡眠模式。
四、STM32時(shí)鐘管理
運(yùn)行模式下可通過關(guān)閉和降低相關(guān)外設(shè)的時(shí)鐘頻率來減少功耗。
APB外設(shè)時(shí)鐘和DMA時(shí)鐘可用軟件禁止。
睡眠模式停止CPU時(shí)鐘。在CPU睡眠中存儲(chǔ)器接口時(shí)鐘(Flash和RAM接口)可被停止。當(dāng)連接到APB所有外設(shè)的時(shí)鐘禁止后,當(dāng)進(jìn)入睡眠期間AHB到APB橋時(shí)鐘由CPU的硬件關(guān)閉。
CPU進(jìn)入停止模式時(shí)停止V18域、PLL、HSI、HSI14和HSE振蕩器的時(shí)鐘。
HDMICEC,USART1和I2C1即使在MCU進(jìn)入停止模式下仍有能力打開HIS振蕩器(假如HIS被選為這些外設(shè)的時(shí)鐘)。
在LSE振蕩器已使能的情況下,HDMICEC和USART1當(dāng)在系統(tǒng)進(jìn)入停止模式下也可由LSE振蕩器驅(qū)動(dòng)(假如LSE被選為這些外設(shè)時(shí)鐘)。但是這些外設(shè)沒有打開LSE振蕩器的能力。
CPU進(jìn)入待機(jī)模式時(shí)停止V18域、PLL、HSI、HSI14和HSE振蕩器的時(shí)鐘。
當(dāng)設(shè)置DBGMCU_CR寄存器中的DBG_STOP或DBG_STANDBY位,那么CPU在相應(yīng)的深度睡眠模式下也可以具有調(diào)試功能。
當(dāng)系統(tǒng)由中斷(停止模式)或復(fù)位(待機(jī)模式)喚醒后,HSI振蕩器被選為系統(tǒng)時(shí)鐘(不管進(jìn)入停止模式或待機(jī)模式前選用的是何種時(shí)鐘)。
假如當(dāng)前正在進(jìn)行閃存編程,只有在閃存編程全部完成之后才會(huì)進(jìn)入深度睡眠模式(深度睡眠延后)。若當(dāng)前正在使用APB域,那么只有全部完成APB域的操作后才進(jìn)入深度睡眠模式。
五、STM32低功耗設(shè)置
STM32工作模式主要有運(yùn)行、睡眠、停止、待機(jī)4種模式,前面已介紹過。詳細(xì)見第二節(jié)。
供電框圖
由上圖可以看到整個(gè)stm32芯片的供電圖,模擬電路部分采用VDDA獨(dú)立供電,各個(gè)部分可以獨(dú)立被關(guān)斷或開啟。備份電路部分由電池供電,主要有RTC時(shí)鐘及相關(guān)的備份寄存器,VDD掉電后可由電池供電,對(duì)于沒有VBAT引腳的芯片,其電源直接與VDD相連。核心部分分為1.8V工作域和VDD工作域,1.8V工作域主要有內(nèi)核、存儲(chǔ)、外設(shè)部分,VDD供電域主要有I/O、待機(jī)電路(喚醒電路,獨(dú)立看門狗)、電壓調(diào)節(jié)器(VoltageRegulator)。
電壓調(diào)節(jié)器
器件復(fù)位后電壓調(diào)節(jié)器總是打開著的,其根據(jù)應(yīng)用模式有三種不同的工作模式。
運(yùn)行模式:調(diào)節(jié)器以全功耗模式為域(內(nèi)核,內(nèi)存和數(shù)字外設(shè))提供1.8V電源。
停止模式:調(diào)節(jié)器以低功耗模式為保持寄存器及SRAM數(shù)據(jù)部分域提供1.8V的電源。
待機(jī)模式:調(diào)節(jié)器斷電,除了待機(jī)電路及備份域電路外,寄存器和SRAM的內(nèi)容全部丟失。
相關(guān)寄存器介紹:
1,cortex-mo中的SCR寄存器
SEVONPEND:
0:只有使能的中斷或事件才能喚醒內(nèi)核。
1:任何中斷和事件都可以喚醒內(nèi)核。
SLEEPDEEP:
0:低功耗模式為睡眠模式。
1:進(jìn)入低功耗時(shí)為深度睡眠模式。
SLEEPONEXIT:
0:被喚醒進(jìn)入線程模式后不再進(jìn)入睡眠模式。
1:被喚醒后執(zhí)行完相應(yīng)的中斷處理函數(shù)后進(jìn)入睡眠模式。
2,電源控制寄存器PWR_CR
其中與低功耗有關(guān)的控制位:
CSBF:清除待機(jī)標(biāo)志,該位始終讀出為0,寫1清除待機(jī)標(biāo)志。
CWUF:清除喚醒標(biāo)志,該位始終讀出為0。寫1清除喚醒標(biāo)志。
PDDS:掉電深睡眠
0:當(dāng)CPU進(jìn)入深睡眠時(shí)進(jìn)入停機(jī)模式,調(diào)壓器的狀態(tài)由LPDS位控制。
1:當(dāng)CPU進(jìn)入深睡眠時(shí)進(jìn)入待機(jī)模式。
LPDS:深睡眠下的低功耗
0:在停機(jī)模式下電壓調(diào)節(jié)器開啟
1:在停機(jī)模式下電壓調(diào)節(jié)器處于低功耗模式
3,電源控制/狀態(tài)寄存器(PWR_CSR)
EWUP2/EWUP1:使能WKUP2或EWUP1引腳。
0:WKUP1/2引腳作為通用IO口。WKUP1引腳上的事件不能將CPU從待機(jī)模式喚醒。
1:WKUP1/2引腳用于將CPU從待機(jī)模式喚醒,WKUP1引腳被強(qiáng)置為輸入下拉的配置(WKUP1引腳上的上升沿將系統(tǒng)從待機(jī)模式喚醒)。
SBF:待機(jī)標(biāo)志
該位由硬件設(shè)置,只能設(shè)置電源控制寄存器PWR_CR的CSBF位清除。
0:系統(tǒng)不在待機(jī)模式
1:系統(tǒng)進(jìn)入待機(jī)模式
WUF:喚醒標(biāo)志
由硬件設(shè)置,只能設(shè)置電源控制寄存器PWR_CR的CWUF位清除。
0:沒有喚醒事件發(fā)生
1:從WKUP或RTC鬧鐘產(chǎn)生一個(gè)喚醒事件
注意:當(dāng)WKUP引腳已經(jīng)是高電平時(shí),在(通過設(shè)置EWUP位)使能WKUP引腳時(shí),會(huì)檢測(cè)到一個(gè)額外喚醒的事件。
低功耗模式的進(jìn)入與退出問題
1、睡眠模式
進(jìn)入睡眠模式:
當(dāng)STM32在運(yùn)行狀態(tài)時(shí),執(zhí)行WFI或WFE指令可進(jìn)入睡眠模式。
條件:SLEEPDEEP=0,設(shè)為睡眠模式。此時(shí)CPU時(shí)鐘被停止。
若令被喚醒的STM32執(zhí)行完中斷處理任務(wù)后進(jìn)入睡眠模式,則可將SLEEPONEXIT設(shè)為1.
退出睡眠模式:
執(zhí)行WFI指令進(jìn)入睡眠,可通過使能中斷喚醒。執(zhí)行WFE指令進(jìn)入睡眠可由事件喚醒,CPU時(shí)鐘打開。產(chǎn)生事件的兩種方式:
配置一個(gè)外部或內(nèi)部EXTI線做為事件模式。
使能