一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

STM32L053C8 MCU上的低功耗模式詳解

電子設(shè)計(jì) ? 來源:一板網(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系列的好入門。圖1摘自ST的宣傳冊(cè)之一,簡要總結(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ì)說明如何進(jìn)入和退出它們,而數(shù)據(jù)手冊(cè)將專門定義外圍設(shè)備的可用性、可能的喚醒源和電流消耗估算。

背景介紹

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

圖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)參見前述Cortex-M0 +手冊(cè)中的“嵌套向量中斷控制器”部分。 SLEEPONEXIT位提供了一個(gè)選項(xiàng),可以在異?;謴?fù)后使處理器繼續(xù)執(zhí)行程序之前將處理器置于低功耗模式。對(duì)于僅需要喚醒服務(wù)中斷的應(yīng)用程序來說,這是理想的選擇。最后,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指令非常相似,但具有更大的靈活性。不僅可以通過擴(kuò)展中斷和事件控制器(EXTI)中配置的事件喚醒設(shè)備,還可以通過NVIC中禁用的中斷(只要它們?cè)谙鄳?yīng)的外設(shè)控制寄存器中啟用)喚醒。已經(jīng)提到了進(jìn)入低功耗模式的第三種方法。通過將SCR中的SLEEPONEXIT位置1,異常返回將使設(shè)備進(jìn)入低功耗模式,就像執(zhí)行WFI指令一樣。請(qǐng)注意,在所有這些情況下,僅當(dāng)沒有中斷或事件掛起時(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ì)說明停止模式的部分中將提供一個(gè)示例。

為了使程序員在開發(fā)C應(yīng)用程序時(shí)輕松訪問WFI和WFE指令,CMSIS-CORE標(biāo)準(zhǔn)提供了__WFI()和__WFE()函數(shù)。以下各節(jié)中的所有示例函數(shù)都使用__WFI()執(zhí)行WFI指令并進(jìn)入低功耗模式。另外,CMSIS不會(huì)直接提供對(duì)PRIMASK寄存器的訪問,而是實(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)目變得非常簡單。例如,在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í)間和喚醒源來描述。如果對(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)

將其作為低功耗模式推銷是相當(dāng)誘人的,因?yàn)樗?jié)省能耗的主要方法是要求較低的系統(tǒng)時(shí)鐘頻率。將任何微控制器的時(shí)鐘速度降低到千赫茲范圍將極大地降低電流消耗,使其與普通睡眠模式相比更具競爭力。但是,通常不這樣做的原因是,從長遠(yuǎn)來看,性能的降低以及靜態(tài)電流消耗(不取決于時(shí)鐘頻率)會(huì)消耗更多的能量。取決于應(yīng)用,即正在使用哪種睡眠模式或設(shè)備喚醒的頻率,在較短的時(shí)間段內(nèi)消耗更多的電流而不是在較長的時(shí)間段內(nèi)消耗較少的電流可能更有效。 ST之所以可以將其分類為低功耗模式,是因?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)電壓縮放功能,否則無需擔(dān)心此先決條件。第二個(gè)條件是系統(tǒng)頻率不超過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)行模式下停止。這意味著它不是通過前面討論的WFI / WFE指令輸入的,而是通過設(shè)置PWR_CR寄存器中的LPSDSR(低功耗睡眠-深度/睡眠/低功耗運(yùn)行)和LPRUN(低功耗運(yùn)行)位來輸入的。 。請(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è)過程。清單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)

睡眠模式是低功耗模式中最簡單的一種,它以最省電的方式提供最短的喚醒時(shí)間。數(shù)據(jù)手冊(cè)指出,在禁用所有外設(shè)且系統(tǒng)頻率為16 MHz的情況下,將消耗約1 mA的電流。這遠(yuǎn)高于其他低功耗模式,后者可以實(shí)現(xiàn)微安或什至納安的數(shù)量級(jí)。但是,喚醒時(shí)間幾乎是最具競爭力的低功耗模式的十倍。表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ā)生的任何情況下都可以使用睡眠模式。用戶無需進(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è)低功耗模式的程序,所以第一條語句可確保清除SLEEPDEEP位,以避免意外行為。同樣,為了避免喚醒延遲,閃存訪問控制寄存器配置為在設(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)行模式相同的條件?;叵胍幌拢琕CORE必須在范圍2(默認(rèn)配置)中,并且系統(tǒng)時(shí)鐘頻率必須降低到不超過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è)的“睡眠模式”部分中沒有提及此選項(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)

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

在停止模式下,內(nèi)核被停止,并且只有有限容量的LSE,LSI和HSI能夠運(yùn)行的振蕩器。低速時(shí)鐘允許RTC和IWDG繼續(xù)運(yùn)行并喚醒設(shè)備。 HSI可以為能夠在停止模式下運(yùn)行的外圍設(shè)備提供有限的功能。例如,通過在需要時(shí)喚醒HSI,USART和I2C仍能夠在停止模式下接收數(shù)據(jù)。 HSI將僅提供請(qǐng)求它的外圍設(shè)備,并且在不再需要它時(shí)將自動(dòng)被禁用。有關(guān)在停止模式下可用的所有外設(shè)的完整列表以及可用的喚醒源,請(qǐng)參見數(shù)據(jù)表中的表4。請(qǐng)注意,由于核心時(shí)鐘已停止,因此一旦進(jìn)入停止模式,調(diào)試連接將無法維持。但是,根據(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)志)位。不幸的是,該位不能由軟件修改,必須通過向PWR_CR寄存器的CWUF(清除喚醒標(biāo)志)位寫入1來清除。這將在2個(gè)系統(tǒng)時(shí)鐘周期后清除WUF。一旦滿足這些條件,用戶只需執(zhí)行WFI指令,WFE指令或?qū)LEEPONEXIT位置1,然后等待異常返回。請(qǐng)注意,默認(rèn)情況下,從停止模式喚醒時(shí),設(shè)備會(huì)選擇MSI振蕩器作為系統(tǒng)時(shí)鐘。通過在進(jìn)入停止模式之前將RCC_CFGR寄存器中的STOPWUCK(停止喚醒時(shí)鐘)位設(shè)置為1,將選擇HSI16振蕩器作為系統(tǒng)時(shí)鐘。清單5顯示了一個(gè)示例函數(shù),它將使用此最低限度的配置進(jìn)入Stop模式。它還顯示了如何啟用能夠喚醒設(shè)備的外部中斷。

清單5:進(jì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)行其他配置。最簡單的方法是通過將PWR_CR寄存器中的LPSDSR位置1使穩(wěn)壓器進(jìn)入低功耗模式。在同一寄存器中,如果任何模擬外設(shè)都沒有使用VREFINT(內(nèi)部參考電壓),也可以將ULP(超低功耗模式)位置1以將其禁用。此外,如果喚醒后不需要立即使用VREFINT,將FWU(快速喚醒)位置1不會(huì)增加設(shè)置ULP可能引起的額外喚醒延遲。

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

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

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

與停止模式不同,進(jìn)入待機(jī)模式非常簡單,因?yàn)橛脩舻倪x項(xiàng)更少。唯一可用的振蕩器是LSI和LSE,唯一可以工作的外設(shè)是RTC和IWDG,電壓調(diào)節(jié)器被完全禁用,并且所有I / O引腳都設(shè)置為高阻抗(因此節(jié)省上下文毫無意義)。用戶進(jìn)入待機(jī)模式所需要做的全部工作就是將SLEEPDEEP位置1,將PDDS位置1,并確保通過向CWUF位寫入1來清除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ī)模式的最大問題是它不保留SRAM或寄存器(RTC寄存器,RTC備份寄存器和待機(jī)電路除外)的內(nèi)容。從待機(jī)模式喚醒后,程序執(zhí)行將以與發(fā)生復(fù)位相同的方式重新開始。為了確定系統(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ī)模式具有最長的喚醒時(shí)間。此估算不包括重新初始化系統(tǒng)和恢復(fù)程序執(zhí)行所需的時(shí)間。這種增加的等待時(shí)間不僅使對(duì)喚醒事件的立即響應(yīng)幾乎不可能,而且會(huì)嚴(yán)重限制待機(jī)模式的節(jié)能功能。為了將平均消耗電流保持在“停止”模式之下,該設(shè)備將必須處于“待機(jī)”模式很長時(shí)間。時(shí)間長短取決于喚醒/重新初始化過程中消耗了多少電流。清單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ù)入門級(jí)應(yīng)用。

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

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

    關(guān)注

    146

    文章

    17984

    瀏覽量

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

    關(guān)注

    31

    文章

    5434

    瀏覽量

    124512
  • STM32
    +關(guān)注

    關(guān)注

    2293

    文章

    11032

    瀏覽量

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

    關(guān)注

    31

    文章

    3261

    瀏覽量

    109993
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    【RA4L1-SENSOR】07 低功耗待機(jī)模式功耗實(shí)測

    從控制功耗入手, 提高設(shè)備的續(xù)行時(shí)間。 因此,RA芯片有專門管理設(shè)備的運(yùn)行模式,確保系統(tǒng)正常運(yùn)行,并盡量降低器件的功耗。 RA2L1支持3種低功耗
    發(fā)表于 06-20 09:36

    HOLTEK發(fā)布HT32L62141超低功耗MCU

    Holtek新推出集成感煙探測AFE、雙通道LED驅(qū)動(dòng)及9 V蜂鳴器驅(qū)動(dòng)的32-bit Arm Cortex-M0+ MCU HT32L62141,采用超低功耗ULP (Ultra-Low Power) 設(shè)計(jì),并提供多種省電
    的頭像 發(fā)表于 06-18 16:52 ?618次閱讀

    瑞薩全新RA2L2 MCU 搭載48MHz ArmCortex-M23內(nèi)核 超低功耗、支持CAN及USB-C

    ? ? ? ? ? ? RA家族推出全新 RA2L2 MCU低功耗,支持CAN及USB-C,拓展工業(yè)及便攜式應(yīng)用。 ? RA2L2系列是
    的頭像 發(fā)表于 06-11 15:22 ?671次閱讀
    瑞薩全新RA2<b class='flag-5'>L</b>2 <b class='flag-5'>MCU</b> 搭載48MHz ArmCortex-M23內(nèi)核 超<b class='flag-5'>低功耗</b>、支持CAN及USB-<b class='flag-5'>C</b>

    AG32 MCU 如何進(jìn)入低功耗模式

    AG32 MCU 如何進(jìn)入低功耗模式 AG32系列32位微控制器旨在為MCU用戶提供新的自由度和豐富的兼容外設(shè),以及兼容的引腳和功能。AG32系列產(chǎn)品提供卓越的品質(zhì),穩(wěn)定性
    發(fā)表于 04-21 11:29

    新品上市 | 瑞薩RA4L1低功耗MCU--USB,CANFD,段碼LCD,適用低功耗電池應(yīng)用

    瑞薩RA家族RA4L1低功耗MCU產(chǎn)品系列于2025年2月推出。RA4L1 MCU產(chǎn)品,基于Arm??Cortex?-M33(CM33)內(nèi)核
    的頭像 發(fā)表于 02-27 12:11 ?922次閱讀
    新品上市 | 瑞薩RA4<b class='flag-5'>L</b>1<b class='flag-5'>低功耗</b><b class='flag-5'>MCU</b>--USB,CANFD,段碼LCD,適用<b class='flag-5'>低功耗</b>電池應(yīng)用

    瑞薩RA家族RA4L1低功耗MCU量產(chǎn)上市

    ? 瑞薩RA家族RA4L1低功耗MCU產(chǎn)品系列于2025年2月推出。RA4L1 MCU產(chǎn)品,基于Arm?Cortex-M33(CM33)內(nèi)核
    的頭像 發(fā)表于 02-20 13:39 ?810次閱讀
    瑞薩RA家族RA4<b class='flag-5'>L</b>1<b class='flag-5'>低功耗</b><b class='flag-5'>MCU</b>量產(chǎn)上市

    恩智浦MCX L系列MCU低功耗設(shè)計(jì)

    在2024年MCX產(chǎn)品組合成功的基礎(chǔ),恩智浦發(fā)布MCX L系列超低功耗MCU。MCX L系列采用了許多與當(dāng)前MCX產(chǎn)品組合相同的外設(shè),其獨(dú)
    的頭像 發(fā)表于 02-14 11:19 ?1806次閱讀
    恩智浦MCX <b class='flag-5'>L</b>系列<b class='flag-5'>MCU</b>的<b class='flag-5'>低功耗</b>設(shè)計(jì)

    笙泉科技超低功耗、高性價(jià)比MCU(M0+ : MG32L00)

    笙泉科技超低功耗、高性價(jià)比MCU(M0+ : MG32L00) 超低功耗M0+ (MG32L003系列) MG32
    發(fā)表于 01-20 10:51

    STM32L151VCT6 STM32L083RZT6 IC MCU 32BIT 32位微控制器 LQFP

    STM32L151VCT6 微控制器采用Cortex-M3內(nèi)核和頻率32 MHz的CPU時(shí)鐘,擴(kuò)展了超低功耗的理念,并且不會(huì)降低性能。除了動(dòng)態(tài)運(yùn)行和低功耗運(yùn)行模式以外,該系列器件還提供
    發(fā)表于 01-04 16:17

    HOLTEK發(fā)布新一代32位超低功耗MCU

    Holtek(合泰)近期正式推出了其全新一代的32位Arm? Cortex?-M0+超低功耗(ULP,Ultra Low Power)MCU系列——HT32L52231與HT32L52
    的頭像 發(fā)表于 12-24 14:55 ?908次閱讀

    三款低功耗MCU,實(shí)現(xiàn)應(yīng)用產(chǎn)品的耐久續(xù)航力

    …)等。 業(yè)內(nèi)優(yōu)秀的靜態(tài)功耗 笙泉科技針對(duì)上述應(yīng)用市場需求,已陸續(xù)推出低功耗MCU,包含32位 MG32L003 / MG32F02V032、8
    發(fā)表于 12-13 10:44

    HOLTEK新推出HT32L52231/41 32-bit超低功耗MCU

    Holtek隆重推出全新一代32-Bit Arm Cortex-M0+超低功耗ULP (Ultra Low Power) MCU 系列為-HT32L52231/HT32L52241。此
    的頭像 發(fā)表于 12-11 10:48 ?871次閱讀

    stm32低功耗設(shè)計(jì)技巧

    多個(gè)系列和型號(hào)可供選擇,其中一些專門設(shè)計(jì)用于低功耗應(yīng)用。 例如,STM32L系列芯片采用超低泄漏工藝,具有領(lǐng)先的處理性能和代碼密度,以及多個(gè)動(dòng)態(tài)可選電壓范圍,可在能耗提供顯著增益。 優(yōu)化電源管理 : 使用多個(gè)獨(dú)立的電源接口(如
    的頭像 發(fā)表于 11-19 15:52 ?1631次閱讀

    使用MSP430 MCU通過I2C實(shí)現(xiàn)低功耗Windows 8 HID應(yīng)用

    電子發(fā)燒友網(wǎng)站提供《使用MSP430 MCU通過I2C實(shí)現(xiàn)低功耗Windows 8 HID應(yīng)用.pdf》資料免費(fèi)下載
    發(fā)表于 10-17 09:19 ?0次下載
    使用MSP430 <b class='flag-5'>MCU</b>通過I2<b class='flag-5'>C</b>實(shí)現(xiàn)<b class='flag-5'>低功耗</b>Windows <b class='flag-5'>8</b> HID應(yīng)用

    CW32L010安全低功耗MCU,樹立M0+產(chǎn)品行業(yè)新標(biāo)桿!

    PWM 定時(shí)器。 CW32L010 可以在 -40℃到 85℃的溫度范圍內(nèi)工作,供電電壓寬達(dá) 1.62V ~ 5.5V。支持 Sleep 和 DeepSleep兩種低功耗工作模式CW32L
    發(fā)表于 10-09 10:08