提到MCU低功耗要求,很多人心裏面立即想到的是MCU在stop/standby模式下的功耗表現。選擇超低功耗的MCU,儘量關閉不必要外設和時鐘,增加外圍電路的阻抗相信是大多人普遍的做法。但有時已經把硬體軟體優化得非常完美了,當MCU進入stop時,電流達不到預期的低,或者說沒法做到datasheet所給到的值。其實往往我們忽略了一些細節導致的。
MCU最簡單的GPIO,有可能是我們無法進入超低功耗的問題所在,也是容易被人忽略的。
通常GPIO口有4個模式:
1. 輸入 Input mode
2. 輸出 output mode
3. 連接ADC,作為ADC輸入 Analog mode
4. 連接其他外設,如TIMER,EXIT等作為輸入和輸出 Alternate function mode
在這裡直接說答案,個人做過以下試驗,GPIO口不管出於輸入或輸出模式,必須要有穩定的電平,而處於浮空狀態的GPIO口是比較耗電的,每個GPIO口處於懸浮狀態,約可增加2~10uA電流,假如所有GPIO口都處於懸浮狀態,那可能增加幾十到幾百uA電流,自然功耗就沒法做下來。
ST早期產品STM32F1/F0系列,GPIO默認狀態就是處於浮空。下圖是F1的GPIO reset狀態
MCU最簡單的GPIO,有可能是我們無法進入超低功耗的問題所在,也是容易被人忽略的。
通常GPIO口有4個模式:
1. 輸入 Input mode
2. 輸出 output mode
3. 連接ADC,作為ADC輸入 Analog mode
4. 連接其他外設,如TIMER,EXIT等作為輸入和輸出 Alternate function mode
在這裡直接說答案,個人做過以下試驗,GPIO口不管出於輸入或輸出模式,必須要有穩定的電平,而處於浮空狀態的GPIO口是比較耗電的,每個GPIO口處於懸浮狀態,約可增加2~10uA電流,假如所有GPIO口都處於懸浮狀態,那可能增加幾十到幾百uA電流,自然功耗就沒法做下來。
ST早期產品STM32F1/F0系列,GPIO默認狀態就是處於浮空。下圖是F1的GPIO reset狀態
下圖是F0的reset狀態
可以看到,STM32F0和F1,對GPIO的reset狀態都是處於輸入懸浮狀態,這是比較耗電的,需要用戶自己去配置所有GPIO口,將它們配置成輸入上下拉或輸出PP。可能ST也意識到了這個問題,從STM32G系列開始,重新定義了GPIO模式,並修改了reset狀態,將analog mode作為復位後的狀態,這樣就有效避免了懸空的IO口對功耗的影響
並且,STM32G系列也有專門的描述說明standby模式下GPIO的狀態
綜上所述,GPIO處於懸浮輸入狀態下或開漏輸入狀態下時會增加功耗,處於輸出推挽、輸入上/下拉、analog模式下是比較省電的狀態。用戶可以根據自己電路板實際的外圍電路,選擇其中一種模式作為GPIO的常態,在進入sleep/stop之前將GPIO配置成這種模式(尤其是一些沒用的GPIO口),這樣可以達到省電的目的,也能進一步優化低功耗。
評論