以下內容轉載自安富萊電子: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)(如果使能)。
