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 的連接。
測試低功耗的時候,一定不要連接調試器,更不能邊調試邊測電流。


免責聲明!

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



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