淺談stm32的低功耗模式

来源:https://www.cnblogs.com/lxyjrx/archive/2022/05/05/16223115.html
-Advertisement-
Play Games

stm32標準庫實現低功耗 一、概述 stm32不同系列晶元支持的低功耗模式各有差異,本文以F103系列晶元為例,簡單講解不同低功耗模式的特點和使用方法。 二、低功耗 簡述 預設情況下,系統或電源複位後,微控制器處於Run模式。當CPU不需要保持運行時(例如等待外部事件時),可以使用幾種低功耗模式來 ...


stm32標準庫實現低功耗

一、概述

stm32不同系列晶元支持的低功耗模式各有差異,本文以F103系列晶元為例,簡單講解不同低功耗模式的特點和使用方法。

二、低功耗

簡述

預設情況下,系統或電源複位後,微控制器處於Run模式。當CPU不需要保持運行時(例如等待外部事件時),可以使用幾種低功耗模式來節省電源。這取決於用戶選擇的模式,以提供低功耗、較短啟動時間和可用的喚醒源之間的最佳折衷。

stm32f10xxx 設備有三種低功耗模式:

  • 睡眠模式
    這種模式會關閉cpu時鐘,但是所有外設包括M3內核的外設(NVIC、SysTick等等)都不會受到影響,保持運行
  • 停止模式
    所有時鐘都會關閉
  • 待機模式
    1.8供電區域斷電

另外,mcu在運行模式(run)下也可以通過以下方式降低功耗:

  • 降低系統時鐘頻率
  • 關閉一些不使用的外設的時鐘

上面這三種低功耗模式的具體描述可以看下麵這個圖,覺得閱讀英文不方便的話請自行翻譯,我覺得這更有助於你去理解這幾個模式的特點。
低功耗模式詳細描述

下麵這張表更好的彙總了各種低功耗模式的特點:
123

詳細介紹

下麵會簡單介紹各種降低功耗的方法,包括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通道掛起位。

所有進入和退出休眠的細節彙總成以下表格:
111

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狀態,雖然減少了啟動時間,但消耗更高。

下圖彙總了停止模式進入和退出的細節信息。
停止模式細節

註意:

  1. 在進入停止模式之前,要清除所有中斷掛起位,如上圖所述。
  2. 喚醒之後記得要重新配置系統時鐘。

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時鐘源中的兩個,如下圖:
1234

  • 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。

下麵彙總一些各個低功耗模式的特點和使用方法:
1234
23456

總結

本文簡單介紹了STM32F1系列低功耗模式的特點和使用方法,使本人加深了對這些低功耗模式涉及的對象的理解,便於後續的低功耗設計和應用。
好記性不如爛筆頭。

參考資料

參考手冊
datasheet
編程手冊


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • C++實例1--通訊錄管理系統 1 #include<iostream> 2 #include<string> 3 4 using namespace std; 5 6 #define MAX 1000 // 最大人數 7 8 // 通訊錄管理系統 9 10 // 主菜單 11 void showM ...
  • 大家好,我是DD,今天繼續來學點Java的新特性! 假設有這樣一個場景,我們需要做一個工具。用來自動生成項目文檔,文檔可以通過瀏覽器查看,所以最後產出物肯定是一堆html文件。為了讓這些html文件更容易讀,良好的格式肯定要保持,該換行的換行、該縮進的縮進。 那麼,在組織最後內容的時候,你可能就會這 ...
  • 為組件設置邊框 很多情況下,我們常常喜歡給不同的組件設置邊框,從而讓界面的層次感更明顯,swing中提供了Border對象來代表一個邊框,下圖是Border的繼承體系圖: ​ 特殊的Border: TitledBorder:它的作用並不是直接為其他組件添加邊框,而是為其他邊框設置標題,創建該類的對象 ...
  • iNeuOS本次更新主要完善數據點、設備和計算平臺的計算預警,三個地方的計算預警作用的數據範圍不一樣,數據點只對單獨數據點、設備是對當前設備範圍的數據點、計算平臺是對當前平臺的所有數據點。 ...
  • 本節介紹有關伺服器管理和維護過程中的一些註意事項,都是筆者的經驗之談,相信對新手會有一定的啟發和幫助。 很多初學者接觸Linux 時間不長,還未完整地學習一遍 Linux,理解本節內容可能有些困難,可以先跳過本節,閱讀完整套教程後再回過頭來閱讀。 遠程伺服器關機及重啟時的註意事項 為什麼遠程伺服器不 ...
  • 本文例子參考《STM32單片機開發實例——基於Proteus虛擬模擬與HAL/LL庫》 源代碼:https://github.com/LanLinnet/STM33F103R6 項目要求 實現數位管動態顯示數字1~8。 硬體設計 在第一節的基礎上,在Proteus中添加電路如下圖所示,其中我們添加了 ...
  • 前面講過,Linux 系統中“一切皆文件”,所有文件都放置在以根目錄為樹根的樹形目錄結構中。在 Linux 看來,任何硬體設備也都是文件,它們各有自己的一套文件系統(文件目錄結構)。 因此產生的問題是,當在 Linux 系統中使用這些硬體設備時,只有將Linux本身的文件目錄與硬體設備的文件目錄合二 ...
  • 很多人看到系統修複模式這節內容時,都會有所感慨:Linux 的密碼破解太容易了,這樣的操作系統還安全嗎?Linux 不是以安全性著稱的嗎? 圖 1 密碼安全 本節,我們結合圖 1 解釋一下類似的問題。 我們一開始始為了安全,給用戶設定密碼,但是這樣密碼可以很容易地被單用戶模式破解。我們又想到,進入單 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...