目錄
前言
嵌入式系統低功耗管理的目的在於滿足用戶對性能需求的前提下,儘可能降低系統能耗以延長設備待機時間。高性能與有限的電池能量在嵌入式系統中矛盾最爲突出,硬件低功耗設計與軟件低功耗管理的聯合應用成爲解決矛盾的有效手段。-----RTThread 文檔中心
背景
由於裸機上面低功耗在邏輯上實現較簡單,但面對龐大的操作的系統,需要考慮多個線程之前的邏輯。所以研究RTT之初想到的是解決功耗問題,以下是實現簡單的RTThread Nano版 PM組件對低功耗的管理。
移植
IDE: MDK5.28
RTOS內核版本:rtthread 3.1.3 nano版
硬件平臺:STM32L051C8
NANO版本移植使用PM組件步驟:
1、文件拷貝
在完整版的rtthread 3.1.3上面拷貝以下文件到一個可以點燈的rtthread nano版工程:
pm.c
pm.h
rtdevice.h
2、宏定義
在rtconfig.h中添加以下定義:
#define RT_USING_DEVICE //設備驅動
#define RT_USING_PM //PM組件
3、添加底層驅動文件
drv_pm.c 附件如下:
該文件實現低功耗具體實現的方法,如stm32芯片進入stop模式,那麼在_drv_pm_enter函數中添加實現(由於文件較長,不允許添加附件,故上傳至CSDN下載資源,鏈接:https://download.csdn.net/download/qq_34672688/12234833):
_drv_pm_enter 函數在drv_pm_hw_init被引用
4、OS TICK補償
如需定時器補償OS tick , 那麼在drv_pm.c文件中實現該驅動。該方法實現的前提是進入對應的低功耗模式後該定時器仍然可用,不會被關閉時鐘。如stm32下的LPTIM可用於低功耗模式下的計數或喚醒。第三步附件中實現的驅動並沒有實現OStick補償。
注意:若使用定時器補償,請打開註釋:
timer_mask = 1UL << PM_SLEEP_MODE_TIMER;
// PM_SLEEP_MODE_TIMER:該宏爲對應的低功耗模式,若未使用,請置0,未初始化至0調試時發現導致硬中斷:tidle
5、調用方法:
static void pm_mode_init(void)
{
rt_pm_release(PM_SLEEP_MODE_NONE);
rt_pm_release(PM_SLEEP_MODE_IDLE);
// rt_pm_request(PM_SLEEP_MODE_DEEP);
}
void task(void)
{
pm_mode_init();
while (1)
{
/* USER CODE END WHILE */
LED_XOR();
static uint8_t count = 0;
char *p = rt_malloc(128);
rt_memcpy(p, "123456\r\n", 8);
rt_kprintf("p:%s\r\n", p);
rt_free(p);
if(count++ >10)
{
rt_kprintf("perpare enter low power\r\n");
rt_pm_request(PM_SLEEP_MODE_DEEP);
count = 0;
}
rt_thread_delay(500);
}
}
實現效果
注意事項
- 根據外圍電路,檢查設備是否處於合理狀態,避免出現外設漏電的情況; 根據產品自身情況,關閉相應休眠模式期間不使用的外設和時鐘。
2. 測試時切勿直接開機進入低功耗,否則若板子無復位按鍵會出現無法燒錄的情況。出現該情況,參考文章解決:https://blog.csdn.net/Geekjin/article/details/79232405