【STM32L053】使用STM32CUBE軟件開發(fā)低功耗設(shè)備一些經(jīng)驗分享
網(wǎng)站:21ic.com
(1)更換ST平臺背景
最近NXP的芯片買不到了,之前產(chǎn)品都是使用NXP是L系列做低功耗應(yīng)用,現(xiàn)在訂貨交期都是50周往上,買散料一片喊出來的價格300 ,這個價格令人望而生畏,太過分了,哈哈。
沒辦法只能切平臺了,之前搞了一批GD的片子回來,做了一個項目,但是那個項目不需要低功耗,有電源適配器供電,不需要考慮功耗問題,手上這個新項目電池供電,GD就沒辦法用了,只能讓采購搞點ST回來試試,選了ST的L系列,哈哈,ST的花點錢還是能搞到貨。ST的低功耗模式?jīng)]有NXP那么多種,大類有5類:1、睡眠模式,2、低功耗運行模式3、低功耗睡眠模式4、停止模式 5、待機模式。
我看了一下,1、2、3類功耗偏高,不適合目前使用,第5類等于喚醒芯片復(fù)位,SRAM數(shù)據(jù)都不能保存,IO狀態(tài)也不能保證,這個也用不了,適合這個項目的就是第4、停止模式,手冊上標(biāo)注停止模式最低0.8uA,這個比一般的MCU低多了,完全夠用了,如下圖:

(2)低功耗調(diào)試經(jīng)驗
常規(guī)經(jīng)驗(這個是參考前輩的經(jīng)驗):
1、外設(shè)時鐘必須切換為內(nèi)部時鐘;2、不用的外設(shè)全部關(guān)閉,要用再開就是了;3、浮空引腳必須配置為下拉;這個直接在STM32cube軟件里面配置就行了4、硬件上的上拉、下拉電阻切記不能隨便加,使用到的外圍芯片也要注意功耗問題;外圍的功能供電須加mos管做開關(guān)。5、對進入低功耗有好幾種情況可以選擇(睡眠、停機、待機),不同模式喚醒機制略有不同;6、你需要一個測試過的低功耗的DEMO,測試硬件上的問題或移植到你的工程,這是最靠譜的;
這次是第一次使用ST的L系列,直接參考手冊做的電路,焊接的時候,專門留了一塊板子,外圍功能器件不焊接,只焊接MCU和芯片周圍的器件直接做了一塊最小系統(tǒng)板用了調(diào)試功耗,這個是我的習(xí)慣,一般做一個新項目,新MCU的話,會焊一塊最基本的板子,用來調(diào)功耗。
然后找到官方的低功耗例程,來驗證,這次開始功耗特別大,燒官方的例程也有300多uA,后來檢查電路,發(fā)現(xiàn)BOOT0的電平可選擇電阻選擇有問題,太小了,換了一個10M之后,功耗立馬降到3uA,這個基本上夠用了,待機電流也不是越低越好,現(xiàn)在的一次性鋰亞電池,做的容量都很大,待機電流太小,如果采集周期也很長的話,容易照成電池鈍化,也會影響使用周期。
(3)STM32CUBE使用經(jīng)驗分享
1. 新建一個工程
第一步肯定是下載軟件,這個就不多說了,找官方下載就行了,對應(yīng)的L系列還需要安裝一個軟件包,之前用了F429,這次試用L053又下載了一個安裝包。
雙擊打開這個軟件?


打開之后選擇新建一個工程:

等待軟件加載一些功能之后,選擇你的MCU:

找到你的MCU之后,雙擊它就行了:

就出現(xiàn)了我們可以配置的界面,下面就是我們選擇的MCU:

具體的使用大家慢慢摸索,哈哈。
使用這個STM32cube軟件,也沒有像官方說的那樣,新手也能用好,我感覺完全的新手估計夠嗆,起碼時鐘樹就很難理解,之前搞飛思卡爾,也就是現(xiàn)在的NXP的,都是看寄存器手冊然后對照例程學(xué)習(xí),想一步到位估計夠嗆。有些經(jīng)驗的,使用這個軟件配置初始化還比較合適,各項功能很清晰。
2. 配置我們需要的IO口和功能
按照具體的項目配置IO口和功能,下圖是我最近這個項目用到的,3個串口,一個ADC監(jiān)視電池電壓,5個按鍵中斷,然后還有一些IO控制,內(nèi)部的EEPROM,RTC定時器和硬件看門狗。

本來也可以用內(nèi)部HSI,我擔(dān)心頻率不那么精準(zhǔn),串口通訊波特率可能會有些問題,還是加了一個外部8M晶振,配置一下時鐘樹。

配置完之后生成代碼,選著保存的目錄等等

還有一個自動配置未使用的IO 為輸入狀態(tài)

3. 在低功耗前提下各個功能程序處理經(jīng)驗
在低功耗前提下,使用各個功能,就要做到,用到打開,用完立即關(guān)閉。以采集電池電量為例,如下
u16 Get_VBat(void)
{
float temp;
u16 BATTER_VALUE,VREFINT_CAL;
u16 Ref_Vol;
u16 Vdc;
MX_ADC_Init(); //重新初始化
BATTER_VALUE = GET_ADC(ADC_CHANNEL_0);
Ref_Vol = GET_ADC(ADC_CHANNEL_VREFINT);
printf("電池:%d\r\n",BATTER_VALUE);
printf("基準(zhǔn):%d\r\n",Ref_Vol);
BATTER_VALUE = 2*BATTER_VALUE;
temp=((float)BATTER_VALUE/Ref_Vol)*1.24;
Vdc = (u16)(temp*1000);
printf("Vdc=%u\r\n",Vdc);
HAL_ADC_DeInit(