電源對電子設(shè)備的重要性不言而喻,它是保證系統(tǒng)穩(wěn)定運(yùn)行的基礎(chǔ),而保證系統(tǒng)能穩(wěn)定運(yùn)行后,又有低功耗的要求。在很多應(yīng)用場合中都對電子設(shè)備的功耗要求非常苛刻,如某些傳感器信息采集設(shè)備,僅靠小型的電池提供電源,要求工作長達(dá)數(shù)年之久,且期間不需要任何維護(hù);由于智慧穿戴設(shè)備的小型化要求,電池體積不能太大導(dǎo)致容量也比較小,所以也很有必要從控制功耗入手,提高設(shè)備的續(xù)行時間。因此,STM32 有專門的電源管理外設(shè)監(jiān)控電源并管理設(shè)備的運(yùn)行模式,確保系統(tǒng)正常運(yùn)行,并盡量降低器件的功耗。
?電源監(jiān)控器
STM32芯片主要通過引腳 VDD 從外部獲取電源,在它的內(nèi)部具有電源監(jiān)控器用于檢測 VDD的電壓,以實(shí)現(xiàn)復(fù)位功能及掉電緊急處理功能,保證系統(tǒng)可靠地運(yùn)行。
1. 上電復(fù)位與掉電復(fù)位(POR與 PDR)
當(dāng)檢測到 VDD 的電壓低于閾值 VPOR及 VPDR 時,無需外部電路輔助,STM32 芯片會自動保持在復(fù)位狀態(tài),防止因電壓不足強(qiáng)行工作而帶來嚴(yán)重的后果。見圖 45-1,在剛開始電壓低于 VPOR時(約 1.72V),STM32 保持在上電復(fù)位狀態(tài)(POR,Power On Reset),當(dāng)VDD 電壓持續(xù)上升至大于 VPOR時,芯片開始正常運(yùn)行,而在芯片正常運(yùn)行的時候,當(dāng)檢測到 VDD 電壓下降至低于 VPDR閾值(約 1.68V),會進(jìn)入掉電復(fù)位狀態(tài)(PDR,Power Down Reset)。
2. 欠壓復(fù)位(BOR)
POR與 PDR的復(fù)位電壓閾值是固定的,如果用戶想要自行設(shè)定復(fù)位閾值,可以使用STM32的 BOR功能( Brownout Reset )。它可以編程控制電壓檢測工作在表 45-1 中的閾值級別,通過修改“選項(xiàng)字節(jié)”(某些特殊寄存器)中的 BOR_LEV 位即可控制閾值級別。其復(fù)位控制示意圖見圖 45-2。
3. 可編程電壓檢測器 PVD
上述 POR、PDR以及 BOR功能都是使用其電壓閾值與外部供電電壓 VDD 比較,當(dāng)?shù)陀诠ぷ鏖撝禃r,會直接進(jìn)入復(fù)位狀態(tài),這可防止電壓不足導(dǎo)致的誤操作。除此之外,STM32還提供了可編程電壓檢測器 PVD,它也是實(shí)時檢測 VDD的電壓,當(dāng)檢測到電壓低于 VPVD閾值時,會向內(nèi)核產(chǎn)生一個 PVD 中斷(EXTI16 線中斷)以使內(nèi)核在復(fù)位前進(jìn)行緊急處理。該電壓閾值可通過電源控制寄存器 PWR_CSR設(shè)置。
使用 PVD可配置 8 個等級,見表 45-2。其中的上升沿和下降沿分別表示類似圖 45-2中 VDD電壓上升過程及下降過程的閾值。
?STM32 的電源系統(tǒng)
為了方便進(jìn)行電源管理,STM32 把它的外設(shè)、內(nèi)核等模塊跟據(jù)功能劃分了供電區(qū)域,其內(nèi)部電源區(qū)域劃分見圖 45-3。
從框圖了解到,STM32的電源系統(tǒng)主要分為備份域電路、內(nèi)核電路以及 ADC電路三部分,介紹如下:
- ?備份域電路
STM32的 LSE 振蕩器、RTC、備份寄存器及備份 SRAM這些器件被包含進(jìn)備份域電路中,這部分的電路可以通過 STM32的 VBAT引腳獲取供電電源,在實(shí)際應(yīng)用中一般會使用 3V的鈕扣電池對該引腳供電。
在圖中備份域電路的左側(cè)有一個電源開關(guān)結(jié)構(gòu),它的功能類似圖 45-4 中的雙二極管,在它的上方連接了 VBAT 電源,下方連接了 VDD主電源(一般為 3.3V),右側(cè)引出到備份域電路中。當(dāng) VDD主電源存在時,由于 VDD電壓較高,備份域電路通過 VDD 供電,當(dāng) VDD掉電時,備份域電路由鈕扣電池通過 VBAT 供電,保證電路能持續(xù)運(yùn)行,從而可利用它保留關(guān)鍵數(shù)據(jù)。
- ?調(diào)壓器供電電路
在 STM32 的電源系統(tǒng)中調(diào)壓器供電的電路是最主要的部分,調(diào)壓器為備份域及待機(jī)電路以外的所有數(shù)字電路供電,其中包括內(nèi)核、數(shù)字外設(shè)以及 RAM,調(diào)壓器的輸出電壓約為 1.2V,因而使用調(diào)壓器供電的這些電路區(qū)域被稱為 1.2V 域。調(diào)壓器可以運(yùn)行在“運(yùn)行模式”、“停止模式”以及“待機(jī)模式”。在運(yùn)行模式下,1.2V 域全功率運(yùn)行;在停止模式下 1.2V 域運(yùn)行在低功耗狀態(tài),1.2V 區(qū)域的所有時鐘都被關(guān)閉,相應(yīng)的外設(shè)都停止了工作,但它會保留內(nèi)核寄存器以及SRAM的內(nèi)容;在待機(jī)模式下,整個 1.2V域都斷電,該區(qū)域的內(nèi)核寄存器及SRAM內(nèi)容都會丟失(備份區(qū)域的寄存器及 SRAM 不受影響)。
- ADC 電源及參考電壓
為了提高轉(zhuǎn)換精度,STM32 的 ADC 配有獨(dú)立的電源接口,方便進(jìn)行單獨(dú)的濾波。ADC 的工作電源使用 VDDA引腳輸入,使用 VSSA作為獨(dú)立的地連接,VREF引腳則為 ADC提供測量使用的參考電壓。
STM32的功耗模式
按功耗由高到低排列,STM32具有運(yùn)行、睡眠、停止和待機(jī)四種工作模式。上電復(fù)位后 STM32 處于運(yùn)行狀態(tài)時,當(dāng)內(nèi)核不需要繼續(xù)運(yùn)行,就可以選擇進(jìn)入后面的三種低功耗模式降低功耗,這三種模式中,電源消耗不同、喚醒時間不同、喚醒源不同,用戶需要根據(jù)應(yīng)用需求,選擇最佳的低功耗模式。三種低功耗的模式說明見表 45-3。
從表中可以看到,這三種低功耗模式層層遞進(jìn),運(yùn)行的時鐘或芯片功能越來越少,因而功耗越來越低。
1. 睡眠模式
在睡眠模式中,僅關(guān)閉了內(nèi)核時鐘,內(nèi)核停止運(yùn)行,但其片上外設(shè),CM4核心的外設(shè)全都還照常運(yùn)行。有兩種方式進(jìn)入睡眠模式,它的進(jìn)入方式?jīng)Q定了從睡眠喚醒的方式,分別是 WFI(wait for interrupt)和 WFE(wait for event),即由等待“中斷”喚醒和由“事件”喚醒。睡眠模式的各種特性見表 45-4。
2. 停止模式
在停止模式中,進(jìn)一步關(guān)閉了其它所有的時鐘,于是所有的外設(shè)都停止了工作,但由于其 1.2V 區(qū)域的部分電源沒有關(guān)閉,還保留了內(nèi)核的寄存器、內(nèi)存的信息,所以從停止模
式喚醒,并重新開啟時鐘后,還可以從上次停止處繼續(xù)執(zhí)行代碼。停止模式可以由任意一個外部中斷(EXTI)喚醒。在停止模式中可以選擇電壓調(diào)節(jié)器為開模式或低功耗模式,可選
擇內(nèi)部 FLASH 工作在正常模式或掉電模式。停止模式的各種特性見表 45-5。
3. 待機(jī)模式
待機(jī)模式,它除了關(guān)閉所有的時鐘,還把 1.2V 區(qū)域的電源也完全關(guān)閉了,也就是說,從待機(jī)模式喚醒后,由于沒有之前代碼的運(yùn)行記錄,只能對芯片復(fù)位,重新檢測 boot 條件,從頭開始執(zhí)行程序。它有四種喚醒方式,分別是 WKUP(PA0)引腳的上升沿,RTC 鬧鐘事件,NRST 引腳的復(fù)位和 IWDG(獨(dú)立看門狗)復(fù)位。
在以上講解的睡眠模式、停止模式及待機(jī)模式中,若備份域電源正常供電,備份域內(nèi)的 RTC 都可以正常運(yùn)行、備份域內(nèi)的寄存器及備份域內(nèi)的 SRAM數(shù)據(jù)會被保存,不受功耗模式影響。
電源管理相關(guān)的庫函數(shù)及命令
2.1 配置 PVD監(jiān)控功能
PVD可監(jiān)控 VDD 的電壓,當(dāng)它低于閾值時可產(chǎn)生 PVD中斷以讓系統(tǒng)進(jìn)行緊急處理,這個閾值可以直接使用庫函數(shù) PWR_PVDLevelConfig 配置成前面表 45-2 中說明的閾值等級。
2.2 WFI與 WFE命令
我們了解到進(jìn)入各種低功耗模式時都需要調(diào)用 WFI 或 WFE 命令,它們實(shí)質(zhì)上都是內(nèi)核指令,在庫文件 core_cmInstr.h 中把這些指令封裝成了函數(shù),見代碼清單 24-1。
我們了解到進(jìn)入各種低功耗模式時都需要調(diào)用 WFI 或 WFE 命令,它們實(shí)質(zhì)上都是內(nèi)核指令,在庫文件 core_cmInstr.h 中把這些指令封裝成了函數(shù),見代碼清單 24-1。
對于這兩個指令,我們應(yīng)用時一般只需要知道,調(diào)用它們都能進(jìn)入低功耗模式,需要使用函數(shù)的格式“__WFI();”和“__WFE();”來調(diào)用(因?yàn)開_wfi及__wfe 是編譯器內(nèi)置的函數(shù),函數(shù)內(nèi)部使用調(diào)用了相應(yīng)的匯編指令)。其中 WFI指令決定了它需要用中斷喚醒,而WFE 則決定了它可用事件來喚醒,關(guān)于它們更詳細(xì)的區(qū)別可查閱《cortex-CM3/CM4權(quán)威指南》了解。
2.3 進(jìn)入停止模式
直接調(diào)用 WFI和 WFE 指令可以進(jìn)入睡眠模式,而進(jìn)入停止模式則還需要在調(diào)用指令前設(shè)置一些寄存器位,STM32標(biāo)準(zhǔn)庫把這部分的操作封裝到 PWR_EnterSTOPMode函數(shù)中
了,它的定義見代碼清單 43-2。
這個函數(shù)有兩個輸入參數(shù),分別用于控制調(diào)壓器的模式及選擇使用 WFI 或 WFE 停止,代碼中先是根據(jù)調(diào)壓器的模式配置 PWR_CR寄存器,再把內(nèi)核寄存器的 SLEEPDEEP 位置1,這樣再調(diào)用 WFI或 WFE命令時,STM32就不是睡眠,而是進(jìn)入停止模式了。函數(shù)結(jié)尾處的語句用于復(fù)位 SLEEPDEEP 位的狀態(tài),由于它是在 WFI及 WFE 指令之后的,所以這部分代碼是在 STM32 被喚醒的時候才會執(zhí)行。要注意的是進(jìn)入停止模式后,STM32的所有 I/O 都保持在停止前的狀態(tài),而當(dāng)它被喚醒時,STM32 使用 HSI作為系統(tǒng)時鐘(16MHz)運(yùn)行,由于系統(tǒng)時鐘會影響很多外設(shè)的工作狀態(tài),所以一般我們在喚醒后會重新開啟 HSE,把系統(tǒng)時鐘設(shè)置會原來的狀態(tài)。前面提到在停止模式中還可以控制內(nèi)部 FLASH 的供電,控制 FLASH 是進(jìn)入掉電狀態(tài)還是正常供電狀態(tài),這可以使用庫函數(shù) PWR_FlashPowerDownCmd 配置,它其實(shí)只是封裝了一個對 FPDS寄存器位操作的語句,見代碼清單 45-3。這個函數(shù)需要在進(jìn)入停止模式前被調(diào)用,即應(yīng)用時需要把它放在上面的 PWR_EnterSTOPMode 之前。
2.4 進(jìn)入待機(jī)模式
類似地,STM32 標(biāo)準(zhǔn)庫也提供了控制進(jìn)入待機(jī)模式的函數(shù),其定義見代碼清單 43-3。
該函數(shù)中先配置了 PDDS寄存器位及 SLEEPDEEP寄存器位,接著調(diào)用__force_stores函數(shù)確保存儲操作完畢后再調(diào)用 WFI指令,從而進(jìn)入待機(jī)模式。這里值得注意的是,待機(jī)
模式也可以使用 WFE 指令進(jìn)入的,如果您有需要可以自行修改;另外,由于這個函數(shù)沒有操作 WUF寄存器位,所以在實(shí)際應(yīng)用中,調(diào)用本函數(shù)前,還需要清空 WUF寄存器位才能進(jìn)入待機(jī)模式。
在進(jìn)入待機(jī)模式后,除了被使能了的用于喚醒的 I/O,其余 I/O 都進(jìn)入高阻態(tài),而從待機(jī)模式喚醒后,相當(dāng)于復(fù)位 STM32 芯片,程序重新從頭開始執(zhí)行。
評論
查看更多