1. 程式人生 > >關於低功耗的一些開發流程與經驗

關於低功耗的一些開發流程與經驗

寫這篇目的是自己這幾天著手做省電模式的支援,需要將功耗降低到1mA一下來達到節能的目的。下面是對睡眠模式的一些經驗與注意要點,簡單的流程。供大家參考。

首先使用是ST公司的M4架構的晶片,stm32f4XX 。

首先明確自己的任務
1.需要在USB可以使用的情況下,打到休眠的目的。(功耗盡可能低)
2.需要在串列埠可以使用的情況下,達到休眠的目的(功耗在1mA以下)

在M4中,提供三種模式,sleep stop standby模式。具體區別在相應文件中有詳細說明。

stop模式,也就是深度休眠,需要將功耗降低到1mA以下。通過按鍵和串列埠可以將裝置喚醒,並繼續工作。

進入休眠的前期操作


進入休眠模式前,需要配置好喚醒中斷

庫中有提供相應的進入stop模式的函式void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry),呼叫這個函式就可以進入到stop模式了。
在除錯的過程中發現這個時候的電流並沒有打到文件中說的0.6mA而是在2mA多,大大超出了我的規格。我想很多第一次著手省電的都有類似於此的經歷

問題在於
1.在進入到stop模式或者其它的省電模式的時候需要手動關閉自己外設的時鐘,有的cpu在彙編中會做好,但是更多的cpu沒有做這一步所以這些動作都要我們來完成

2.原理圖仔細分析判斷,哪些元件會損耗電流(尤其關注電阻,還有晶片),如果相應晶片在stop模式中不需要工作,那麼在設計上可以考慮用多餘的管腳來控制這個晶片的VCC來達到stop模式下不工作

3.未使用的管腳按理來說,應該要配置成浮空輸入,這樣就不會產生壓降差,也就不會有電流的損耗(有的cpu管腳預設就是浮空輸入的狀態)。這點尤其注意。我用的這款stm32f4XXcpu不知道為什麼是需要配置成下拉輸入才會不消耗電流。(沒有去細究,已經牽扯到了架構了)
通過以上3步基本上可以完成stop模式的功耗要求了。

第二個,在sleep模式下需要打到省電的目的,但是這個時候USB要保持在工作狀態。
如果同樣使用stop模式的話會關閉所有的外設電源,這個時候喚醒了裝置然後進行USB通訊,由於USB通訊是需要相對較長的互動過程,如果使用stop模式的話在喚醒的這幾毫秒內USB與上位機還沒有互動完成,會導致通訊資料丟失。
1.st庫中沒有給出相應進入sleep模式的函式,但是通過呼叫__WFI()就能進入到sleep模式,這時尤其需要注意對MPU中的(vu32 *)((u32)0xE000ED10) &= ~((u32)0x00000004);這個位的清除,否則進入的是stop模式。


2.在保持USB模式可用的狀態下,我嘗試進入sleep模式。但是呈現出來的現象是沒有進入休眠,長時間的排查(困擾了我1天!)發現是USB通訊造成的。USB虛擬串列埠通訊是不斷進行中斷互動,所以導致進入到sleep模式,立馬usb中斷又產生,然後跳出sleep模式。
第二點的問題一直沒有解決。不知道有沒有大神可以私信告知,不勝感謝。
最終採用折中的方式。如果碰到相同問題的朋友,也與我一樣苦於無法解決不妨往下看。

如果在這個時候需要USB可以使用,也就是說會接到類似於pc的機子上。那麼這個時候是有接在電源上,所以這個時候對於功耗要求不太高
所以我們可以模擬stop模式下的操作:
關閉所有可以關閉而又不需要使用的電源時鐘。
然後採用wile()迴圈來監控是否有喚醒事件。如果有就跳出。
採用這個方式最終也將sleep功耗降低了15mA左右。

退出休眠模式操作
退出休眠模式後的第一件事情是將之前配置的管腳全部還原成工作狀態,開啟被關掉的時鐘等等。

以上是關於低功耗模式的一些流程與經驗,希望可以幫到你們,說的不好的歡迎指出,有什麼見解也可以私我討論。