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