意法半導體(STMicroelectronics)的超低功耗MCU系列采用低泄漏技術和優化設計,以實現出色的低電流消耗,使其非常適合電池供電和能量收集應用。為了充分利用這些器件的低功耗功能,有必要知道可用的低功耗模式,如何配置它們以及最適合哪些任務。本文概述了STM32L053C8 MCU上的低功耗模式。但是,由于該系列的低功耗模式相同,因此可以使用任何STM32L0器件。 STM32L1系列和STM32L4系列還包括在超低功耗系列中。這些器件是性能更高的產品,具有更高級的內核,更多的內存和更多的外圍設備。它們具有與L0系列相同的低功耗模式(對于L4系列,還具有一些其他功能),因此,本文也是從了解L4系列的好入門。圖1摘自ST的宣傳冊之一,簡要總結了L0、L1和L4系列的功能和優點。
圖1:STM32超低功耗產品系列的比較
當使用ST的MCU進行任何工作時,應該有兩個可用的文檔。首先是參考手冊,對于STM32L053C8,則是STM32L0x3參考手冊。本文檔包含有關STM32L0x3系列的詳細信息,即如何使用存儲器和外設集。有關產品線中特定設備的更多詳細信息,例如引腳映射、電氣特性和封裝信息,應使用數據表作為參考。就低功耗模式而言,參考手冊將明確詳細說明如何進入和退出它們,而數據手冊將專門定義外圍設備的可用性、可能的喚醒源和電流消耗估算。
背景介紹
STM32L0基于Cortex-M0 +內核,這意味著其低功耗功能取決于該內核的電源管理功能。可以使用系統控制塊中的系統控制寄存器(SCR)來配置這些功能。不幸的是,參考手冊或數據表中都沒有記錄內核寄存器。 ST則為那些尋求有關Cortex-M0 +的簡潔文檔的人員提供了STM32L0系列Cortex-M0 +編程手冊。有關Cortex-M0、M0 +和M1內核的完整文檔,可以在《 ARMv6-M體系結構參考手冊》中找到。這兩個文檔都有一個關于電源管理的部分,這是開始本主題的好地方。
圖2:SCR寄存器位
如圖2所示,SCR由三位組成:SEVONPEND、SLEEPONEXIT和SLEEPDEEP。 SEVONPEND(發送事件在待命狀態)位允許中斷進入待命狀態以觸發喚醒事件。請注意,如果未在NVIC中啟用這些中斷,則仍會產生喚醒事件,但不會輸入ISR。有關未決中斷,使能中斷或一般而言NVIC的更多信息,請參見前述Cortex-M0 +手冊中的“嵌套向量中斷控制器”部分。 SLEEPONEXIT位提供了一個選項,可以在異常恢復后使處理器繼續執行程序之前將處理器置于低功耗模式。對于僅需要喚醒服務中斷的應用程序來說,這是理想的選擇。最后,SLEEPDEEP位允許進入深度睡眠狀態,而不是常規睡眠狀態。利用Cortex-M0 +內核的芯片制造商可以確定這些狀態下設備的確切性能。睡眠狀態用作睡眠模式和低功耗睡眠模式的基礎,而深度睡眠狀態用作停止模式和待機模式的基礎。
有三種方法可以在Cortex-M0 +上進入低功耗模式。第一種是使用WFI(等待中斷)指令。顧名思義,如果設備由于該指令而進入低功耗模式,則中斷(在NVIC中啟用)能夠喚醒設備。進入低功耗模式的第二種方法是執行WFE(等待事件)指令。這與WFI指令非常相似,但具有更大的靈活性。不僅可以通過擴展中斷和事件控制器(EXTI)中配置的事件喚醒設備,還可以通過NVIC中禁用的中斷(只要它們在相應的外設控制寄存器中啟用)喚醒。已經提到了進入低功耗模式的第三種方法。通過將SCR中的SLEEPONEXIT位置1,異常返回將使設備進入低功耗模式,就像執行WFI指令一樣。請注意,在所有這些情況下,僅當沒有中斷或事件掛起時才進入低功耗模式。由于不能保證WFI和WFE會中止程序執行,因此通常將它們稱為“提示指令”。
值得一提的最后一個內核寄存器是PRIMASK寄存器。它僅包含一個可配置位PM(可優先中斷屏蔽),如果將其設置為1,它將禁用所有具有可配置優先級的中斷。如果首先需要將系統恢復到工作狀態,這不僅可以用于執行原子操作,而且可以延遲執行ISR。在詳細說明停止模式的部分中將提供一個示例。
為了使程序員在開發C應用程序時輕松訪問WFI和WFE指令,CMSIS-CORE標準提供了__WFI()和__WFE()函數。以下各節中的所有示例函數都使用__WFI()執行WFI指令并進入低功耗模式。另外,CMSIS不會直接提供對PRIMASK寄存器的訪問,而是實現__disable_irq()和__enable_irq()函數,以便分別設置和清除PM位。為了檢查PM位的狀態,__ get_PRIMASK()函數將返回其當前狀態。大多數IDE使將CMSIS驅動程序添加到項目變得非常簡單。例如,在Keil中,請確保在包安裝程序中安裝了ARM :: CMSIS,并在創建新項目時在運行時環境管理器中僅檢查“ CORE”包(在CMSIS組件)。
低功耗模式(Low-Power)
STM32L0器件實現了五種低功耗模式:低功耗運行模式、睡眠模式、低功耗睡眠模式、停止模式和待機模式。這些模式之間的差異可以用功耗,性能、喚醒時間和喚醒源來描述。如果對于這些參數中的每一個,將模式按從最佳(1)到最差(5)的順序進行排序,則可以清楚地了解哪些取舍。一般而言,隨著功耗的下降;性能下降,喚醒時間增加,喚醒源數量減少。表1總結了低功耗模式的排名。作為、示例,請考慮低功耗運行模式。它具有最佳的性能、最多的喚醒源,第二快的喚醒時間和第四低的電流消耗。
表1:基于各種工作參數的STM32L0低功耗模式的排列
在本節中,將很清楚如何得出這些排名。但是,重要的是要及早意識到它們僅在一般意義上是正確的。例如,停止模式完全有可能比低功耗睡眠模式消耗更多電流,這取決于它們的配置以及啟用/禁用的外設。但是通常情況并非如此,因為停止模式對設備功能的限制遠比低功耗睡眠模式所限制,以節省更多功率。
低功耗運行模式(Low-Power Run)
將其作為低功耗模式推銷是相當誘人的,因為它節省能耗的主要方法是要求較低的系統時鐘頻率。將任何微控制器的時鐘速度降低到千赫茲范圍將極大地降低電流消耗,使其與普通睡眠模式相比更具競爭力。但是,通常不這樣做的原因是,從長遠來看,性能的降低以及靜態電流消耗(不取決于時鐘頻率)會消耗更多的能量。取決于應用,即正在使用哪種睡眠模式或設備喚醒的頻率,在較短的時間段內消耗更多的電流而不是在較長的時間段內消耗較少的電流可能更有效。 ST之所以可以將其分類為低功耗模式,是因為它們提供了將內部穩壓器置于低功耗狀態的能力。這將減少設備消耗的靜態電流,從而將其對性能與總電流消耗之間的折衷影響降至最低。
為了將調節器切換到低功耗模式,必須滿足兩個條件。首先,調節器電壓(VCORE)必須在2范圍內。幸運的是,根據PWR_CR寄存器文檔,這是調節器的默認配置。因此,除非利用器件的動態電壓縮放功能,否則無需擔心此先決條件。第二個條件是系統頻率不超過fMSI范圍1。根據MSIRANGE位的描述(在RCC_ICSCR寄存器中),它對應于大約131.072 kHz的頻率。在這種速度和功率水平下,USB,ADC和TSC(觸摸感應控制器)外圍設備不可用。更改系統頻率后,必須重新初始化之前在運行模式下初始化的所有與頻率相關的外圍設備(USART、計時器等),以便繼續正常運行。
與其他低功耗模式不同,CPU不會在低功耗運行模式下停止。這意味著它不是通過前面討論的WFI / WFE指令輸入的,而是通過設置PWR_CR寄存器中的LPSDSR(低功耗睡眠-深度/睡眠/低功耗運行)和LPRUN(低功耗運行)位來輸入的。 。請注意,必須在設置LPRUN之前設置LPSDSR,在清除LPSDSR之前必須清除LPRUN,并且在進入任何其他低功耗模式之前應清除LPRUN。由于程序在低功耗運行模式下繼續執行,因此該設備被軟件“喚醒”,而不是局限于有限的一組中斷或事件。只需清除LPRUN位并使系統頻率恢復到全速,即可使系統返回運行模式。清單1顯示了使用參考手冊中概述的步驟進入低功耗運行模式的整個過程。清單2演示了當設備不再需要處于低功耗運行模式時如何重新進入運行模式。
清單1:進入低功耗運行模式的示例
void enter_LPRun( void )
{
/* 1. Each digital IP clock must be enabled or disabled by using the
RCC_APBxENR and RCC_AHBENR registers */
RCC->APB1ENR |= RCC_APB1ENR_PWREN;
/* 2. The frequency of the system clock must be decreased to not exceed the
frequency of f_MSI range1. */
Config_SysClk_MSI_131();
// Reinitialize peripherals dependent on clock speed
USART1_Init();
SysTick_Init( 0.001 );
I2C1_Init();
/* 3. The regulator is forced in low-power mode by software
(LPRUN and LPSDSR bits set ) */
PWR->CR &= ~PWR_CR_LPRUN; // Be sure LPRUN is cleared!
PWR->CR |= PWR_CR_LPSDSR; // must be set before LPRUN
PWR->CR |= PWR_CR_LPRUN; // enter low power run mode
}
清單2:進入運行模式的示例
void enter_Run( void )
{
/* Enable Clocks */
RCC->APB1ENR |= RCC_APB1ENR_PWREN;
/* Force the regulator into main mode */
// Reset LPRUN bit
PWR->CR &= ~( PWR_CR_LPRUN );
// LPSDSR can be reset only when LPRUN bit = 0;
PWR->CR &= ~( PWR_CR_LPSDSR );
/* Set HSI16 oscillator as system clock */
Config_SysClk_HSI16();
// Reinitialize peripherals dependent on clock speed
USART1_Init();
SysTick_Init( 0.001 );
I2C1_Init();
}
睡眠模式(Sleep Mode)
睡眠模式是低功耗模式中最簡單的一種,它以最省電的方式提供最短的喚醒時間。數據手冊指出,在禁用所有外設且系統頻率為16 MHz的情況下,將消耗約1 mA的電流。這遠高于其他低功耗模式,后者可以實現微安或什至納安的數量級。但是,喚醒時間幾乎是最具競爭力的低功耗模式的十倍。表2顯示了設備從每種低功耗模式喚醒并進入運行模式所花費的時間。喚醒時間的值取自數據表的表4。
表2:每種低功耗模式的喚醒到運行模式時間
在休眠模式下,所有外設繼續運行時,僅內核停止運行。由于不必降低系統頻率并且所有設備的外圍設備都可以使用,因此這使進入睡眠模式幾乎毫不費力。同樣,退出休眠模式非常容易,因為在運行模式下可用的任何中斷或事件都可以喚醒設備并以極低的延遲進行服務。因此,幾乎在CPU處于自旋鎖等待事件發生的任何情況下都可以使用睡眠模式。用戶無需進入繁忙等待循環,只需執行WFI或WFE(取決于喚醒方法)即可暫停執行并節省功耗,直到再次需要內核為止。這是因為SCR默認情況下配置為睡眠模式,即SLEEPDEEP位被清除。對于只需要CPU處理中斷的應用,將SLEEPONEXIT位置1并在處理完中斷后始終進入睡眠模式更為有意義,這與恢復程序執行相反。
清單3是可用于進入睡眠模式的函數示例。因為此函數取自使用多個低功耗模式的程序,所以第一條語句可確保清除SLEEPDEEP位,以避免意外行為。同樣,為了避免喚醒延遲,閃存訪問控制寄存器配置為在設備處于休眠模式時使非易失性存儲器保持空閑狀態。在低功耗睡眠模式部分中將進一步討論如何停止閃存接口時鐘。
清單3:進入睡眠模式的示例
void enter_Sleep( void )
{
/* Configure low-power mode */
SCB->SCR &= ~( SCB_SCR_SLEEPDEEP_Msk );// low-power mode = sleep mode
SCB->SCR |= SCB_SCR_SLEEPONEXIT_Msk; // reenter low-power mode after ISR
/* Ensure Flash memory stays on */
FLASH->ACR &= ~FLASH_ACR_SLEEP_PD;
__WFI();// enter low-power mode
}
低功耗睡眠模式(Low-Power Sleep Mode)
低功耗睡眠模式本質上是低功耗運行模式和睡眠模式的組合。不僅Cortex-M0 +內核停止了,而且調節器進入了低功耗模式,這意味著必須滿足與低功耗運行模式相同的條件。回想一下,VCORE必須在范圍2(默認配置)中,并且系統時鐘頻率必須降低到不超過fMSI范圍1(131.072 kHz)。因此,在此模式下,USB,ADC和TSC外設不可用。此外,任何繼續在低功耗睡眠模式下運行的頻率相關外圍設備都必須重新初始化,以便它們繼續正常運行。
與低功耗運行模式不同,LPRUN位不用于使穩壓器進入低功耗模式。一旦系統頻率降低,就應將LPSDSR位置1,并遵循進入睡眠模式的相同步驟。即,確保清除SLEEPDEEP位并執行WFI指令,WFE指令,或者將SLEEPONEXIT位置1,然后等待異常返回。當器件進入低功耗模式時,LPSDSR位將自動將調節器置于低功耗狀態。當器件在喚醒事件后退出低功耗模式時,將進入穩壓器全功率運行的運行模式。
參考手冊在“低功耗睡眠模式”部分中提到了關閉閃存的選項。當器件進入睡眠模式或低功耗睡眠模式時,將FLASH_ACR寄存器中的SLEEP_PD(SLEEP掉電)位置1將使非易失性存儲器進入掉電模式。雖然這確實增加了喚醒等待時間,但功耗卻降低了約12 μA(數據表中的表34),這可能因應用而異。喚醒時間的增加大概是因為在參考手冊的“睡眠模式”部分中沒有提及此選項的原因(即使它確實在睡眠模式下也起作用)。如果使用睡眠模式的應用程序不需要它提供的驚人的快速喚醒時間,則應該改為使用低功耗睡眠模式。清單4顯示了一個示例功能,該功能用于按照參考手冊中列出的步驟進入低功耗睡眠模式。
清單4:進入低功耗睡眠模式的示例
void enter_LPSleep( void )
{
/* 1. The Flash memory can be switched off by using the control bits
(SLEEP_PD in the FLASH_ACR register). This reduces power consumption
but increases the wake-up time. */
FLASH->ACR |= FLASH_ACR_SLEEP_PD;
/* 2. Each digital IP clock must be enabled or disabled by using the
RCC_APBxENR and RCC_AHBENR registers */
RCC->APB1ENR |= RCC_APB1ENR_PWREN;
/* 3. The frequency of the system clock must be decreased to not exceed the
frequency of f_MSI range1. */
// Set MSI 131.072 kHz as system clock
Config_SysClk_MSI_131();
// Reinitialize peripherals dependent on clock speed
USART1_Init();
SysTick_Init( 0.001 );
I2C1_Init();
/* 4. The regulator is forced in low-power mode by software
(LPSDSR bits set ) */
PWR->CR |= PWR_CR_LPSDSR; // voltage regulator in low-power mode during sleep
/* 5. Follow the steps described in Section 6.3.5: Entering low-power mode */
SCB->SCR &= ~( SCB_SCR_SLEEPDEEP_Msk ); // low-power mode = sleep mode
SCB->SCR |= SCB_SCR_SLEEPONEXIT_Msk; // reenter low-power mode after ISR
__WFI(); // enter low-power mode
}
停止模式(Stop Mode)
停止模式可以說是STM32L0系列中最復雜的低功耗模式,它有可能在保持SRAM和寄存器內容的同時實現納安量級的電流消耗。但是,如果喚醒時間更重要,則可以忽略許多節能選項,以實現與低功耗運行模式相同的延遲。更為復雜的問題是可用的喚醒源數量有限,勘誤表中多次提及“停止”模式以及增加的調試復雜性。但是,對于那些希望使用最少電量而又不必在喚醒時重新初始化系統的用戶來說,停止模式可能是最佳選擇。
在停止模式下,內核被停止,并且只有有限容量的LSE,LSI和HSI能夠運行的振蕩器。低速時鐘允許RTC和IWDG繼續運行并喚醒設備。 HSI可以為能夠在停止模式下運行的外圍設備提供有限的功能。例如,通過在需要時喚醒HSI,USART和I2C仍能夠在停止模式下接收數據。 HSI將僅提供請求它的外圍設備,并且在不再需要它時將自動被禁用。有關在停止模式下可用的所有外設的完整列表以及可用的喚醒源,請參見數據表中的表4。請注意,由于核心時鐘已停止,因此一旦進入停止模式,調試連接將無法維持。但是,根據參考手冊,將DBGMCU_CR寄存器中的DBG_STOP位置1將允許在停止模式下進行調試。
為了進入停止模式,必須將SLEEPDEEP位置1,因為停止模式和待機模式都是由Cortex-M0 +內核提供的深度睡眠狀態的實現。清除PWR_CR寄存器中的PDDS(掉電DeepSleep)位是在待機模式下選擇停止模式的方式。另外,有必要確保清除PWR_CSR寄存器中的WUF(喚醒標志)位。不幸的是,該位不能由軟件修改,必須通過向PWR_CR寄存器的CWUF(清除喚醒標志)位寫入1來清除。這將在2個系統時鐘周期后清除WUF。一旦滿足這些條件,用戶只需執行WFI指令,WFE指令或將SLEEPONEXIT位置1,然后等待異常返回。請注意,默認情況下,從停止模式喚醒時,設備會選擇MSI振蕩器作為系統時鐘。通過在進入停止模式之前將RCC_CFGR寄存器中的STOPWUCK(停止喚醒時鐘)位設置為1,將選擇HSI16振蕩器作為系統時鐘。清單5顯示了一個示例函數,它將使用此最低限度的配置進入Stop模式。它還顯示了如何啟用能夠喚醒設備的外部中斷。
清單5:進入停止模式的簡單示例
void enter_Stop( void )
{
/* Enable Clocks */
RCC->APB1ENR |= RCC_APB1ENR_PWREN;
RCC->IOPENR |= RCC_IOPENR_GPIOAEN;
/* Configure PA0 as External Interrupt */
GPIOA->MODER &= ~( GPIO_MODER_MODE0 ); // PA0 is in Input mode
EXTI->IMR |= EXTI_IMR_IM0; // interrupt request from line 0 not masked
EXTI->RTSR |= EXTI_RTSR_TR0; // rising trigger enabled for input line 0
// Enable interrupt in the NVIC
NVIC_EnableIRQ( EXTI0_1_IRQn );
NVIC_SetPriority( EXTI0_1_IRQn, BTN_INT_PRIO );
/* Prepare to enter stop mode */
PWR->CR |= PWR_CR_CWUF; // clear the WUF flag after 2 clock cycles
PWR->CR &= ~( PWR_CR_PDDS ); // Enter stop mode when the CPU enters deepsleep
RCC->CFGR |= RCC_CFGR_STOPWUCK; // HSI16 oscillator is wake-up from stop clock
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; // low-power mode = stop mode
__WFI(); // enter low-power mode
}
如果希望節省更多的電量,而喚醒時間就不再那么重要了,則可以在進入停止模式之前進行其他配置。最簡單的方法是通過將PWR_CR寄存器中的LPSDSR位置1使穩壓器進入低功耗模式。在同一寄存器中,如果任何模擬外設都沒有使用VREFINT(內部參考電壓),也可以將ULP(超低功耗模式)位置1以將其禁用。此外,如果喚醒后不需要立即使用VREFINT,將FWU(快速喚醒)位置1不會增加設置ULP可能引起的額外喚醒延遲。
前述更改將顯著降低電流消耗,但該設備可能仍在以微安為單位訂購。為了進入納安范圍,必須將所有GPIO引腳置于模擬模式。根據參考手冊第9.3.12節,當I / O引腳配置為模擬引腳時,施密特觸發器輸入被禁用,每個引腳的功耗為零。但是,這樣做意味著必須將每個端口的GPIOx_MODER寄存器保存,然后再將每個引腳切換到模擬模式。這樣,設備喚醒后,每個引腳都可以恢復到其先前的模式。另外,為了避免意外錯誤,在保存和恢復過程中都應禁用中斷。
清單6中的功能建立在清單5中的基本功能的基礎上。不僅將調節器置于低功耗模式并且VREFINT已關閉,而且在進入停止模式之前還保存了I / O上下文。由于在執行WFI時即禁用了中斷,即PM位置1,因此外部中斷將喚醒設備,但不會輸入其ISR。程序從WFI指令繼續執行,從而允許立即恢復上下文。重新啟用中斷后,由于中斷仍處于掛起狀態,因此將輸入外部中斷的ISR。
清單6:進入停止模式的高級示例
void enter_Stop( void )
{
/* Enable Clocks */
RCC->APB1ENR |= RCC_APB1ENR_PWREN;
RCC->IOPENR |= RCC_IOPENR_GPIOAEN;
/* Configure PA0 as External Interrupt */
GPIOA->MODER &= ~( GPIO_MODER_MODE0 ); // PA0 is in Input mode
EXTI->IMR |= EXTI_IMR_IM0; // interrupt request from line 0 not masked
EXTI->RTSR |= EXTI_RTSR_TR0; // rising trigger enabled for input line 0
// Enable interrupt in the NVIC
NVIC_EnableIRQ( EXTI0_1_IRQn );
NVIC_SetPriority( EXTI0_1_IRQn, BTN_INT_PRIO );
/* Prepare to enter stop mode */
PWR->CR |= PWR_CR_CWUF; // clear the WUF flag after 2 clock cycles
PWR->CR &= ~( PWR_CR_PDDS ); // Enter stop mode when the CPU enters deepsleep
// V_REFINT startup time ignored | V_REFINT off in LP mode | regulator in LP mode
PWR->CR |= PWR_CR_FWU | PWR_CR_ULP | PWR_CR_LPSDSR;
RCC->CFGR |= RCC_CFGR_STOPWUCK; // HSI16 oscillator is wake-up from stop clock
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; // low-power mode = stop mode
__disable_irq();
Idd_SaveContext();
I2C1->CR1 &= ~I2C_CR1_PE;// Address issue 2.5.1 in Errata
__WFI(); // enter low-power mode
I2C1->CR1 |= I2C_CR1_PE;
Idd_RestoreContext();
__enable_irq(); // <-- go to isr
}
清單5和清單6均使用來自PA0引腳的外部中斷來喚醒設備。這是因為外部中斷是由EXTI控制的,并且除了系統復位以外,只有它可以使設備退出停止模式。簡而言之,EXTI管理著30條內部和外部線路,能夠產生中斷和事件。參考手冊中的表52指定了每條線路的線路來源以及它們是可配置線路還是直接線路。在上述示例中,默認情況下,EXTI行0映射到PA0,因此不必自行配置行。所有要做的就是使該線路成為中斷源,選擇如何觸發中斷,并在NVIC中啟用相應的中斷。如果使用WFE指令進入了停止模式,則該行將在事件模式下啟用。
表3總結了STM32L053x6 / 8勘誤表中記錄的停止模式的局限性。顯然,無論使用什么版本的芯片,程序員都應該解決一些問題,以避免出現意外錯誤。清單6中的函數實現了針對未配置I2C外設以將設備從停止模式喚醒而導致的問題的建議解決方法。勘誤表中的2.5.1節解釋說,在進入停止模式之前禁用I2C外設并在喚醒后立即重新啟用它可以避免任何錯誤。幸運的是,該解決方法可以與保存和還原I / O上下文一起完成。
待機模式(Standby Mode)
與停止模式不同,進入待機模式非常簡單,因為用戶的選項更少。唯一可用的振蕩器是LSI和LSE,唯一可以工作的外設是RTC和IWDG,電壓調節器被完全禁用,并且所有I / O引腳都設置為高阻抗(因此節省上下文毫無意義)。用戶進入待機模式所需要做的全部工作就是將SLEEPDEEP位置1,將PDDS位置1,并確保通過向CWUF位寫入1來清除WFU位。然后,在異常返回之前執行WFI指令,WFE指令或設置SLEEPONEXIT將導致設備進入此低功耗模式。退出待機模式的選項也更少。只有喚醒引腳(PA0或PC13)上的上升沿,RTC喚醒事件之一或IWDG復位才會喚醒設備。在進入待機模式之前,必須配置選擇的方法并清除相應的喚醒標志。請注意,STM32L053C8芯片僅具有兩個喚醒引腳,而參考手冊和數據表中通常會提到僅在引腳數較高的封裝中才可使用的第三個喚醒引腳。
待機模式的最大問題是它不保留SRAM或寄存器(RTC寄存器,RTC備份寄存器和待機電路除外)的內容。從待機模式喚醒后,程序執行將以與發生復位相同的方式重新開始。為了確定系統是否從待機模式中喚醒,只要輸入main()函數,就可以檢查PWR_CSR寄存器中的SBF(待機標志)位。如果該位置1,則該設備先前處于待機模式,并且應設置CSBF(清除待機標志)以清除SBF。然后,用戶知道是否應該在首次運行時初始化系統,或者是否應該將系統還原到以前的狀態。
請注意,表2中的待機模式具有最長的喚醒時間。此估算不包括重新初始化系統和恢復程序執行所需的時間。這種增加的等待時間不僅使對喚醒事件的立即響應幾乎不可能,而且會嚴重限制待機模式的節能功能。為了將平均消耗電流保持在“停止”模式之下,該設備將必須處于“待機”模式很長時間。時間長短取決于喚醒/重新初始化過程中消耗了多少電流。清單7顯示了一個示例函數,該函數可用于進入待機模式,在該模式下,任一喚醒引腳都將喚醒設備。
清單7:進入待機模式的示例
void enter_Standby( void )
{
/* Enable Clocks */
RCC->APB1ENR |= RCC_APB1ENR_PWREN;
/* Prepare for Standby */
// if WKUP pins are already high, the WUF bit will be set
PWR->CSR |= PWR_CSR_EWUP1 | PWR_CSR_EWUP2;
PWR->CR |= PWR_CR_CWUF; // clear the WUF flag after 2 clock cycles
PWR->CR |= PWR_CR_ULP; // V_{REFINT} is off in low-power mode
PWR->CR |= PWR_CR_PDDS; // Enter Standby mode when the CPU enters deepsleep
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; // low-power mode = stop mode
SCB->SCR |= SCB_SCR_SLEEPONEXIT_Msk; // reenter low-power mode after ISR
__WFI(); // enter low-power mode
}
結論
適用于超低功率應用,例如燃氣/水表、可穿戴設備或物聯網傳感器,STM32L系列微控制器具有許多低功耗模式,允許用戶仔細地在性能與功耗之間取得平衡。尤其是,STM32L0系列利用了最節能的ARM處理器(Cortex-M0 +),并提供了五種低功耗模式,以適應大多數入門級應用。
低功耗運行模式可產生最佳性能,同時仍比睡眠模式消耗更少的電流。因為CPU一直在運行,所以喚醒器件的決定是由軟件決定的,從而在這方面提供了最大的靈活性。不幸的是,使穩壓器處于低功耗模式會導致喚醒延遲,這對于許多實時應用而言太大了。這是睡眠模式真正出類拔萃的地方,它具有0.36 μs的喚醒時間,這是因為在內核被禁用的情況下允許所有外設全速運行。但是,這也使它成為最耗電的低功耗模式,外圍設備性能和全套硬件喚醒源對此幾乎沒有補償。低功耗睡眠模式使用與低功耗運行模式相同的方法,以將電流消耗降低到與停止模式相當的水平,而不會限制喚醒源的數量。但是,如果足以使EXIT喚醒器件,則停止模式將提供最低的電流消耗,同時仍保留SRAM和寄存器內容。它還具有與低功耗運行模式相當的喚醒時間。最后,對于長時間不需要MCU的應用,待機模式可能是合適的。它使用最少的功耗,但卻消耗了很少的喚醒源和最長的喚醒時間。
編輯:hfy
-
mcu
+關注
關注
146文章
17148瀏覽量
351198 -
寄存器
+關注
關注
31文章
5343瀏覽量
120368 -
STM32
+關注
關注
2270文章
10900瀏覽量
356012 -
意法半導體
+關注
關注
31文章
3137瀏覽量
108631
發布評論請先 登錄
相關推薦
評論