???某STM32用戶反饋,他使用STM32L031芯片開發產品遇到低功耗異常的問題。
基本軟硬件及開發環境如下:
硬件:STM32L031、外部晶振32.768
軟件:STM3CUBE、MDK5、HAL庫
他在產品中用到了STOP低功耗模式。在讓芯片進入STOP之前,先關閉了ADC外設。
代碼是這樣的:
HAL_PWR_EnterSTOPMode(??PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI);
他發現按照上述操作進入STOP模式后的功耗,比開機時不開啟ADC模塊時的功耗要大,而且發現在進STOP之前,有沒有HAL_ADC_DeInit()這一句,對功耗沒有任何影響。
稍微整理下,現在的具體情況是這樣的:
芯片復位后,不初始化ADC外設、不啟用ADC相關功能,進stop后芯片功耗為2.6uA。
如果復位后初始化ADC,進入stop之前做了HAL_ADC_DeInit(&hadc)操作,功耗則為18uA。客戶好奇的是,他認為執行了HAL_ADC_DeInit()命令行,也就相當于關閉了ADC外設,進入STOP模式后功耗也應該是2.6左右。事實上差別怎么這么大呢?
難道HAL_ADC_DeInit()沒有關閉ADC外設的作用?如果這樣,如何在進STOP前關閉ADC外設呢?
其實,HAL_ADC_DeInit(&hadc)的功能只是將ADC模塊本身及相關寄存器恢復成復位初狀態下的默認值,并不是用來關閉ADC外設模塊的。如果使用STM32庫函數的話,我們可以調用下面函數關閉ADC外設時鐘以停止其功能運行。
__HAL_RCC_ADC1_CLK_DISABLE() ;
可是,當客戶在進STOP前將HAL_ADC_DeInit(&hadc)換成__HAL_RCC_ADC1_CLK_DISABLE()后,發現功耗并無明顯變化,依舊是18uA左右。那是怎么回事呢?
建議客戶在讓芯片進入STOP前確保沒有其它浮空腳存在或可能產生漏電流地方,做各個管腳的硬件確認。經過檢查,客戶在應用線路上并沒有發現什么可疑的地方。
經過進一步地溝通了解,客戶使用ADC模塊并未對外部信號進行采樣,只是對兩個內部信號進行采樣。即對內部溫度和內部的參考基準電壓進行采樣轉換。
現在的情況是,只要芯片復位后不做任何有關ADC的初始化,當然也包括不對上述兩個內部信號的采樣轉換做使能配置,此時功耗就能相對明顯地降下去。難道這個功耗降不下去跟開啟這兩個內部信號的AD轉換有關?
循著這個思路,進一步查看STM32L0的參考手冊有關內部溫度傳感器和內部基準參考電壓的章節。我們可以發現要對這兩個內部信號進行AD采樣的話,有專門的針對這兩個模塊及對應通道的?開啟使能操作,換句話說,這兩個內部模塊并不屬于ADC外設模塊。當開啟這兩個模塊后,簡單地關閉ADC外設是沒法對二者進行關閉的。
結合庫代碼我們也可以看到針對這兩個內部信號的使能指令,即下圖中紅色圓圈圈出來的代碼。
研究到這里,基本可以大致估測到可能是因為開啟了這兩個內部模塊后,帶來了額外的功耗。客戶在讓芯片進STOP之前,即使關閉了ADC外設時鐘,如果沒有進一步關閉這兩個地方,二者產生的功耗依然存在。
于是,建議客戶在讓芯片進STOP之前,除了關閉ADC外設時鐘外,將開啟過的內部溫度傳感器通道和內部參考電壓通道實施關閉操作。即讓客戶運行如下兩行代碼:
ADC->CCR &=(~ADC_CCR_TSEN); // Turn Off TemperatureChannel
ADC->CCR &=(~ADC_CCR_VREFEN); // Turn Off VrefintChannel
客戶在進STOP前添加上面兩行代碼后,STOP模式下的功耗就正常了。顯然,當開啟內部溫度傳感器和內部參考電壓通道后,會增加些功耗。它們的開啟和關閉是單獨操作的,這點需注意。
當我們在調試過程中遇到類似問題時先不要著急,盡量結合手冊和庫代碼一步步找原因,或許很快可以撥云見日。
-
芯片
+關注
關注
456文章
51037瀏覽量
425464 -
STM32
+關注
關注
2270文章
10915瀏覽量
356771 -
函數
+關注
關注
3文章
4344瀏覽量
62809
原文標題:一個低功耗應用的案例分析
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論