1. 程式人生 > 其它 >淺談stm32的低功耗模式

淺談stm32的低功耗模式

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

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

注意:

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

  • 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系列低功耗模式的特點和使用方法,使本人加深了對這些低功耗模式涉及的物件的理解,便於後續的低功耗設計和應用。
好記性不如爛筆頭。

參考資料

參考手冊
datasheet
程式設計手冊