FreeRTOS — 低功耗之睡眠模式,停機模式,待機模式


以下內容轉載自安富萊電子:http://forum.armfly.com/forum.php

低功耗是 MCU 的一項重要的指標,比如某些可穿戴的設備,其攜帶的電量有限,如果整個電路消耗的電量特別大的話,就會經常出現電量不足的情況,影響用戶體驗。 

STM32F103 睡眠模式介紹

說明:在 FreeRTOS 系統上面實現睡眠方式僅需了解這里講解的知識基本就夠用了,更多睡眠方式的知識請看 STM32F103 參考手冊和 Cortex-M3 權威指南。

在系統或電源復位以后,微控制器處於運行狀態。當 CPU 不需繼續運行時,可以利用多種低功耗模式來節省功耗,例如等待某個外部事件時,用戶需要根據最低電源消耗、最快速啟動時間和可用的喚醒源等條件,選定一個最佳的低功耗模式。
STM32F103 有三種低功耗模式:
 睡眠模式(Cortex™-M3 內核停止,所有外設包括 Cortex-M3 核心的外設,如 NVIC、系統滴答定時器 Systick 等仍在運行)
 停機模式(所有的時鍾都已停止)。
 待機模式(1.8V 電源關閉)。 
如何進入睡眠模式
通過執行 WFI(等待中斷)或 WFE(等待事件)指令進入睡眠狀態。根據 Cortex™-M3 系統控制寄存器中的 SLEEPONEXIT 位的值,可以通過兩種方案選擇睡眠模式進入機制:
 SLEEP-NOW:如果 SLEEPONEXIT 位被清除,當 WFI 或 WFE 被執行時,微控制器立即進入睡眠模式。
 SLEEP-ON-EXIT:如果 SLEEPONEXIT 位被置位,系統從最低優先級的中斷處理程序中退出時,微控制器就立即進入睡眠模式。
實際應用中我們采用 WFI 指令進入睡眠模式,睡眠模式的進入機制是采用的 SLEEP-NOW。 因為系統復位上電后 SLEEPONEXIT 位是被清除的,所以這個位也不需要專門的去設置。 另外在睡眠模式下,所
有的 I/O 引腳都保持它們在運行模式時的狀態。
在 FreeRTOS 系統上,不使用 tickless 低功耗模式的話,我們可以將 WFI 指令放到空閑任務里面實現。 不過,既然有了 tickless 模式,基本就不需要采用這種方法了。 
如何退出睡眠模式
由於我們是采用指令 WFI 進入睡眠模式,那么任意一個被嵌套向量中斷控制器 NVIC 響應的外設中斷都能將系統從睡眠模式喚醒。並且該模式喚醒所需的時間最短,因為沒有時間損失在中斷的進入或退出上。
在 FreeRTOS 系統上,主要是周期性執行的系統滴答定時器中斷會將系統從睡眠態喚醒,當然,其它的任意中斷也可以將其從睡眠態喚醒。 

STM32F4xx 睡眠模式介紹

說明:本小節的內容含 STM32F407 和 STM32F429,在 FreeRTOS 系統上面實現睡眠方式僅需了解這里講解的知識基本就夠用了,更多睡眠方式的知識請看 STM32F4xx 參考手冊和 Cortex-M4 權威指南。

默認情況下,系統復位或上電復位后,微控制器進入運行模式。在運行模式下,CPU 通過 HCLK 提供時鍾,並執行程序代碼。系統提供了多個低功耗模式,可在 CPU 不需要運行時(例如等待外部事件時)
節省功耗。由用戶根據應用選擇具體的低功耗模式,以在低功耗、短啟動時間和可用喚醒源之間尋求最佳平衡。

STM32F4xx 有三個低功耗模式:
 睡眠模式(Cortex™-M4F 內核停止,外設保持運行)
 停機模式(所有時鍾都停止)
 待機模式(1.2 V 域斷電) 

如何進入睡眠模式

執行 WFI(等待中斷)或 WFE(等待事件)指令即可進入睡眠模式。根據 Cortex™-M4F 系統控制寄存器中 SLEEPONEXIT 位的設置,可以通過兩種方案選擇睡眠模式進入機制:

 立即睡眠:如果 SLEEPONEXIT 位清零, MCU 將在執行 WFI 或 WFE 指令時立即進入睡眠模式
 退出時睡眠:如果 SLEEPONEXIT 位置 1,MCU 將在退出優先級最低的 ISR 時立即進入睡眠模式。 

實際應用中我們采用 WFI 指令進入睡眠模式,睡眠模式的進入機制是采用的立即睡眠。 因為系統復位上電后 SLEEPONEXIT 位是被清除的,所以這個位也不需要專門的去設置。 另外在睡眠模式下,所有的 I/O引腳都保持它們在運行模式時的狀態。
在 FreeRTOS 系統上,不使用 tickless 低功耗模式的話,我們可以將 WFI 指令放到空閑任務里面實現。 不過,既然有了 tickless 模式,基本就不需要采用這種方法了。 

如何退出睡眠模式

由於我們是采用指令 WFI 進入睡眠模式,那么任意一個被嵌套向量中斷控制器 NVIC 響應的外設中斷都能將系統從睡眠模式喚醒。並且該模式喚醒所需的時間最短,因為沒有時間損失在中斷的進入或退出上。
在 FreeRTOS 系統上,主要是周期性執行的系統滴答定時器中斷會將系統從睡眠態喚醒,當然,其它的任意中斷也可以將其從睡眠態喚醒。 

低功耗模式的調試支持

要進入低功耗模式需要調用指令 WFI 或 WFE。
STM32 支持多個低功耗模式,這些模式可以禁止 CPU 時鍾或降低 CPU 功耗。 內核不允許在調試期間關閉 FCLK 或 HCLK,因為調試期間需要使用它們進行調試連接,因此必須保持激活狀態。 STM32 集
成了特殊方法,允許用戶在低功耗模式下調試軟件。 為實現這一功能,調試器必須先設置一些配置寄存器來改變低功耗模式的特性。

 在睡眠模式下,調試器必須先置位 DBGMCU_CR 寄存器的 DBG_SLEEP 位。這將為 HCLK 提供與FCLK(由代碼配置的系統時鍾)相同的時鍾。

  調用庫函數:DBGMCU_Config(DBGMCU_SLEEP, ENABLE);即可

 在停機模式下,調試器必須先置位 DBG_STOP 位。這將激活內部 RC 振盪器,在停止模式下為 FCLK和 HCLK 提供時鍾。

  調用庫函數:DBGMCU_Config(DBGMCU_STOP, ENABLE);即可 

如何有效降低睡眠模式下的功耗

設計低功耗主要從以下幾方面着手:
 關閉可以關閉的外設時鍾。
 降低系統主頻。
 注意 I/O 的狀態,因為睡眠模式下,所有的 I/O 引腳都保持它們在運行模式時的狀態。
 如果此 I/O 口帶上拉,請設置為高電平輸出或者高阻態輸入。
 如果此 I/O 口帶下拉,請設置為低電平輸出或者高阻態輸入。 
 注意 I/O 和外設 IC 的連接。
 測試低功耗的時候,一定不要連接調試器,更不能邊調試邊測電流。 

 

 FreeRTOS — 低功耗之停機模式

STM32F103 如何進入停機模式

 

在 FreeRTOS 系統中,讓 STM32 進入停機模式比較容易,調用固件庫函數 PWR_EnterSTOPMode即可,不過要注意:為了進入停機模式,所有的外部中斷的請求位(掛起寄存器(EXTI_PR))和 RTC 的鬧鍾
標志都必須被清除,否則停止模式的進入流程將會被跳過,程序繼續運行。

 

STM32F103 如何退出停機模式

 

由於我們是采用指令 WFI 指令進入停機模式,那么設置任一外部中斷線 EXTI 為中斷模式並且在 NVIC中必須使能相應的外部中斷向量,就可以使用此中斷喚醒停機模式。
在開發板上面是將實體按鍵 K2 對應的引腳設置為中斷方式觸發。按下此按鍵會將系統從停機模式喚醒。

 

STM32F103 使用停機模式注意事項

 

 

使用停機模式注意以下兩個問題:
 進入停機模式前,一定要關閉滴答定時器,實際測試發現滴答定時器中斷也能喚醒停機模式。
 當一個中斷或喚醒事件導致退出停機模式時,HSI RC 振盪器被選為系統時鍾。 這個時候用戶要根據需要重新配置時鍾,如果使用的 HSE 時鍾,那么要重新配置並使能 HSE 和 PLL。

 

STM32F4xx 如何進入停機模式

 

在 FreeRTOS 系統中,讓 STM32 進入停機模式比較容易,調用固件庫函數 PWR_EnterSTOPMode即可,不過要注意:為了進入停機模式,所有 EXTI 線掛起位(在掛起寄存器 (EXTI_PR)中)、 RTC 鬧鍾(鬧鍾 A 和鬧鍾 B)、 RTC 喚醒、 RTC 入侵和 RTC 時間戳標志必須復位,否則停機模式的進入流程將會被跳過,程序繼續運行。

 

STM32F4xx 如何退出停機模式

 

由於我們是采用指令 WFI 指令進入停機模式,那么設置任一外部中斷線 EXTI 為中斷模式並且在 NVIC中必須使能相應的外部中斷向量,就可以使用此中斷喚醒停機模式。
在開發板上面是將實體按鍵 K2 對應的引腳設置為中斷方式觸發,按下此按鍵會將系統從停機模式喚醒。

 

STM32F4xx 使用停機模式注意事項

 

使用停機模式注意以下兩個問題:
 進入停機模式前,一定要關閉滴答定時器,實際測試發現滴答定時器中斷也能喚醒停機模式。
 當一個中斷或喚醒事件導致退出停機模式時,HSI RC 振盪器被選為系統時鍾。 這個時候用戶要根據需要重新配置時鍾,如果使用的 HSE 時鍾,那么要重新配置並使能 HSE 和 PLL。

 

如何有效降低停機模式下的功耗

 

設計低功耗主要從以下幾方面着手:
 注意 I/O 的狀態。 因為在停機狀態下,所有的 I/O 引腳都保持它們在運行模式時的狀態。
 如果此 I/O 口帶上拉,請設置為高電平輸出或者高阻態輸入。
 如果此 I/O 口帶下拉,請設置為低電平輸出或者高阻態輸入。
 注意 I/O 和外設 IC 的連接。
 測試低功耗的時候,一定不要連接調試器,更不能邊調試邊測電流。 

 

F429關於低功耗的停機模式說明:

 

(1) 停機模式是在 Cortex-M4F 的深睡眠模式基礎上結合了外設的時鍾控制機制,在停機模式下電壓調節器可運行在正常或低功耗模式。此時在 1.2V 供電區域的的所有時鍾都被停止,PLL、HSI 和 HSE 的 RC 振盪器的功能被禁止,SRAM 和寄存器內容被保留下來。
(2) 在停機模式下,所有的 I/O 引腳都保持它們在運行模式時的狀態。
(3) 一定要關閉滴答定時器,實際測試發現滴答定時器中斷也能喚醒停機模式。
(4) 當一個中斷或喚醒事件導致退出停機模式時, HSI RC 振盪器被選為系統時鍾。
(5) 退出低功耗的停機模式后,需要重新配置使用 HSE。 

 

FreeRTOS — 低功耗之待機模式

待機模式可實現系統的最低功耗。該模式是在 Cortex-M3 深睡眠模式時關閉電壓調節器。整個 1.8V 供電區域被斷電。PLL、HSI 和 HSE 振盪器也被斷電。SRAM 和寄存器內容丟失,只有備份的寄存器和待機電路維持供電。

 

STM32F103 如何進入待機模式

在 FreeRTOS 系統中,讓 STM32 進入待機模式比較容易,調用固件庫函數PWR_EnterSTANDBYMode 即可。

STM32F103 如何退出待機模式

讓 STM32 從待機模式喚醒可以通過外部復位(NRST 引腳)、IWDG 復位、WKUP 引腳上的上升沿或RTC 鬧鍾事件的上升沿。從待機喚醒后,除了電源控制/狀寄存器,所有寄存器被復位。
從待機模式喚醒后的代碼執行等同於復位后的執行。電源控制/狀態寄存器(PWR_CSR)將會指示內核由待機狀態退出。

在開發板上面是通過 K2 按鍵來喚醒,K2 按鍵使用的引腳就是 WKUP 引腳。

STM32F103 使用待機模式注意事項

待機模式要注意以下問題:
 在待機模式下,所有的 I/O 引腳處於高阻態,除了以下的引腳:
 復位引腳(始終有效)。
 當被設置為防侵入或校准輸出時的 TAMPER 引腳。
 被使能的喚醒引腳。

STM32F4xx待機模式介紹

待機模式下可達到最低功耗。待機模式基於 Cortex™-M4F 深度睡眠模式,其中調壓器被禁止,因此 1.2 V 域斷電。PLL、HSI 振盪器和 HSE 振盪器也將關閉。除備份域 RTC寄存器、RTC 備份寄存器和備份 SRAM 和待機電路中的寄存器外,SRAM 和寄存器內容都將丟失。

 STM32F4xx 如何進入待機模式

在 FreeRTOS 系統中,讓 STM32 進入待機模式比較容易,調用固件庫函數PWR_EnterSTANDBYMode 即可。

STM32F4xx 如何退出待機模式

讓 STM32 從待機模式喚醒可以通過外 WKUP 引腳上升沿、RTC 鬧鍾(鬧鍾 A 和鬧鍾 B)、RTC 喚醒事件、RTC 入侵事件、RTC 時間戳事件、NRST 引腳外部復位和 IWDG 復位,喚醒后除了電源控制/狀寄存器,所有寄存器被復位。
從待機模式喚醒后的代碼執行等同於復位后的執行。電源控制/狀態寄存器(PWR_CSR)將會指示內核由待機狀態退出。

早期工程版本是通過 引腳 PC13 檢測 RTC 的入侵事件進行喚醒,實際測試發現問題較多。

本實驗將其改為復位按鍵進行喚醒,可以這么做是因為系統進入到待機模式后,被喚醒后系統的執行過程等同於進行復位。

 STM32F4xx 使用待機模式注意事項

待機模式要注意以下問題:
 將選擇的待機模式喚醒源(RTC 鬧鍾 A、RTC 鬧鍾 B、RTC 喚醒、RTC 入侵或 RTC 時間戳標志)對應的 RTC 標志清零,防止無法正常進入待機模式。
 待機模式下的 I/O 狀態
 復位引腳(仍可用)。
 RTC_AF1 引腳 (PC13)(如果針對入侵、時間戳、RTC 鬧鍾輸出或 RTC 時鍾校准輸出進行了配置)。
 WKUP 引腳 (PA0)(如果使能)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM