日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2025年07月10日(星期四)

正在發(fā)生

2019年07月10日 | STM32MX電源管理低功耗模式

發(fā)布者:腦洞飛揚(yáng) 來源: eefocus關(guān)鍵字:STM32MX  電源管理  低功耗模式 手機(jī)看文章 掃描二維碼
隨時隨地手機(jī)看文章

前言:

ST官方例程:(直接移植直接用,接口是現(xiàn)成的)


在你STM32Cube固件庫安裝路徑下.


...STM32CubeRepositorySTM32Cube_FW_F4_V1.23.0ProjectsSTM32F429I-DiscoveryExamplesPWRPWR_CurrentConsumption



例程和測試程序下載鏈接:https://download.csdn.net/download/sudaroot/10891176


一、STM32電源三種低功耗模式介紹


節(jié)省功耗效果:待機(jī)  > 停止 > 睡眠。

 

 

 

1、睡眠模式


先說一下事件(WFI)和中斷(WFE)的區(qū)別:事件包括中斷事件和非中斷事件,中斷是發(fā)生中斷事件后執(zhí)行對應(yīng)的xxx_IRQHandler()中斷服務(wù)函數(shù)。非中斷事件如GPIO電平變化,外設(shè)使能,初始化等不發(fā)生中斷的事件。


詳細(xì)原理框圖可以看STM32F4XX英文參考手冊的Figure 41. External interrupt/event controller block diagram


 


注意:睡眠模式下,無論設(shè)置事件(WFI)和中斷(WFE),系統(tǒng)時鐘SysTick_Handler()都能將其喚醒。


 

軟件步驟(粗體是必須做的步驟):


1、進(jìn)入睡眠前可以降低或者關(guān)閉外設(shè)的時鐘速度達(dá)到更好的效果(喚醒后要恢復(fù)外設(shè)時鐘)。


2、失能系統(tǒng)時鐘SysTick_Handler()中斷。


3、設(shè)置喚醒方式,進(jìn)入睡眠模式(CPU時鐘關(guān)閉,內(nèi)核停止,對其他時鐘和ADC時鐘無影響,不改變GPIO管腳狀態(tài))。


4、喚醒方式:任意中斷喚醒


5、喚醒延時:無


6、喚醒之后:使能系統(tǒng)時鐘SysTick_Handler()中斷(喚醒后要恢復(fù)外設(shè)時鐘)。


7、程序繼續(xù)運(yùn)行。


 


代碼:


/**

  * @brief  This function configures the system to enter Sleep mode for

  *         current consumption measurement purpose.

  *         Sleep Mode

  *         ==========  

  *            - System Running at PLL

  *            - Flash 5 wait state

  *            - Instruction and Data caches ON

  *            - Prefetch ON   

  *            - Code running from Internal FLASH

  *            - All peripherals disabled.

  *            - Wakeup using EXTI Line (USER Button)

  * @param  None

  * @retval None

  */

void SleepMode_Measure(void)

{

  //關(guān)閉系統(tǒng)時鐘中斷

  HAL_SuspendTick();

  

  /* 進(jìn)入睡眠模式, 任意中斷喚醒 */

  HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);

  

  /* 恢復(fù)系統(tǒng)時鐘中斷 */

  HAL_ResumeTick();

  

  /* Add a delay of 2 second after exit from Sleep mode */

  HAL_Delay(200);

}

 


 


 


 


2、停止模式





 


軟件步驟(粗體是必須做的步驟):


1、進(jìn)入睡眠前可以降低或者關(guān)閉外設(shè)的時鐘速度達(dá)到更好的效果(喚醒后要恢復(fù)外設(shè)時鐘)。


2、芯片內(nèi)部FLASH掉電。


3、設(shè)置喚醒方式:_WFI 或者 _WFE,(RTC鬧鐘中斷也可以喚醒,后面說)


4、關(guān)閉電壓調(diào)節(jié)器(電壓調(diào)節(jié)器是動態(tài)調(diào)節(jié)芯片內(nèi)部電壓,關(guān)閉后更加節(jié)省功耗,但是喚醒時間加長)


5、進(jìn)入停止模式:所有的1.2V時鐘都關(guān)閉(HSI和HSE的振蕩器關(guān)閉,不改變GPIO管腳狀態(tài))。


6、喚醒方式:任意外部中斷 或者 RTC鬧鐘


7、喚醒延時:有,(關(guān)閉電壓調(diào)節(jié)器喚醒時間更長)。


8、喚醒之后:重新初始化時鐘。


9、程序繼續(xù)運(yùn)行。


 


代碼:


extern void SystemClock_Config(void);   //外部鏈接用戶初始化時鐘

 

/**

  * @brief  This function configures the system to enter Stop mode with RTC 

  *         clocked by LSE or LSI  for current consumption measurement purpose.

  *         STOP Mode with RTC clocked by LSE/LSI

  *         =====================================   

  *           - RTC Clocked by LSE or LSI

  *           - Regulator in LP mode

  *           - HSI, HSE OFF and LSI OFF if not used as RTC Clock source

  *           - No IWDG

  *           - FLASH in deep power down mode

  *           - Automatic Wakeup using RTC clocked by LSE/LSI (~20s)

  * @param  None

  * @retval None

  * 

  * @note       

  *             此函數(shù)  沒有關(guān)閉電壓調(diào)節(jié)器  

  *

  */

void StopMode_Measure(void)

{

  RTCHandle.Instance = RTC;

 

  RTCHandle.Init.HourFormat = RTC_HOURFORMAT_24;

  RTCHandle.Init.AsynchPrediv = RTC_ASYNCH_PREDIV;

  RTCHandle.Init.SynchPrediv = RTC_SYNCH_PREDIV;

  RTCHandle.Init.OutPut = RTC_OUTPUT_DISABLE;

  RTCHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;

  RTCHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;

 

  if(HAL_RTC_Init(&RTCHandle) != HAL_OK)

  {

    Error_Handler(); 

  }

 

  /*## 配置RTC喚醒 20s喚醒 ###########################################*/

  HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, 0xA017, RTC_WAKEUPCLOCK_RTCCLK_DIV16);

 

  /* flash進(jìn)入掉電 */

  HAL_PWREx_EnableFlashPowerDown();

 

  /*進(jìn)入停止模式, 外部中斷喚醒或者RTC鬧鐘喚醒 */

  HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);

 

   //重新初始化時鐘

  SystemClock_Config();

  

  /* Disable Wake-up timer */

  if(HAL_RTCEx_DeactivateWakeUpTimer(&RTCHandle) != HAL_OK)

  {

    /* Initialization Error */

    Error_Handler(); 

  }

}

 

/**

  * @brief  This function configures the system to enter in Under-Drive stop mode with RTC 

  *         clocked by LSE or LSI  for current consumption measurement purpose.

  *         STOP Mode with RTC clocked by LSE/LSI

  *         =====================================   

  *           - RTC Clocked by LSE or LSI

  *           - Regulator in LP mode

  *           - Under drive feature enabled

  *           - HSI, HSE OFF and LSI OFF if not used as RTC Clock source

  *           - No IWDG

  *           - FLASH in deep power down mode

  *           - Automatic Wakeup using RTC clocked by LSE/LSI (~20s)

  * @param  None

  * @retval None

  *

  * @note       

  *             此函數(shù)  關(guān)閉電壓調(diào)節(jié)器  ,喚醒需要的時間更長,但是功耗理論更小

  *

  */

void StopUnderDriveMode_Measure(void)

{

  RTCHandle.Instance = RTC;

 

  /* Configure RTC prescaler and RTC data registers as follow:

      - Hour Format = Format 24

      - Asynch Prediv = Value according to source clock

      - Synch Prediv = Value according to source clock

      - OutPut = Output Disable

      - OutPutPolarity = High Polarity

      - OutPutType = Open Drain */ 

  RTCHandle.Init.HourFormat = RTC_HOURFORMAT_24;

  RTCHandle.Init.AsynchPrediv = RTC_ASYNCH_PREDIV;

  RTCHandle.Init.SynchPrediv = RTC_SYNCH_PREDIV;

  RTCHandle.Init.OutPut = RTC_OUTPUT_DISABLE;

  RTCHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;

  RTCHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;

 

  if(HAL_RTC_Init(&RTCHandle) != HAL_OK)

  {

    /* Initialization Error */

    Error_Handler(); 

  }

 

  /*## Configure the Wake up timer ###########################################*/

  /*  RTC Wakeup Interrupt Generation:

      Wakeup Time Base = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSI))

      Wakeup Time = Wakeup Time Base * WakeUpCounter 

                  = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSI)) * WakeUpCounter

      ==> WakeUpCounter = Wakeup Time / Wakeup Time Base

      To configure the wake up timer to 20s the WakeUpCounter is set to 0xA017:

        RTC_WAKEUPCLOCK_RTCCLK_DIV = RTCCLK_Div16 = 16 

        Wakeup Time Base = 16 /(~32.768KHz) = ~0,488 ms

        Wakeup Time = ~20s = 0,488ms  * WakeUpCounter

        ==> WakeUpCounter = ~20s/0,488ms = 40983 = 0xA017 */

  HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, 0xA017, RTC_WAKEUPCLOCK_RTCCLK_DIV16);

 

  /* FLASH Deep Power Down Mode enabled */

  HAL_PWREx_EnableFlashPowerDown();

 

  /* Enter under-drive Stop Mode */

  HAL_PWREx_EnterUnderDriveSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);

 

  /* Configures system clock after wake-up from STOP: enable HSE, PLL and select 

     PLL as system clock source (HSE and PLL are disabled in STOP mode) */

//  SYSCLKConfig_STOP();

  SystemClock_Config();

  

  /* Disable Wake-up timer */

  if(HAL_RTCEx_DeactivateWakeUpTimer(&RTCHandle) != HAL_OK)

  {

    /* Initialization Error */

    Error_Handler(); 

  }

}

 


3、待機(jī)模式


軟件步驟(粗體是必須做的步驟):


1、是否允許訪問備份區(qū)


2、是否備份區(qū)使用RTC(用于喚醒)


3、設(shè)置喚醒方式:WKUP 引腳上升沿、 RTC 鬧鐘(鬧鐘 A 和鬧鐘 B)、 RTC 喚醒事件、 RTC入侵事件、 RTC 時間戳事件、 NRST 引腳外部復(fù)位 和 IWDG 復(fù)位。


4、進(jìn)入待機(jī)模式:關(guān)閉1.2V所有時鐘,HSI和HSE的振蕩器關(guān)閉,電壓調(diào)節(jié)器關(guān)閉。


5、喚醒延時:有


6、喚醒之后:復(fù)位程序(和按下復(fù)位鍵效果一致)


 


代碼:


/**

  * @brief  This function configures the system to enter Standby mode for

  *         current consumption measurement purpose.

  *         STANDBY Mode

  *         ============

  *           - Backup SRAM and RTC OFF

  *           - IWDG and LSI OFF

  *           - Wakeup using WakeUp Pin (PA.00)

  * @param  None

  * @retval None

  */

void StandbyMode_Measure(void)

{

  /* Enable Power Clock*/

  __HAL_RCC_PWR_CLK_ENABLE();

  

  /* Allow access to Backup */

  HAL_PWR_EnableBkUpAccess();

 

  /* Reset RTC Domain */

  __HAL_RCC_BACKUPRESET_FORCE();

  __HAL_RCC_BACKUPRESET_RELEASE();

  

  /* Disable all used wakeup sources: Pin1(PA.0) */

  HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);

  

  /* Clear all related wakeup flags */

  __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);

  

  /* Re-enable all used wakeup sources: Pin1(PA.0) */

  HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);

 

  /* Request to enter STANDBY mode  */

  HAL_PWR_EnterSTANDBYMode();

}

 

/**

  * @brief  This function configures the system to enter Standby mode with RTC 

  *         clocked by LSE or LSI for current consumption measurement purpose.

[1] [2]
關(guān)鍵字:STM32MX  電源管理  低功耗模式 引用地址:STM32MX電源管理低功耗模式

上一篇:STM32低功耗時引腳配置
下一篇:STM32開發(fā)筆記46:STM32F0低功耗設(shè)計

推薦閱讀

中國機(jī)器人產(chǎn)業(yè)聯(lián)盟近日發(fā)布數(shù)據(jù)顯示,2017年國產(chǎn)品牌工業(yè)機(jī)器人市場份額下降6個百分點(diǎn),降至不足27%,從而結(jié)束過去五年占有率的持續(xù)增長。 數(shù)據(jù)背后隱藏著讓人更擔(dān)憂的產(chǎn)業(yè)現(xiàn)狀。為什么過去五六年國產(chǎn)品牌市場持續(xù)增長?一方面是國外品牌機(jī)器人熱銷賣斷貨,用戶退而求其次,選擇國內(nèi)品牌替代;另一方面和國產(chǎn)品牌機(jī)器人采取的銷售模式有一定關(guān)系,即廠家...
今天回答一位讀者問的關(guān)于STM32低功耗問題。1寫在前面有低功耗產(chǎn)品設(shè)計經(jīng)驗(yàn)的朋友都應(yīng)該知道,一個產(chǎn)品的功耗不光是硬件功耗的事,其實(shí)軟件也是影響整個產(chǎn)品功耗的一個關(guān)鍵因素。我之前也開發(fā)過幾款使用電池供電的產(chǎn)品,調(diào)試起來,那叫一個痛苦,軟件和硬件各種因素都要考慮。當(dāng)你確信軟件沒問題了,可能硬件某個地方又存在漏電流,這其中的“痛苦”我也...
據(jù)Electrek報道,特斯拉已經(jīng)為一款新型的無陽極鋰金屬電池(anode-free lithium-metal cell)申請專利。據(jù)悉,特斯拉在專利報告中指出,與傳統(tǒng)的鋰離子電池相比,無陽極鋰金屬電池具有一定的優(yōu)勢,因?yàn)樗鼈兊哪芰棵芏雀?。由于沒有陽極涂層,無陽極電池也更便宜,更容易組裝。但這種電池在壽命方面需要改進(jìn)。原標(biāo)題:特斯拉為新型無陽極鋰金屬電池申請...

史海拾趣

小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章
更多每日新聞

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved