stm32標準庫實現低功耗 一、概述 stm32不同系列晶元支持的低功耗模式各有差異,本文以F103系列晶元為例,簡單講解不同低功耗模式的特點和使用方法。 二、低功耗 簡述 預設情況下,系統或電源複位後,微控制器處於Run模式。當CPU不需要保持運行時(例如等待外部事件時),可以使用幾種低功耗模式來 ...
stm32標準庫實現低功耗
一、概述
stm32不同系列晶元支持的低功耗模式各有差異,本文以F103系列晶元為例,簡單講解不同低功耗模式的特點和使用方法。
二、低功耗
簡述
預設情況下,系統或電源複位後,微控制器處於Run模式。當CPU不需要保持運行時(例如等待外部事件時),可以使用幾種低功耗模式來節省電源。這取決於用戶選擇的模式,以提供低功耗、較短啟動時間和可用的喚醒源之間的最佳折衷。
stm32f10xxx 設備有三種低功耗模式:
- 睡眠模式
這種模式會關閉cpu時鐘,但是所有外設包括M3內核的外設(NVIC、SysTick等等)都不會受到影響,保持運行 - 停止模式
所有時鐘都會關閉 - 待機模式
1.8供電區域斷電
另外,mcu在運行模式(run)下也可以通過以下方式降低功耗:
- 降低系統時鐘頻率
- 關閉一些不使用的外設的時鐘
上面這三種低功耗模式的具體描述可以看下麵這個圖,覺得閱讀英文不方便的話請自行翻譯,我覺得這更有助於你去理解這幾個模式的特點。
下麵這張表更好的彙總了各種低功耗模式的特點:
詳細介紹
下麵會簡單介紹各種降低功耗的方法,包括run、sleep、stop、standby。
run模式下
1、Slowing down system clocks(run模式下降低功耗)
run模式下,我們可以通過對預分頻器編程來降低系統時鐘(SYSCLK, HCLK, PCLK1, PCLK2);
在進入sleep模式之前,我們也可以對預分頻器編程來降低外設時鐘。
詳細請查閱RCC_CFGR寄存器,這裡不展開描述。
2、 Peripheral clock gating(外圍時鐘門控)
在Run模式下,每個外設和存儲器的HCLK和PCLKx可以隨時停止,以降低功耗。
在sleep模式下,在執行WFI或者WFE內核指令之前我們可以關閉一些不需要使用的外設時鐘來進一步降低功耗。
低功耗模式下(分為sleep、stop、standby)
1、sleep mode
進入sleep模式
通過執行WFI (Wait For Interrupt)或WFE (Wait For Event)指令進入Sleep模式。根據Cortex®-M3系統控制寄存器中的SLEEPONEXIT位,有兩種選項可用於選擇Sleep模式進入機制:
-
Sleep-now:如果清除SLEEPONEXIT位,則在執行WFI或WFE指令時,MCU馬上進入Sleep模式。
-
Sleep-on-exit:如果設置了SLEEPONEXIT位,則MCU在退出最低優先順序ISR時進入Sleep模式。
在休眠模式下,所有I/O引腳保持與運行模式相同的狀態。
退出sleep模式
如果使用WFI指令進入睡眠模式,任何被NVIC確認的外設中斷都可以從睡眠模式喚醒設備。
如果使用WFE指令進入Sleep模式,則在事件發生時,MCU將立即退出Sleep模式。喚醒事件可以通過以下任意一種方式產生:
-
在外設控制寄存器中啟用中斷,但在NVIC中不啟用,併在Cortex®-M3系統控制寄存器中啟用SEVONPEND位。當MCU從WFE恢復時,必須清除外設中斷懸掛位(pending)和外設NVIC IRQ通道懸掛位(pending)(在NVIC中斷清除懸掛寄存器中)。
-
在事件模式下配置外部或內部EXTI line。當CPU從WFE恢復時,由於事件行對應的掛起位沒有設置,不需要清除外設中斷掛起位或NVIC IRQ通道掛起位。
所有進入和退出休眠的細節彙總成以下表格:
2、stop mode
簡述
停止模式是基於Cortex®-M3深度睡眠模式結合外圍時鐘門控。電壓調節器可以配置在普通模式或低功率模式。
在停止模式下,1.8 V域中的所有時鐘都停止,鎖相環、HSI和HSE RC振蕩器都被禁用。SRAM和寄存器的內容被保留。
在停止模式下,所有I/O引腳保持與運行模式相同的狀態。
進入停止模式
- 為了進一步減少功耗,可以設置電壓調節器工作在低功耗模式,這需要配置PWR_CR的LPDS位。
- 如果快閃記憶體編程正在進行,停止模式的進入將被延遲,直到記憶體訪問完成。
- 如果對APB域的訪問正在進行,停止模式的進入將延遲到對APB的訪問完成。
在停止模式下,可以通過編程單個控制位來選擇以下特性:
- Independent watchdog (IWDG)
- Real-time clock (RTC)
- Internal RC oscillator (LSI RC)
- External 32.768 kHz oscillator (LSE OSC)
此外,ADC或DAC在停止模式下也會消耗電能,除非他們在進入停止模式之前被禁用。
要禁用它們,ADC_CR2寄存器中的ADON位和DAC_CR寄存器中的ENx位必須都寫為0。
退出停止模式
當通過發出中斷或喚醒事件退出Stop模式時,HSI RC振蕩器被選為系統時鐘。
當電壓調節器在低功率模式下運行時,當從停止模式喚醒時,會產生額外的啟動延遲。通過在停止模式期間保持內部調節器(這裡是指電壓調節器)處於ON狀態,雖然減少了啟動時間,但消耗更高。
下圖彙總了停止模式進入和退出的細節信息。
註意:
- 在進入停止模式之前,要清除所有中斷掛起位,如上圖所述。
- 喚醒之後記得要重新配置系統時鐘。
3、Standby mode
簡述
“待機”模式可以實現最低的功耗。它基於Cortex®-M3深度睡眠模式,禁用電壓調節器。導致1.8 V域下電。鎖相環、HSI振蕩器和HSE振蕩器也處於關閉狀態。除了備份域和備用電路中的寄存器外,SRAM和寄存器的內容都會丟失。
進入待機模式
在待機模式下,可以通過編程單個控制位來選擇以下特性:
- Independent watchdog (IWDG)
- Real-time clock (RTC)
- Internal RC oscillator (LSI RC)
- External 32.768 kHz oscillator (LSE OSC)
退出待機模式
當外部複位(NRST引腳)、IWDG複位、WKUP引腳上升沿或RTC告警上升沿發生時,微控制器退出待機模式。
除電源控制/狀態寄存器(PWR_CSR)外,所有寄存器都在Standby喚醒後重置。
從待機模式喚醒後,程式跟複位後一樣重新啟動。電源控制/狀態寄存器(PWR_CSR)中的SBF狀態標誌表示MCU處於待機模式。所以程式重新運行後我們可以讀取這個狀態標誌SBF來判斷是否從待機模式喚醒。
下圖彙總了待機模式進入和退出的細節信息。
註意:
在待機模式下,所有I/O引腳都是高阻態的,除了:
- 複位引腳(仍可用)
- 干預引腳,如果配置為干預或校準輸出
- WKUP引腳,如果使能了
調試模式
預設情況下,如果應用程式在調試功能使用時將MCU置於停止或待機模式,調試連接將丟失。這是因為Cortex®-M3內核停止工作了。
但是,通過在DBGMCU_CR寄存器中設置一些配置位,即使正在使用低功耗模式,也可以對軟體進行調試。
核心不允許在調試會話期間關閉FCLK或HCLK。因為這些是調試器連接所需的,所以在調試期間,它們必須保持活動狀態。單片機集成了特殊的方法,允許用戶在低功耗模式下調試軟體。為此,調試器主機必須首先設置一些調試配置寄存器來改變低功耗模式的行為:
-
在Sleep模式下,DBGMCU_CR寄存器的DBG_SLEEP位必須事先由調試器設置。這將提供給HCLK與提供給FCLK相同的時鐘(系統時鐘以前由軟體配置)。
-
在停止模式下,DBG_STOP位必須由調試器預先設置。這將
使內部RC振蕩器時鐘在停止模式下供給FCLK和HCLK。
這裡不開展描述,有興趣請參考相關用戶手冊。
從低功耗模式自動喚醒(AWU)
RTC可以用來從低功耗模式喚醒MCU,而不依賴外部中斷(自動喚醒模式)。
RTC提供了一個可編程的時間基準,從停止或待機模式在定期間隔喚醒。
為此,可以通過對備份域控制寄存器(RCC_BDCR)中的RTCSEL[1:0]位進行編程來選擇三個RTC時鐘源中的兩個,如下圖:
-
32.768 kHz外部晶體振蕩器(LSE OSC)。該時鐘源提供了精確的時間基準,功耗極低(典型情況下增加不超過1µa)。
-
RC內部振蕩器(LSI RC)。該時鐘源具有節省32.768 kHz晶體成本的優點。這種內部RC振蕩器的設計是為了增加最小的功耗。
要使用RTC鬧鐘事件從Stop模式喚醒,需要:
1、將EXTI Line 17設置為對上升沿敏感
2、配置RTC產生RTC鬧鐘
從Standby模式中喚醒,不需要配置EXTI Line 17。
下麵彙總一些各個低功耗模式的特點和使用方法:
總結
本文簡單介紹了STM32F1系列低功耗模式的特點和使用方法,使本人加深了對這些低功耗模式涉及的對象的理解,便於後續的低功耗設計和應用。
好記性不如爛筆頭。