STM32L4進(jìn)入STOP2模式后的漏電問題的分析及解決
前言
STM32L4 系列,目前是STM32超低功耗產(chǎn)品中最強(qiáng)大的一個(gè)系列。它為我們提供了豐富的低功耗模式,包括STOP2 模式、低至30nA 的Shutdown 模式。對于這些模式,我們需要進(jìn)行深入地了解,才能把它們用好。
問題
某客戶在其產(chǎn)品的設(shè)計(jì)中,使用了STM32L476RGT6??蛻粼陂_發(fā)過程中,發(fā)現(xiàn)當(dāng)進(jìn)入STOP2模式后,MCU 的電流保持在179.6uA,遠(yuǎn)大于數(shù)據(jù)手冊中所描述的值:1.18uA (3V 工作電壓 & 室溫 & 無LCD& 無RTC)。
調(diào)研
1.了解問題
首先,我們先確認(rèn)這個(gè)179.6uA 的電流真實(shí)存在,而且只是MCU上的電流,不是整機(jī)電流??蛻舨]有使用LCD,也沒有RTC,根據(jù)參考手冊,在3V 的供電電壓下,這個(gè)電流應(yīng)該是1.18uA 左右,如下圖:
目前所測的這個(gè)電流實(shí)在是太大了。
2.問題分析
根據(jù)代碼和現(xiàn)象確認(rèn)MCU 已經(jīng)進(jìn)入了STOP2 模式。那么,這個(gè)電流是如何產(chǎn)生的呢?初步懷疑是有輸出口在對外輸出電流。
于是,找到電路圖,對電路圖進(jìn)行了檢查,客戶的電路圖并不復(fù)雜,沒有很明顯可能會(huì)導(dǎo)致往外輸出電流的情況。結(jié)合電路圖,我們對I/O 口的狀態(tài)進(jìn)行了檢測,最后發(fā)現(xiàn)MCU 的一個(gè)I2C接口上的兩根信號(hào)線電平為低!
鑒于此,我們還得分成兩種情況來看。一是如果這兩個(gè)I/O 口被配置為輸入口,那么它是沒問題的,不會(huì)產(chǎn)生電流;另一種情況是,它仍然為I2C功能的開漏輸出口,那么這種情況下將會(huì)產(chǎn)生漏電流。所以,需要對代碼進(jìn)行檢查。
從電路圖上來看,MCU 的I2C 接口,SCL 和SDA 兩條線直接連接到外部器件,沒有上拉電阻。所以,先檢查I/O配置,這兩個(gè)口被配置為具有內(nèi)部上拉的復(fù)用開漏功能模式使用了內(nèi)部上拉電阻,這是正確的配置,沒問題。但是,我們發(fā)現(xiàn)客戶在進(jìn)入STOP2模式之前并沒有對這兩個(gè)口的配置進(jìn)行調(diào)整,也就是說,它們?nèi)匀粠е鴥?nèi)部上拉電阻并保持I2C 功能的開漏輸出結(jié)構(gòu)。
我們知道,如果I2C 是在空閑狀態(tài)下進(jìn)入STOP2 模式,按道理,它們應(yīng)該是保持在高電平。為什么兩個(gè)引腳都是低電平呢?再檢查用戶代碼,發(fā)現(xiàn)代碼中將數(shù)據(jù)寫入I2C 進(jìn)行發(fā)送后,就直接進(jìn)入STOP2 模式了。
問題來了,如果進(jìn)入STOP2 模式的時(shí)間點(diǎn)上,數(shù)據(jù)還在發(fā)送過程中,此時(shí),若SCL和SDA 都處于低電平的情況下,I2C 外設(shè)時(shí)鐘停止,SCL 和SDA 的狀態(tài)將被鎖定在輸出低電平狀態(tài)上。我們使用示波器對此情況進(jìn)行測試,發(fā)現(xiàn)確實(shí)如此,在進(jìn)入STOP2模式時(shí),I2C 數(shù)據(jù)還在發(fā)送;處于STOP2 模式中,SCL 和SDA 保持為輸出低電平;從STOP2模式喚醒后,I2C 繼續(xù)把剩下的bits 發(fā)完。
來看一下此時(shí)SCL和SDA 的I/O 配置結(jié)構(gòu)圖:
到此,這個(gè)問題基本就理清楚了:當(dāng)I2C 在工作時(shí),并在SCL 線和SDA 線上發(fā)送低電平時(shí),N-MOS 被打開,電流從VDDIOx 經(jīng)過上拉電阻流入I/O 口內(nèi)部,經(jīng)過N-MOS 流入VSS。若此時(shí)進(jìn)入STOP2 模式,由于Vcore 域的所有時(shí)鐘停止,導(dǎo)致I2C 外設(shè)時(shí)鐘停止,那么此I/O 狀態(tài)被保持,將導(dǎo)致在STOP 2 模式下電流持續(xù)產(chǎn)生。
STM32L476 的內(nèi)部上拉電阻為25~55kΩ,標(biāo)稱值為40 kΩ ,3V 的工作電壓,兩個(gè)I/O 的上的電流大約是3V/40 kΩ * 2=150uA
因?yàn)閮?nèi)部上拉電阻并非剛好40 kΩ,所以我們測得到179.6uA就是相當(dāng)?shù)卣A恕?/p>
3.問題解決
檢查STM32L476的參考手冊RM0351,在STOP2 模式下的描述中,可以看到以下這一段話:
STM32L4進(jìn)入STOP2模式后的漏電問題的分析及解決
意思是說:所有在STOP2 模式下不能使用的外設(shè),在進(jìn)入STOP2模式之前,必須在其外設(shè)本身清除相應(yīng)的使能位來進(jìn)行禁用,或者通過設(shè)置相應(yīng)的位將其恢復(fù)到復(fù)位狀態(tài)。
于是,需要對代碼進(jìn)行修改:在進(jìn)入STOP2 模式之前,將I2C 外設(shè)進(jìn)行復(fù)位,復(fù)位后將SCL和SDA 兩根線配置為輸入上拉狀態(tài)。為什么要配置為輸入上拉呢?因?yàn)榇薎2C 在外部上沒有上拉電阻連接,需要在STOP2模式下保持這兩個(gè)I/O 上有確定的電平,以避免其易受電磁干擾和額外的電流消耗。而這兩個(gè)口工作中又作為I2C接口,所以選擇上拉電阻而不是下拉電阻。修正后,再進(jìn)行測試,可測得在STOP2 模式下的電流為1.0uA,與數(shù)據(jù)手冊相符。
結(jié)論
由于在進(jìn)入STOP2 模式之前沒有對I2C 進(jìn)行復(fù)位及I/O 口處理,導(dǎo)致在STOP2 模式中產(chǎn)生了漏電流。