1. 程式人生 > >STM8L的低功耗模式的配置

STM8L的低功耗模式的配置

低功耗可以說是stm8l系列微控制器的核心特色了。假設假設我們有一個溫度感測器裝置,他處於某種很特殊的地方,只能使用電池,而且我們很難去更換,那麼低功耗就顯得尤為重要。那麼繼續假設我們這個溫度感測器不需要一直工作,只需要1小時採集一次資料就行了,也就是說,一個小時內,我們這個感測器只工作1秒鐘,那麼剩下的59分59秒怎麼辦?也許有的同學就會說了,while(1)迴圈啊,這種回答就很沒有靈性。都不需要工作了,我們還關機不就行了,讓它一小時啟動一次,測量完就繼續關機。那麼就可以讓電池裡的電物盡其用。stm8l就有一個停機指令halt(),執行這條指令後,核心時鐘停止工作,就相當於關機了。

但是並不是停機了,整個電路中的電流消耗就達到了最小!

第一:

雖然MCU是停機了,但是電路板還有其他的晶片在工作,它們仍然在消耗電量,所以我們在停機前應該要把其他晶片給關閉(可以通過特定的指令或者片選線)。條件好的可以直接用切斷它們的電源。

第二:

我是這樣理解的:進入停機模式後,只是MCU中最耗電的核心部分被關了,而所有暫存器和記憶體中的值是保持不變的,所以它的外設還在消耗電量,所以我們要在停機之前把開啟的外設給關了。這裡要注意一點:外設開啟時是先開時鐘再設定暫存器,關閉時先清除暫存器再關閉時鐘。我是這樣理解的:操縱一個外設的暫存器肯定是需要時鐘的,如果我們先把時鐘給關了,那麼還怎麼操作暫存器呢,如果光關了時鐘,不清暫存器的相應位,那麼外設還處於“靜態耗電”的狀態。在研究低功耗的過程中,我被這個坑了好久。關於這一點的例項可以參考這篇部落格:

第三:

關於IO口的電平,這個是非常重要的一點,和之前提到的外設一樣,GPIO也是一種外設,但是特殊的是,這個外設是和晶片外部直接打交道的,如果GPIO外部接了個上拉電阻,而你在停機之前設定的IO口是低電平的,那麼電流不就通過電阻,流到IO口裡來了,比如正常的說接了個10k的上拉電阻,接到3.3v電壓上,那麼電流就是330uA,這個值可不小呢,stm8l在停機時極限最小電流好像能達到0.4uA。那麼你這個電路就是因為這個電阻,停機電流比別人大了將近800倍了,那麼假如你的產品能待機1年,人家待機800年,這還怎麼比?所以IO口是絕對不能被忽視的。stm8l晶片復位以後所有引腳都是浮空輸入模式,理論上懸浮空輸入時IO口的狀態為高阻態是最省電的,那麼我們只要把所有IO都DeInit就可以了。但是事實上不是,我把沒有用到的管腳全部推輓輸出高電平或低電平,不用的外部晶振的引腳要改為上拉輸入才省電,外部有上拉下拉電阻的引腳分別推輓輸出高電平和低電平,一般電路中上拉電阻比較多(比如IIC的匯流排外部都有上拉的)。和外部晶片相連的引腳都推輓輸出低電平,因為外部晶片斷電後所有引腳都是高阻態或接地的吧,如果你弄個高電平,就可能會有電流流過去。

在實際的專案中我們採用的方法是進入停機模式後,只有RTC時鐘在工作,然後RTC每隔一段時間喚醒一次MCU,MUC工作完成後繼續停機。

停機的程式碼為:

DeInit外設;
關閉外設時鐘;
逐個配置GPIO的電平
CLK_HaltConfig(CLK_Halt_FastWakeup,ENABLE);   //快速喚醒後時鐘為HSI
PWR_FastWakeUpCmd(ENABLE);                    //開啟電源管理裡的快速喚醒
PWR_UltraLowPowerCmd(ENABLE);                 //使能電源的低功耗模式(這句話的作用很大)
RTC_ITConfig(RTC_IT_WUT, ENABLE);             //使能RTC中斷
CLK_HSICmd(DISABLE);                          //關閉內部高速時鐘(之前核心是工作在HSI下的)
//sim();                                      //關閉所有中斷,手冊上說最好關閉所有中斷在進入停機模式,但是好像這條指令並不會關閉RTC中斷,我也沒用這行程式碼
halt();                                       //到這一步執行完後,核心時鐘就停止了,進入停機模式
WakeUp_Init();                                //rtc喚醒後PC指標在這裡,從這裡開始執行,所以我們要在這裡新增初始化各種外設和外部晶片的程式碼

最後我測出來實際進入休眠模式後電流5~6uA左右,和理想的還是有一點差距,因為我們的板子上帶有穩壓晶片,消耗量一部分的電流。

這裡有網友分享的低功耗模式下電流的資料: