本文主要解讀STM32低功耗模式的機制,并不側重STM32低功耗的程式實作,而且借助STM32固件庫實作STM32低功耗會變的非常簡單。
一、STM32晶片性能
使用晶片型号:stm32f030f4,CORTEX-M0.封裝TSSOP20.
運作模式:内部時鐘(HSI),系統時鐘頻率采用48MHZ。
工作電壓:3.3V
晶片具體參數如下:
二、晶片功耗
功耗:
晶片工作模式:
工作模式:外設正常運作,核心CPU及SRAM供電,未使用外設的時鐘預設關閉。
睡眠模式:隻有CPU停止工作,各個外設正常工作,依靠任何中斷/事件喚醒。
停機模式:1.8V供電區域時鐘被停止,内部HSI,PLL,外部時鐘HSE均關閉,同時電壓檢測器也可進入低功耗模式,但SRAM和寄存器不斷電,此時隻能依靠外部中斷(EXTI)和RTC時鐘才能喚醒。
待機模式:1.8V供電區域被時鐘停止,内部HSI,PLL,外部時鐘HSE均關閉,同時電壓檢測器也可進入低功耗模式,SRAM和不屬于待機電路的寄存器也被斷電關閉,此時即使是外部中斷(EXTI)也不能将其喚醒,隻能通過複位(外部複位,看門狗複位)、喚醒引腳、RTC時鐘來喚醒。
注意:無論是在停止模式還是待機模式下,RTC和IWDG及其時鐘源不會被關閉。
各個模式功耗:
功耗計算方式:功耗=工作電壓*工作電流。
I/O子產品損耗:
靜态損耗:
内部上下拉電阻損耗:這部分損耗主要取決于内部電阻的大小,一般為了降低内部電阻損耗常常需要降低電阻兩端電壓,若引腳為低電壓則采用下拉電阻,若引腳為高電壓則采用上拉電阻。
I/O額外損耗:當引腳設為輸入I/O時,用來區分電壓高低的斯密特觸發器電路會産生一部分消耗,為此可将引腳設為模拟輸入模式。
動态損耗:對于懸浮的引腳,由于其電壓不穩定會産生外部電磁幹擾和損耗,是以必須把懸浮引腳設為模拟模式或輸出模式,引腳電壓的切換會對外部和内部電容負載産生動态損耗,其損耗與電壓切換頻率和負載電容有關。具體損耗值如下:
三、CORTEX-M0低功耗功能、指令、相關寄存器
CORREX核心支援低功耗模式有2種:
睡眠模式:CPU時鐘停止,對應STM32睡眠模式
深度睡眠模式:系統時鐘停止,PLL,FLASH關閉,對應STM32停機模式。
進入睡眠模式:
當CPU處理完中斷後軟體必須能使其進入睡眠模式,當CPU執行WFI指令,其将會立即進入睡眠模式,當異常産生或中斷被挂起時,其立即被喚醒。
當CPU執行WFE指令時,它首先會檢查對應的事件标志位,當事件标志寄存器為0時進入睡眠模式,否則将寄存器事件标志清0并繼續執行程式。事件标志可由外部事件标志或SEV指令産生。
傳回方式:通過設定核心SCB寄存器的Sleep-on-exit位,可以選擇系統被喚醒執行完中斷服務程式後進入主線程模式後是否立即進入睡眠模式。
從睡眠中喚醒:
WFI喚醒或sleep-on-exit:
一般來說,使能的異常可以喚醒核心。對于一些系統,在喚醒後執行中斷處理程式前需要先執行重新恢複的任務,則首先需要屏蔽所有中斷(PRIMASK=1),中斷發生後核心被喚醒但不執行中斷處理,待執行完恢複任務後再将PRIMASK設為0,此後執行中斷處理任務。
WFE喚醒:
使能異常可以喚醒核心。外部事件或SEV指令發送的事件也可喚醒核心。
注意:當SCR的SEVONPEND設定為1時,任何使能/非使能中斷或事件都可喚醒核心。
中斷喚醒控制器(WIC):
WIC隻有在SCR寄存器DEEPSLEEP位設為1時才能使能,WIC不可程式設計也沒有相關的控制寄存器,它僅與硬體信号有關,當進入深睡眠時核心大部分子產品被關閉,系統計數器也被關閉,是以當核心被喚醒時需要較多的時間恢複到睡眠前的狀态并進行中斷。
外部事件輸入:可在WFE模式下喚醒核心。
相關指令:
WFE等待事件,若無事件則睡眠,中斷、事件喚醒
WFI等待中斷,立即進入睡眠,中斷喚醒
SEV軟體發送一個事件,在核系統中可喚醒另一個核心。
微控制器軟體接口标準:
由指令對應的C語言接口:
//core_cmInstr.h
void__WFE(void)//WaitforEvent
void__WFI(void)//WaitforInterrupt
void__SEV(void)//SendEvent
相關寄存器:
SCR寄存器:
SEVONPEND:
0:隻有使能的中斷或事件才能喚醒核心。
1:任何中斷和事件都可以喚醒核心。
SLEEPDEEP:
0:低功耗模式為睡眠模式。
1:進入低功耗時為深度睡眠模式。
SLEEPONEXIT:
0:被喚醒進入線程模式後不再進入睡眠模式。
1:被喚醒後執行完相應的中斷處理函數後進入睡眠模式。
四、STM32時鐘管理
運作模式下可通過關閉和降低相關外設的時鐘頻率來減少功耗。
APB外設時鐘和DMA時鐘可用軟體禁止。
睡眠模式停止CPU時鐘。在CPU睡眠中存儲器接口時鐘(Flash和RAM接口)可被停止。當連接配接到APB所有外設的時鐘禁止後,當進入睡眠期間AHB到APB橋時鐘由CPU的硬體關閉。
CPU進入停止模式時停止V18域、PLL、HSI、HSI14和HSE振蕩器的時鐘。
HDMICEC,USART1和I2C1即使在MCU進入停止模式下仍有能力打開HIS振蕩器(假如HIS被選為這些外設的時鐘)。
在LSE振蕩器已使能的情況下,HDMICEC和USART1當在系統進入停止模式下也可由LSE振蕩器驅動(假如LSE被選為這些外設時鐘)。但是這些外設沒有打開LSE振蕩器的能力。
CPU進入待機模式時停止V18域、PLL、HSI、HSI14和HSE振蕩器的時鐘。
當設定DBGMCU_CR寄存器中的DBG_STOP或DBG_STANDBY位,那麼CPU在相應的深度睡眠模式下也可以具有調試功能。
當系統由中斷(停止模式)或複位(待機模式)喚醒後,HSI振蕩器被選為系統時鐘(不管進入停止模式或待機模式前選用的是何種時鐘)。
假如目前正在進行閃存程式設計,隻有在閃存程式設計全部完成之後才會進入深度睡眠模式(深度睡眠延後)。若目前正在使用APB域,那麼隻有全部完成APB域的操作後才進入深度睡眠模式。
五、STM32低功耗設定
STM32工作模式主要有運作、睡眠、停止、待機4種模式。
供電框圖
由上圖可以看到整個STM32晶片的供電圖,模拟電路部分采用VDDA獨立供電,各個部分可以獨立被關斷或開啟。備份電路部分由電池供電,主要有RTC時鐘及相關的備份寄存器,VDD掉電後可由電池供電,對于沒有VBAT引腳的晶片,其電源直接與VDD相連。核心部分分為1.8V工作域和VDD工作域,1.8V工作域主要有核心、存儲、外設部分,VDD供電域主要有I/O、待機電路(喚醒電路,獨立看門狗)、電壓調節器(VoltageRegulator)。
電壓調節器
器件複位後電壓調節器總是打開着的,其根據應用模式有三種不同的工作模式。
運作模式:調節器以全功耗模式為域(核心,記憶體和數字外設)提供1.8V電源。
停止模式:調節器以低功耗模式為保持寄存器及SRAM資料部分域提供1.8V的電源。
待機模式:調節器斷電,除了待機電路及備份域電路外,寄存器和SRAM的内容全部丢失。
相關寄存器介紹:
1,cortex-mo中的SCR寄存器
SEVONPEND:
0:隻有使能的中斷或事件才能喚醒核心。
1:任何中斷和事件都可以喚醒核心。
SLEEPDEEP:
0:低功耗模式為睡眠模式。
1:進入低功耗時為深度睡眠模式。
SLEEPONEXIT:
0:被喚醒進入線程模式後不再進入睡眠模式。
1:被喚醒後執行完相應的中斷處理函數後進入睡眠模式。
2,電源控制寄存器PWR_CR
其中與低功耗有關的控制位:
CSBF:清除待機标志,該位始終讀出為0,寫1清除待機标志。
CWUF:清除喚醒标志,該位始終讀出為0。寫1清除喚醒标志。
PDDS:掉電深睡眠
0:當CPU進入深睡眠時進入停機模式,調壓器的狀态由LPDS位控制。
1:當CPU進入深睡眠時進入待機模式。
LPDS:深睡眠下的低功耗
0:在停機模式下電壓調節器開啟
1:在停機模式下電壓調節器處于低功耗模式
3,電源控制/狀态寄存器(PWR_CSR)
EWUP2/EWUP1:使能WKUP2或EWUP1引腳。
0:WKUP1/2引腳作為通用IO口。WKUP1引腳上的事件不能将CPU從待機模式喚醒。
1:WKUP1/2引腳用于将CPU從待機模式喚醒,WKUP1引腳被強置為輸入下拉的配置(WKUP1引腳上的上升沿将系統從待機模式喚醒)。
SBF:待機标志
該位由硬體設定,隻能設定電源控制寄存器PWR_CR的CSBF位清除。
0:系統不在待機模式
1:系統進入待機模式
WUF:喚醒标志
由硬體設定,隻能設定電源控制寄存器PWR_CR的CWUF位清除。
0:沒有喚醒事件發生
1:從WKUP或RTC鬧鐘産生一個喚醒事件
注意:當WKUP引腳已經是高電平時,在(通過設定EWUP位)使能WKUP引腳時,會檢測到一個額外喚醒的事件。
低功耗模式的進入與退出問題
1、睡眠模式
進入睡眠模式:
當STM32在運作狀态時,執行WFI或WFE指令可進入睡眠模式。
條件:SLEEPDEEP=0,設為睡眠模式。此時CPU時鐘被停止。
若令被喚醒的STM32執行完中斷處理任務後進入睡眠模式,則可将SLEEPONEXIT設為1.
退出睡眠模式:
執行WFI指令進入睡眠,可通過使能中斷喚醒。執行WFE指令進入睡眠可由事件喚醒,CPU時鐘打開。産生事件的兩種方式:
配置一個外部或内部EXTI線做為事件模式。
打開APP閱讀更多精彩内容
點選閱讀全文