最近在DIY一款支持mppt的太陽能充電器,其中使用到了STM32F030F4P6作爲主控芯片。用來顯示充電狀態,電池電量,升壓電路使能控制,輸出使能控制,手機插入檢測,檯燈控制等等功能。但是在我DIY過程中電路工作一切正常,就是晚上待機功耗有點大,具體待機電流有多少,沒有設備沒有測量。就是一晚上下來單節電池電壓會下降0點幾伏。在通過分析後發現在沒用進行太陽能充電時,單片機還在飛速運轉中,必然會造成功耗的損失。所以這裏就想着在空閒時間讓單片機進入低功耗模式,減少待機功耗。
STM32F030休眠模式介紹
從芯片手冊中可以找到以下一段文字:
大概的意思就是STM32F030F4P6支持3種低功耗模式,分別爲Sleep mode(休眠模式),Stop mode(停止模式),Standby mode(待機模式)。從手冊中可以看出停止模式支持任何一個外部中斷將MCU從低功耗模式中喚醒,這個功能對我這個應用實在是太友好了,因爲我能用來作爲外部喚醒資源的只有一個按鍵,所以在此次DIY的過程中毫不猶豫就使用停止模式,節省來之不易的能量。
在進入停止耗模式之前需要根據應用情況將單片機內部相關外設時鐘進行關閉。我這裏用到了ADC,所以需要關閉ADC時鐘,失能ADC。還有使用到兩個定時器,所以需要失能定時器讓所有定時器停止計數。還有就是記得將IO口做適當的處理,這個根據板子實際情況。具體怎樣設置可以參考下面這個文章,寫的不錯。http://www.openedv.com/posts/list/18372.htm
然後調用兩個函數便可以進入停止模式。(我用的HAL庫,函數參數可通過查看函數說明)
__HAL_RCC_PWR_CLK_ENABLE();
HAL_PWR_EnterSTOPMode();
void StopModeIn(void)
{
uint32_t i=10000;
/*關閉輸出*/
PowerSwitch(0);
LedOffAll();
/*失能定時器*/
ConfigTimer();
/*失能ADC*/
ConfigAdc();
/*設置所有IO口*/
ConfigIo();
/*開啓外部中斷,我這裏使用到兩個外部中斷進行喚醒*/
HAL_NVIC_EnableIRQ(EXTI0_1_IRQn); //按鍵狀態監測
HAL_NVIC_EnableIRQ(EXTI4_15_IRQn); //充電狀態監測
while(i--); //延時一小會
/*進入STOP MODE*/
__HAL_RCC_PWR_CLK_ENABLE(); //使能電源管理時鐘
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI); //進入停止模式,可以被任何一箇中斷源喚醒
}
我專門寫了一個函數用來進入停止模式,在進入之前調用相關函數對單片機進行配置,每個人需求都不同這裏就不一一介紹了。經過一番配置後,就能進入低功耗模式了吧!!!!
我手邊沒有專用的儀器,只有一個30多元萬用表,接上去後單片機不能正常工作。於是呼我採用了觀察法,將我的板子接上電池,進入低功耗測量初始電壓爲3.79V,然後經過3天后電壓依然爲3.79V,並且可以正常喚醒,我的電池是一節2600mah的鋰電池,在這期間肯定存在損耗,具體多少等到公司後在進行測量,總之能夠滿足我目前的需求。
進入停機模式前需要將一個引腳配置爲輸入中斷,在中斷函數中可以做一些相應的操作,對於我這個系統而言,不存在歷史數據所以直接在中斷服務函數中進行軟件復位就可以了,這樣就可以讓所有使用到的外設重新初始化。