對應電池供電的產品,在不使用的時候,單片機和外設都應該進入休眠狀態 用于減少對電池電量消耗 在使用的時候又能夠通過按鍵或其他信號喚醒系統,然后進入正常工作狀態 在電壓V3.3V的情況下,應廣單片機的休電流幾乎在2A以下 經常測到都是一點幾uA.非常不那么應廣單片機的低功耗和按鍵喚醒是怎么實現的呢?不多說上代碼.除了外部喚醒 還有一種機制是內部定時器定時喚醒
分兩個部分寫,省電模式和掉電模式,這也是規格書上描述的官方叫法,本文統稱為休眠模式。
一:stopexe模式(省電模式)
這個省電模式可以通過IO喚醒和中斷喚醒。
如果使用IO喚醒,那么設置好IO后,IO輸入電平產生變化就會喚醒MCU。
arrow_forward_ios閱讀文章
% buffered
00:00
00:21
01:31
如果使用中斷喚醒:
1,如果使用T16定時中斷,那么在定時中斷產生的時候就會喚醒MCU,由此也可以看出,進入省電模式stopexe時,MCU內部時鐘仍然在運行,以便計時,而關閉的只是系統時鐘sysclk,因此,在使用定時中斷T16作為喚醒源時,務必要使用內部時鐘IHRC/ILRC作為時鐘源。
2,如果使用比較器中斷作為喚醒源,在選擇比較器輸入端時,不要使用BG作為比較源,因為在進入省電模式時,BG也會關閉,會導致無法產生中斷喚醒。
在進入省電模式前,因為MCU內部時鐘不會關閉,而看門狗此時有打開的話,那么有可能在省電模式中產生不必要的復位,所以在進入省電模式前要關閉看門狗。
二:stopsys模式(掉電模式)
這個模式是深度省電,只能IO喚醒,MCU所有的時鐘都會關閉。
三:程序設置
關聯寄存器有「 IO端口寄存器,IO端口方向寄存器,IO端口上拉寄存器和IO端口數字寄存器」。
比如設置PA0作為IO喚醒口,那么IO端口設置為:
PA = 0B_XXXX_XXX0; // "X"代表任意,供實際應用寫1或者0
PAC = 0B_XXXX_XXX0; //"0"代表輸入
PAPH = 0B_XXXX_XXX1; // 「1」代表開內部上拉
$ padier 0b_xxxx_xxx1; //"1"代表打開PA0的喚醒功能 和數字輸入功能
...
while(1){
stopsys; //休眠
}
在仿真的時候,如果休眠了,光標會停止在stopsys這句上,如下圖:
喚醒后,是跑stopsys的下一行指令,而不是先進去中斷。
在程序寫休眠時,因為電平有變化就產生喚醒的動作,那么可能發生的現象是,比如MCU在休眠中,按鍵按下MCU喚醒,程序跑了一個循環又再次進入休眠,此時按鍵還沒松開,而等按鍵再松開時,又再產生了電平變化喚醒MCU,那么表現出來的現象就像是按鍵沒有喚醒功能一樣,因此要避免這個問題,可以在程序上做個時間差,比如喚醒之后,等1秒或者等按鍵松開之后再去跑程序大循環。