0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32L053C8 MCU上的低功耗模式詳解

電子設(shè)計(jì) ? 來(lái)源:一板網(wǎng) ? 作者:woshi_ziyu ? 2020-11-09 15:23 ? 次閱讀

意法半導(dǎo)體(STMicroelectronics)的超低功耗MCU系列采用低泄漏技術(shù)和優(yōu)化設(shè)計(jì),以實(shí)現(xiàn)出色的低電流消耗,使其非常適合電池供電和能量收集應(yīng)用。為了充分利用這些器件的低功耗功能,有必要知道可用的低功耗模式,如何配置它們以及最適合哪些任務(wù)。本文概述了STM32L053C8 MCU上的低功耗模式。但是,由于該系列的低功耗模式相同,因此可以使用任何STM32L0器件。 STM32L1系列和STM32L4系列還包括在超低功耗系列中。這些器件是性能更高的產(chǎn)品,具有更高級(jí)的內(nèi)核,更多的內(nèi)存和更多的外圍設(shè)備。它們具有與L0系列相同的低功耗模式(對(duì)于L4系列,還具有一些其他功能),因此,本文也是從了解L4系列的好入門(mén)。圖1摘自ST的宣傳冊(cè)之一,簡(jiǎn)要總結(jié)了L0、L1和L4系列的功能和優(yōu)點(diǎn)。

圖1:STM32超低功耗產(chǎn)品系列的比較

當(dāng)使用ST的MCU進(jìn)行任何工作時(shí),應(yīng)該有兩個(gè)可用的文檔。首先是參考手冊(cè),對(duì)于STM32L053C8,則是STM32L0x3參考手冊(cè)。本文檔包含有關(guān)STM32L0x3系列的詳細(xì)信息,即如何使用存儲(chǔ)器和外設(shè)集。有關(guān)產(chǎn)品線中特定設(shè)備的更多詳細(xì)信息,例如引腳映射、電氣特性和封裝信息,應(yīng)使用數(shù)據(jù)表作為參考。就低功耗模式而言,參考手冊(cè)將明確詳細(xì)說(shuō)明如何進(jìn)入和退出它們,而數(shù)據(jù)手冊(cè)將專門(mén)定義外圍設(shè)備的可用性、可能的喚醒源和電流消耗估算。

背景介紹

STM32L0基于Cortex-M0 +內(nèi)核,這意味著其低功耗功能取決于該內(nèi)核的電源管理功能??梢允褂孟到y(tǒng)控制塊中的系統(tǒng)控制寄存器(SCR)來(lái)配置這些功能。不幸的是,參考手冊(cè)或數(shù)據(jù)表中都沒(méi)有記錄內(nèi)核寄存器。 ST則為那些尋求有關(guān)Cortex-M0 +的簡(jiǎn)潔文檔的人員提供了STM32L0系列Cortex-M0 +編程手冊(cè)。有關(guān)Cortex-M0、M0 +和M1內(nèi)核的完整文檔,可以在《 ARMv6-M體系結(jié)構(gòu)參考手冊(cè)》中找到。這兩個(gè)文檔都有一個(gè)關(guān)于電源管理的部分,這是開(kāi)始本主題的好地方。

圖2:SCR寄存器位

如圖2所示,SCR由三位組成:SEVONPEND、SLEEPONEXIT和SLEEPDEEP。 SEVONPEND(發(fā)送事件在待命狀態(tài))位允許中斷進(jìn)入待命狀態(tài)以觸發(fā)喚醒事件。請(qǐng)注意,如果未在NVIC中啟用這些中斷,則仍會(huì)產(chǎn)生喚醒事件,但不會(huì)輸入ISR。有關(guān)未決中斷,使能中斷或一般而言NVIC的更多信息,請(qǐng)參見(jiàn)前述Cortex-M0 +手冊(cè)中的“嵌套向量中斷控制器”部分。 SLEEPONEXIT位提供了一個(gè)選項(xiàng),可以在異常恢復(fù)后使處理器繼續(xù)執(zhí)行程序之前將處理器置于低功耗模式。對(duì)于僅需要喚醒服務(wù)中斷的應(yīng)用程序來(lái)說(shuō),這是理想的選擇。最后,SLEEPDEEP位允許進(jìn)入深度睡眠狀態(tài),而不是常規(guī)睡眠狀態(tài)。利用Cortex-M0 +內(nèi)核的芯片制造商可以確定這些狀態(tài)下設(shè)備的確切性能。睡眠狀態(tài)用作睡眠模式和低功耗睡眠模式的基礎(chǔ),而深度睡眠狀態(tài)用作停止模式和待機(jī)模式的基礎(chǔ)。

有三種方法可以在Cortex-M0 +上進(jìn)入低功耗模式。第一種是使用WFI(等待中斷)指令。顧名思義,如果設(shè)備由于該指令而進(jìn)入低功耗模式,則中斷(在NVIC中啟用)能夠喚醒設(shè)備。進(jìn)入低功耗模式的第二種方法是執(zhí)行WFE(等待事件)指令。這與WFI指令非常相似,但具有更大的靈活性。不僅可以通過(guò)擴(kuò)展中斷和事件控制器(EXTI)中配置的事件喚醒設(shè)備,還可以通過(guò)NVIC中禁用的中斷(只要它們?cè)谙鄳?yīng)的外設(shè)控制寄存器中啟用)喚醒。已經(jīng)提到了進(jìn)入低功耗模式的第三種方法。通過(guò)將SCR中的SLEEPONEXIT位置1,異常返回將使設(shè)備進(jìn)入低功耗模式,就像執(zhí)行WFI指令一樣。請(qǐng)注意,在所有這些情況下,僅當(dāng)沒(méi)有中斷或事件掛起時(shí)才進(jìn)入低功耗模式。由于不能保證WFI和WFE會(huì)中止程序執(zhí)行,因此通常將它們稱為“提示指令”。

值得一提的最后一個(gè)內(nèi)核寄存器是PRIMASK寄存器。它僅包含一個(gè)可配置位PM(可優(yōu)先中斷屏蔽),如果將其設(shè)置為1,它將禁用所有具有可配置優(yōu)先級(jí)的中斷。如果首先需要將系統(tǒng)恢復(fù)到工作狀態(tài),這不僅可以用于執(zhí)行原子操作,而且可以延遲執(zhí)行ISR。在詳細(xì)說(shuō)明停止模式的部分中將提供一個(gè)示例。

為了使程序員在開(kāi)發(fā)C應(yīng)用程序時(shí)輕松訪問(wèn)WFI和WFE指令,CMSIS-CORE標(biāo)準(zhǔn)提供了__WFI()和__WFE()函數(shù)。以下各節(jié)中的所有示例函數(shù)都使用__WFI()執(zhí)行WFI指令并進(jìn)入低功耗模式。另外,CMSIS不會(huì)直接提供對(duì)PRIMASK寄存器的訪問(wèn),而是實(shí)現(xiàn)__disable_irq()和__enable_irq()函數(shù),以便分別設(shè)置和清除PM位。為了檢查PM位的狀態(tài),__ get_PRIMASK()函數(shù)將返回其當(dāng)前狀態(tài)。大多數(shù)IDE使將CMSIS驅(qū)動(dòng)程序添加到項(xiàng)目變得非常簡(jiǎn)單。例如,在Keil中,請(qǐng)確保在包安裝程序中安裝了ARM :: CMSIS,并在創(chuàng)建新項(xiàng)目時(shí)在運(yùn)行時(shí)環(huán)境管理器中僅檢查“ CORE”包(在CMSIS組件)。

低功耗模式(Low-Power)

STM32L0器件實(shí)現(xiàn)了五種低功耗模式:低功耗運(yùn)行模式、睡眠模式、低功耗睡眠模式、停止模式和待機(jī)模式。這些模式之間的差異可以用功耗,性能、喚醒時(shí)間和喚醒源來(lái)描述。如果對(duì)于這些參數(shù)中的每一個(gè),將模式按從最佳(1)到最差(5)的順序進(jìn)行排序,則可以清楚地了解哪些取舍。一般而言,隨著功耗的下降;性能下降,喚醒時(shí)間增加,喚醒源數(shù)量減少。表1總結(jié)了低功耗模式的排名。作為、示例,請(qǐng)考慮低功耗運(yùn)行模式。它具有最佳的性能、最多的喚醒源,第二快的喚醒時(shí)間和第四低的電流消耗。

表1:基于各種工作參數(shù)的STM32L0低功耗模式的排列

在本節(jié)中,將很清楚如何得出這些排名。但是,重要的是要及早意識(shí)到它們僅在一般意義上是正確的。例如,停止模式完全有可能比低功耗睡眠模式消耗更多電流,這取決于它們的配置以及啟用/禁用的外設(shè)。但是通常情況并非如此,因?yàn)橥V鼓J綄?duì)設(shè)備功能的限制遠(yuǎn)比低功耗睡眠模式所限制,以節(jié)省更多功率。

低功耗運(yùn)行模式(Low-Power Run)

將其作為低功耗模式推銷(xiāo)是相當(dāng)誘人的,因?yàn)樗?jié)省能耗的主要方法是要求較低的系統(tǒng)時(shí)鐘頻率。將任何微控制器的時(shí)鐘速度降低到千赫茲范圍將極大地降低電流消耗,使其與普通睡眠模式相比更具競(jìng)爭(zhēng)力。但是,通常不這樣做的原因是,從長(zhǎng)遠(yuǎn)來(lái)看,性能的降低以及靜態(tài)電流消耗(不取決于時(shí)鐘頻率)會(huì)消耗更多的能量。取決于應(yīng)用,即正在使用哪種睡眠模式或設(shè)備喚醒的頻率,在較短的時(shí)間段內(nèi)消耗更多的電流而不是在較長(zhǎng)的時(shí)間段內(nèi)消耗較少的電流可能更有效。 ST之所以可以將其分類(lèi)為低功耗模式,是因?yàn)樗鼈兲峁┝藢?nèi)部穩(wěn)壓器置于低功耗狀態(tài)的能力。這將減少設(shè)備消耗的靜態(tài)電流,從而將其對(duì)性能與總電流消耗之間的折衷影響降至最低。

為了將調(diào)節(jié)器切換到低功耗模式,必須滿足兩個(gè)條件。首先,調(diào)節(jié)器電壓(VCORE)必須在2范圍內(nèi)。幸運(yùn)的是,根據(jù)PWR_CR寄存器文檔,這是調(diào)節(jié)器的默認(rèn)配置。因此,除非利用器件的動(dòng)態(tài)電壓縮放功能,否則無(wú)需擔(dān)心此先決條件。第二個(gè)條件是系統(tǒng)頻率不超過(guò)fMSI范圍1。根據(jù)MSIRANGE位的描述(在RCC_ICSCR寄存器中),它對(duì)應(yīng)于大約131.072 kHz的頻率。在這種速度和功率水平下,USBADC和TSC(觸摸感應(yīng)控制器)外圍設(shè)備不可用。更改系統(tǒng)頻率后,必須重新初始化之前在運(yùn)行模式下初始化的所有與頻率相關(guān)的外圍設(shè)備(USART、計(jì)時(shí)器等),以便繼續(xù)正常運(yùn)行。

與其他低功耗模式不同,CPU不會(huì)在低功耗運(yùn)行模式下停止。這意味著它不是通過(guò)前面討論的WFI / WFE指令輸入的,而是通過(guò)設(shè)置PWR_CR寄存器中的LPSDSR(低功耗睡眠-深度/睡眠/低功耗運(yùn)行)和LPRUN(低功耗運(yùn)行)位來(lái)輸入的。 。請(qǐng)注意,必須在設(shè)置LPRUN之前設(shè)置LPSDSR,在清除LPSDSR之前必須清除LPRUN,并且在進(jìn)入任何其他低功耗模式之前應(yīng)清除LPRUN。由于程序在低功耗運(yùn)行模式下繼續(xù)執(zhí)行,因此該設(shè)備被軟件“喚醒”,而不是局限于有限的一組中斷或事件。只需清除LPRUN位并使系統(tǒng)頻率恢復(fù)到全速,即可使系統(tǒng)返回運(yùn)行模式。清單1顯示了使用參考手冊(cè)中概述的步驟進(jìn)入低功耗運(yùn)行模式的整個(gè)過(guò)程。清單2演示了當(dāng)設(shè)備不再需要處于低功耗運(yùn)行模式時(shí)如何重新進(jìn)入運(yùn)行模式。

清單1:進(jìn)入低功耗運(yùn)行模式的示例

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:進(jìn)入運(yùn)行模式的示例

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)

睡眠模式是低功耗模式中最簡(jiǎn)單的一種,它以最省電的方式提供最短的喚醒時(shí)間。數(shù)據(jù)手冊(cè)指出,在禁用所有外設(shè)且系統(tǒng)頻率為16 MHz的情況下,將消耗約1 mA的電流。這遠(yuǎn)高于其他低功耗模式,后者可以實(shí)現(xiàn)微安或什至納安的數(shù)量級(jí)。但是,喚醒時(shí)間幾乎是最具競(jìng)爭(zhēng)力的低功耗模式的十倍。表2顯示了設(shè)備從每種低功耗模式喚醒并進(jìn)入運(yùn)行模式所花費(fèi)的時(shí)間。喚醒時(shí)間的值取自數(shù)據(jù)表的表4。

表2:每種低功耗模式的喚醒到運(yùn)行模式時(shí)間

在休眠模式下,所有外設(shè)繼續(xù)運(yùn)行時(shí),僅內(nèi)核停止運(yùn)行。由于不必降低系統(tǒng)頻率并且所有設(shè)備的外圍設(shè)備都可以使用,因此這使進(jìn)入睡眠模式幾乎毫不費(fèi)力。同樣,退出休眠模式非常容易,因?yàn)樵谶\(yùn)行模式下可用的任何中斷或事件都可以喚醒設(shè)備并以極低的延遲進(jìn)行服務(wù)。因此,幾乎在CPU處于自旋鎖等待事件發(fā)生的任何情況下都可以使用睡眠模式。用戶無(wú)需進(jìn)入繁忙等待循環(huán),只需執(zhí)行WFI或WFE(取決于喚醒方法)即可暫停執(zhí)行并節(jié)省功耗,直到再次需要內(nèi)核為止。這是因?yàn)镾CR默認(rèn)情況下配置為睡眠模式,即SLEEPDEEP位被清除。對(duì)于只需要CPU處理中斷的應(yīng)用,將SLEEPONEXIT位置1并在處理完中斷后始終進(jìn)入睡眠模式更為有意義,這與恢復(fù)程序執(zhí)行相反。

清單3是可用于進(jìn)入睡眠模式的函數(shù)示例。因?yàn)榇撕瘮?shù)取自使用多個(gè)低功耗模式的程序,所以第一條語(yǔ)句可確保清除SLEEPDEEP位,以避免意外行為。同樣,為了避免喚醒延遲,閃存訪問(wèn)控制寄存器配置為在設(shè)備處于休眠模式時(shí)使非易失性存儲(chǔ)器保持空閑狀態(tài)。在低功耗睡眠模式部分中將進(jìn)一步討論如何停止閃存接口時(shí)鐘。

清單3:進(jìn)入睡眠模式的示例

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)

低功耗睡眠模式本質(zhì)上是低功耗運(yùn)行模式和睡眠模式的組合。不僅Cortex-M0 +內(nèi)核停止了,而且調(diào)節(jié)器進(jìn)入了低功耗模式,這意味著必須滿足與低功耗運(yùn)行模式相同的條件?;叵胍幌?,VCORE必須在范圍2(默認(rèn)配置)中,并且系統(tǒng)時(shí)鐘頻率必須降低到不超過(guò)fMSI范圍1(131.072 kHz)。因此,在此模式下,USB,ADC和TSC外設(shè)不可用。此外,任何繼續(xù)在低功耗睡眠模式下運(yùn)行的頻率相關(guān)外圍設(shè)備都必須重新初始化,以便它們繼續(xù)正常運(yùn)行。

與低功耗運(yùn)行模式不同,LPRUN位不用于使穩(wěn)壓器進(jìn)入低功耗模式。一旦系統(tǒng)頻率降低,就應(yīng)將LPSDSR位置1,并遵循進(jìn)入睡眠模式的相同步驟。即,確保清除SLEEPDEEP位并執(zhí)行WFI指令,WFE指令,或者將SLEEPONEXIT位置1,然后等待異常返回。當(dāng)器件進(jìn)入低功耗模式時(shí),LPSDSR位將自動(dòng)將調(diào)節(jié)器置于低功耗狀態(tài)。當(dāng)器件在喚醒事件后退出低功耗模式時(shí),將進(jìn)入穩(wěn)壓器全功率運(yùn)行的運(yùn)行模式。

參考手冊(cè)在“低功耗睡眠模式”部分中提到了關(guān)閉閃存的選項(xiàng)。當(dāng)器件進(jìn)入睡眠模式或低功耗睡眠模式時(shí),將FLASH_ACR寄存器中的SLEEP_PD(SLEEP掉電)位置1將使非易失性存儲(chǔ)器進(jìn)入掉電模式。雖然這確實(shí)增加了喚醒等待時(shí)間,但功耗卻降低了約12 μA(數(shù)據(jù)表中的表34),這可能因應(yīng)用而異。喚醒時(shí)間的增加大概是因?yàn)樵趨⒖际謨?cè)的“睡眠模式”部分中沒(méi)有提及此選項(xiàng)的原因(即使它確實(shí)在睡眠模式下也起作用)。如果使用睡眠模式的應(yīng)用程序不需要它提供的驚人的快速喚醒時(shí)間,則應(yīng)該改為使用低功耗睡眠模式。清單4顯示了一個(gè)示例功能,該功能用于按照參考手冊(cè)中列出的步驟進(jìn)入低功耗睡眠模式。

清單4:進(jìn)入低功耗睡眠模式的示例

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)

停止模式可以說(shuō)是STM32L0系列中最復(fù)雜的低功耗模式,它有可能在保持SRAM和寄存器內(nèi)容的同時(shí)實(shí)現(xiàn)納安量級(jí)的電流消耗。但是,如果喚醒時(shí)間更重要,則可以忽略許多節(jié)能選項(xiàng),以實(shí)現(xiàn)與低功耗運(yùn)行模式相同的延遲。更為復(fù)雜的問(wèn)題是可用的喚醒源數(shù)量有限,勘誤表中多次提及“停止”模式以及增加的調(diào)試復(fù)雜性。但是,對(duì)于那些希望使用最少電量而又不必在喚醒時(shí)重新初始化系統(tǒng)的用戶來(lái)說(shuō),停止模式可能是最佳選擇。

在停止模式下,內(nèi)核被停止,并且只有有限容量的LSE,LSI和HSI能夠運(yùn)行的振蕩器。低速時(shí)鐘允許RTC和IWDG繼續(xù)運(yùn)行并喚醒設(shè)備。 HSI可以為能夠在停止模式下運(yùn)行的外圍設(shè)備提供有限的功能。例如,通過(guò)在需要時(shí)喚醒HSI,USART和I2C仍能夠在停止模式下接收數(shù)據(jù)。 HSI將僅提供請(qǐng)求它的外圍設(shè)備,并且在不再需要它時(shí)將自動(dòng)被禁用。有關(guān)在停止模式下可用的所有外設(shè)的完整列表以及可用的喚醒源,請(qǐng)參見(jiàn)數(shù)據(jù)表中的表4。請(qǐng)注意,由于核心時(shí)鐘已停止,因此一旦進(jìn)入停止模式,調(diào)試連接將無(wú)法維持。但是,根據(jù)參考手冊(cè),將DBGMCU_CR寄存器中的DBG_STOP位置1將允許在停止模式下進(jìn)行調(diào)試。

為了進(jìn)入停止模式,必須將SLEEPDEEP位置1,因?yàn)橥V鼓J胶痛龣C(jī)模式都是由Cortex-M0 +內(nèi)核提供的深度睡眠狀態(tài)的實(shí)現(xiàn)。清除PWR_CR寄存器中的PDDS(掉電DeepSleep)位是在待機(jī)模式下選擇停止模式的方式。另外,有必要確保清除PWR_CSR寄存器中的WUF(喚醒標(biāo)志)位。不幸的是,該位不能由軟件修改,必須通過(guò)向PWR_CR寄存器的CWUF(清除喚醒標(biāo)志)位寫(xiě)入1來(lái)清除。這將在2個(gè)系統(tǒng)時(shí)鐘周期后清除WUF。一旦滿足這些條件,用戶只需執(zhí)行WFI指令,WFE指令或?qū)LEEPONEXIT位置1,然后等待異常返回。請(qǐng)注意,默認(rèn)情況下,從停止模式喚醒時(shí),設(shè)備會(huì)選擇MSI振蕩器作為系統(tǒng)時(shí)鐘。通過(guò)在進(jìn)入停止模式之前將RCC_CFGR寄存器中的STOPWUCK(停止喚醒時(shí)鐘)位設(shè)置為1,將選擇HSI16振蕩器作為系統(tǒng)時(shí)鐘。清單5顯示了一個(gè)示例函數(shù),它將使用此最低限度的配置進(jìn)入Stop模式。它還顯示了如何啟用能夠喚醒設(shè)備的外部中斷。

清單5:進(jìn)入停止模式的簡(jiǎn)單示例

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

}

如果希望節(jié)省更多的電量,而喚醒時(shí)間就不再那么重要了,則可以在進(jìn)入停止模式之前進(jìn)行其他配置。最簡(jiǎn)單的方法是通過(guò)將PWR_CR寄存器中的LPSDSR位置1使穩(wěn)壓器進(jìn)入低功耗模式。在同一寄存器中,如果任何模擬外設(shè)都沒(méi)有使用VREFINT(內(nèi)部參考電壓),也可以將ULP(超低功耗模式)位置1以將其禁用。此外,如果喚醒后不需要立即使用VREFINT,將FWU(快速喚醒)位置1不會(huì)增加設(shè)置ULP可能引起的額外喚醒延遲。

前述更改將顯著降低電流消耗,但該設(shè)備可能仍在以微安為單位訂購(gòu)。為了進(jìn)入納安范圍,必須將所有GPIO引腳置于模擬模式。根據(jù)參考手冊(cè)第9.3.12節(jié),當(dāng)I / O引腳配置為模擬引腳時(shí),施密特觸發(fā)器輸入被禁用,每個(gè)引腳的功耗為零。但是,這樣做意味著必須將每個(gè)端口的GPIOx_MODER寄存器保存,然后再將每個(gè)引腳切換到模擬模式。這樣,設(shè)備喚醒后,每個(gè)引腳都可以恢復(fù)到其先前的模式。另外,為了避免意外錯(cuò)誤,在保存和恢復(fù)過(guò)程中都應(yīng)禁用中斷。

清單6中的功能建立在清單5中的基本功能的基礎(chǔ)上。不僅將調(diào)節(jié)器置于低功耗模式并且VREFINT已關(guān)閉,而且在進(jìn)入停止模式之前還保存了I / O上下文。由于在執(zhí)行WFI時(shí)即禁用了中斷,即PM位置1,因此外部中斷將喚醒設(shè)備,但不會(huì)輸入其ISR。程序從WFI指令繼續(xù)執(zhí)行,從而允許立即恢復(fù)上下文。重新啟用中斷后,由于中斷仍處于掛起狀態(tài),因此將輸入外部中斷的ISR。

清單6:進(jìn)入停止模式的高級(jí)示例

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均使用來(lái)自PA0引腳的外部中斷來(lái)喚醒設(shè)備。這是因?yàn)橥獠恐袛嗍怯蒃XTI控制的,并且除了系統(tǒng)復(fù)位以外,只有它可以使設(shè)備退出停止模式。簡(jiǎn)而言之,EXTI管理著30條內(nèi)部和外部線路,能夠產(chǎn)生中斷和事件。參考手冊(cè)中的表52指定了每條線路的線路來(lái)源以及它們是可配置線路還是直接線路。在上述示例中,默認(rèn)情況下,EXTI行0映射到PA0,因此不必自行配置行。所有要做的就是使該線路成為中斷源,選擇如何觸發(fā)中斷,并在NVIC中啟用相應(yīng)的中斷。如果使用WFE指令進(jìn)入了停止模式,則該行將在事件模式下啟用。

表3總結(jié)了STM32L053x6 / 8勘誤表中記錄的停止模式的局限性。顯然,無(wú)論使用什么版本的芯片,程序員都應(yīng)該解決一些問(wèn)題,以避免出現(xiàn)意外錯(cuò)誤。清單6中的函數(shù)實(shí)現(xiàn)了針對(duì)未配置I2C外設(shè)以將設(shè)備從停止模式喚醒而導(dǎo)致的問(wèn)題的建議解決方法??闭`表中的2.5.1節(jié)解釋說(shuō),在進(jìn)入停止模式之前禁用I2C外設(shè)并在喚醒后立即重新啟用它可以避免任何錯(cuò)誤。幸運(yùn)的是,該解決方法可以與保存和還原I / O上下文一起完成。

待機(jī)模式(Standby Mode)

與停止模式不同,進(jìn)入待機(jī)模式非常簡(jiǎn)單,因?yàn)橛脩舻倪x項(xiàng)更少。唯一可用的振蕩器是LSI和LSE,唯一可以工作的外設(shè)是RTC和IWDG,電壓調(diào)節(jié)器被完全禁用,并且所有I / O引腳都設(shè)置為高阻抗(因此節(jié)省上下文毫無(wú)意義)。用戶進(jìn)入待機(jī)模式所需要做的全部工作就是將SLEEPDEEP位置1,將PDDS位置1,并確保通過(guò)向CWUF位寫(xiě)入1來(lái)清除WFU位。然后,在異常返回之前執(zhí)行WFI指令,WFE指令或設(shè)置SLEEPONEXIT將導(dǎo)致設(shè)備進(jìn)入此低功耗模式。退出待機(jī)模式的選項(xiàng)也更少。只有喚醒引腳(PA0或PC13)上的上升沿,RTC喚醒事件之一或IWDG復(fù)位才會(huì)喚醒設(shè)備。在進(jìn)入待機(jī)模式之前,必須配置選擇的方法并清除相應(yīng)的喚醒標(biāo)志。請(qǐng)注意,STM32L053C8芯片僅具有兩個(gè)喚醒引腳,而參考手冊(cè)和數(shù)據(jù)表中通常會(huì)提到僅在引腳數(shù)較高的封裝中才可使用的第三個(gè)喚醒引腳。

待機(jī)模式的最大問(wèn)題是它不保留SRAM或寄存器(RTC寄存器,RTC備份寄存器和待機(jī)電路除外)的內(nèi)容。從待機(jī)模式喚醒后,程序執(zhí)行將以與發(fā)生復(fù)位相同的方式重新開(kāi)始。為了確定系統(tǒng)是否從待機(jī)模式中喚醒,只要輸入main()函數(shù),就可以檢查PWR_CSR寄存器中的SBF(待機(jī)標(biāo)志)位。如果該位置1,則該設(shè)備先前處于待機(jī)模式,并且應(yīng)設(shè)置CSBF(清除待機(jī)標(biāo)志)以清除SBF。然后,用戶知道是否應(yīng)該在首次運(yùn)行時(shí)初始化系統(tǒng),或者是否應(yīng)該將系統(tǒng)還原到以前的狀態(tài)。

請(qǐng)注意,表2中的待機(jī)模式具有最長(zhǎng)的喚醒時(shí)間。此估算不包括重新初始化系統(tǒng)和恢復(fù)程序執(zhí)行所需的時(shí)間。這種增加的等待時(shí)間不僅使對(duì)喚醒事件的立即響應(yīng)幾乎不可能,而且會(huì)嚴(yán)重限制待機(jī)模式的節(jié)能功能。為了將平均消耗電流保持在“停止”模式之下,該設(shè)備將必須處于“待機(jī)”模式很長(zhǎng)時(shí)間。時(shí)間長(zhǎng)短取決于喚醒/重新初始化過(guò)程中消耗了多少電流。清單7顯示了一個(gè)示例函數(shù),該函數(shù)可用于進(jìn)入待機(jī)模式,在該模式下,任一喚醒引腳都將喚醒設(shè)備。

清單7:進(jìn)入待機(jī)模式的示例

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

}

結(jié)論

適用于超低功率應(yīng)用,例如燃?xì)?水表、可穿戴設(shè)備或物聯(lián)網(wǎng)傳感器,STM32L系列微控制器具有許多低功耗模式,允許用戶仔細(xì)地在性能與功耗之間取得平衡。尤其是,STM32L0系列利用了最節(jié)能的ARM處理器(Cortex-M0 +),并提供了五種低功耗模式,以適應(yīng)大多數(shù)入門(mén)級(jí)應(yīng)用。

低功耗運(yùn)行模式可產(chǎn)生最佳性能,同時(shí)仍比睡眠模式消耗更少的電流。因?yàn)镃PU一直在運(yùn)行,所以喚醒器件的決定是由軟件決定的,從而在這方面提供了最大的靈活性。不幸的是,使穩(wěn)壓器處于低功耗模式會(huì)導(dǎo)致喚醒延遲,這對(duì)于許多實(shí)時(shí)應(yīng)用而言太大了。這是睡眠模式真正出類(lèi)拔萃的地方,它具有0.36 μs的喚醒時(shí)間,這是因?yàn)樵趦?nèi)核被禁用的情況下允許所有外設(shè)全速運(yùn)行。但是,這也使它成為最耗電的低功耗模式,外圍設(shè)備性能和全套硬件喚醒源對(duì)此幾乎沒(méi)有補(bǔ)償。低功耗睡眠模式使用與低功耗運(yùn)行模式相同的方法,以將電流消耗降低到與停止模式相當(dāng)?shù)乃剑粫?huì)限制喚醒源的數(shù)量。但是,如果足以使EXIT喚醒器件,則停止模式將提供最低的電流消耗,同時(shí)仍保留SRAM和寄存器內(nèi)容。它還具有與低功耗運(yùn)行模式相當(dāng)?shù)膯拘褧r(shí)間。最后,對(duì)于長(zhǎng)時(shí)間不需要MCU的應(yīng)用,待機(jī)模式可能是合適的。它使用最少的功耗,但卻消耗了很少的喚醒源和最長(zhǎng)的喚醒時(shí)間。
編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16667

    瀏覽量

    347828
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5253

    瀏覽量

    119212
  • STM32
    +關(guān)注

    關(guān)注

    2258

    文章

    10828

    瀏覽量

    352505
  • 意法半導(dǎo)體
    +關(guān)注

    關(guān)注

    31

    文章

    3062

    瀏覽量

    108246
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    stm8l152 active halt模式進(jìn)入低功耗時(shí)AD口配成哪個(gè)模式

    請(qǐng)問(wèn)各位,stm8l152 active halt模式,進(jìn)入低功耗時(shí)AD口配成哪個(gè)模式?謝謝各位
    發(fā)表于 04-29 06:27

    STM32L051x8做項(xiàng)目遇到的功耗問(wèn)題求解

    在用STM32L051x8做一個(gè)項(xiàng)目,在功耗方面要求很高。有幾個(gè)問(wèn)題想請(qǐng)教論壇的高手: 1. STM32L0x有6個(gè)低功耗模式,在freeR
    發(fā)表于 04-26 06:53

    stm32L053R8死機(jī)的原因有哪些?如何解決?

    求大神或者ST的技術(shù)支持幫忙解決,或者分析下在下的問(wèn)題,stm32L053R8 偶然的死機(jī)重啟,時(shí)間是不定的,可幾天 可能幾小時(shí),怎么樣才能抓的到該問(wèn)題呢?
    發(fā)表于 04-23 06:56

    STM8l151低功耗模式喚醒方式如何選擇?

    使用STM8L151G4U6系列,需要用GPIO中斷/RTC時(shí)鐘/串口中斷喚醒,期望功耗在uA級(jí)別,請(qǐng)做過(guò)低功耗的人看看可以采用哪種低功耗模式
    發(fā)表于 04-22 06:01

    STM8L051低功耗模式下ADC無(wú)法關(guān)閉怎么解決?

    STM8L低功耗使能AD時(shí)鐘后不能關(guān)閉, 如果在沒(méi)有使能AD時(shí)鐘及外設(shè)時(shí),HALT模式功耗正常; 使能AD后進(jìn)入低功耗
    發(fā)表于 03-27 07:30

    STM32L053R8T6的TSC功能,外部按鍵怎么喚醒stop模式呢?

    STM32L053R8T6的 TSC功能,外部按鍵怎么喚醒 stop模式?哪個(gè)大佬 有TSC相關(guān)開(kāi)發(fā)程序用CUBEMX開(kāi)發(fā) ,但這個(gè)TSC功能怎么打開(kāi)
    發(fā)表于 03-25 06:22

    無(wú)法從低功耗模式中正確喚醒STM32L552怎么辦?

    STM32L552無(wú)法從低功耗模式中正確喚醒
    發(fā)表于 03-20 08:07

    同樣的代碼,stm32l072cbt6改用stm32l053c8t6就出出現(xiàn)了HardFault_Handler的原因?

    我之前使用的是stm32l072cbt6芯片,現(xiàn)在改用stm32l053c8t6,結(jié)果在調(diào)取芯片uid時(shí)出現(xiàn)了同樣的代碼,卻產(chǎn)生了錯(cuò)誤
    發(fā)表于 03-11 08:31

    PY32L020單片機(jī),超低功耗,多種低功耗模式,休眠電流最低0.7uA

    定時(shí)器,以及 2 路比較器。PY32L020 單片機(jī)的工作溫度范圍為-40°C ~ 85°C,工作電壓范圍 1.7V ~ 5.5V。芯片提供sleep/stop/Deep Stop 低功耗
    發(fā)表于 12-20 16:02

    詳解STM32低功耗模式

    本文討論下STM32低功耗模式,先看如下手冊(cè)。
    的頭像 發(fā)表于 11-08 12:18 ?1819次閱讀

    基于RJM8L151S低功耗MCU的傳感器模塊方案

    基于瑞納捷RJM8L151S低功耗MCU的傳感器模塊方案
    的頭像 發(fā)表于 10-27 09:40 ?526次閱讀
    基于RJM<b class='flag-5'>8L</b>151S<b class='flag-5'>低功耗</b><b class='flag-5'>MCU</b>的傳感器模塊方案

    N32L4系列低功耗MCU應(yīng)用案例分享

    水、氣、電、熱 | N32L4系列低功耗MCU應(yīng)用案例分享
    的頭像 發(fā)表于 10-24 15:43 ?481次閱讀
    N32<b class='flag-5'>L</b>4系列<b class='flag-5'>低功耗</b><b class='flag-5'>MCU</b>應(yīng)用案例分享

    STM32速成筆記(13)—低功耗模式

    STM32提供了一些低功耗模式。默認(rèn)情況下,系統(tǒng)復(fù)位或電復(fù)位后,微控制器進(jìn)入運(yùn)行模式。
    的頭像 發(fā)表于 10-24 15:39 ?1679次閱讀
    <b class='flag-5'>STM32</b>速成筆記(13)—<b class='flag-5'>低功耗</b><b class='flag-5'>模式</b>

    STM8L低功耗模式下進(jìn)行大數(shù)據(jù)運(yùn)算會(huì)增加功耗嗎?

    STM8L低功耗模式下進(jìn)行大數(shù)據(jù)運(yùn)算會(huì)增加功耗
    發(fā)表于 10-13 07:23

    STM8L低功耗模式下喚醒源有哪些?

    哪些可以作為STM8L低功耗模式喚醒源
    發(fā)表于 10-13 07:15