【導讀】從STM32F0部分型號開(kāi)始,比如STM32F04x和STM32F09x,STM32越來(lái)越多的型號具有了空片檢測(Empty Check)功能。以前,STM32的啟動(dòng)由BOOT0和BOOT1來(lái)決定,在引入了空片檢測功能之后,則在BOOT0=0的情況下,還需要分兩種情況:
一是內部已經(jīng)存在代碼,則從用戶(hù)存儲區啟動(dòng);
二是如果是空片,則從系統存儲區啟動(dòng),執行內部Bootloader。
它帶來(lái)什么好處呢?客戶(hù)如果是空片上板,無(wú)需對BOOT0引腳進(jìn)行跳線(xiàn),就可以直接使用內部Bootloader進(jìn)行串口或其他通訊口進(jìn)行代碼燒錄了,可以說(shuō)非常地方便。但是,這同時(shí)為GPIO的設計帶來(lái)一個(gè)非常大的風(fēng)險,在電路設計時(shí)需要引起注意,做好相應的措施。
問(wèn)題起源
某客戶(hù)在其產(chǎn)品的設計中,使用STM32G0B1RET6。有一天,客戶(hù)工程師在測試電流的時(shí)候,無(wú)意間發(fā)現一個(gè)情況,說(shuō)“有個(gè)比較奇怪的情況,STM32G0B1沒(méi)有燒錄代碼的情況下,會(huì )比有燒錄代碼的情況下電流多了幾十毫安?!卑次覀円酝恼J知,在沒(méi)有燒錄代碼的情況下,沒(méi)有任何操作,不該會(huì )出現這種情況啊。那么這是什么情況呢?
問(wèn)題分析
測量STM32G0B1在沒(méi)有燒錄代碼下的GPIO在懸空下的電平,可以發(fā)現有部分GPIO呈現為高電平,比如PA2/PA3和PA9/PA10。而客戶(hù)在PA9上接了一個(gè)外部驅動(dòng)電路,由高電平驅動(dòng),所以PA9的高電平,帶動(dòng)了該部分電路的工作,導致了電流的增加。
從參考手冊RM0444的GPIO一章,我們知道STM32G0的GPIO在上電后應該為模擬狀態(tài),所以這些呈現高電平的GPIO顯得有點(diǎn)奇怪。
突然想起STM32F091等型號早就已經(jīng)有的空片檢測功能,就繼續查看STM32G0的參考手冊RM0444的 “Memory and bus architecture”一章,果然,發(fā)現STM32G0系列同樣擁有空片檢測功能。也就是說(shuō),STM32G0B1在沒(méi)有燒錄代碼的情況下,它是要到系統存儲區去執行內部Bootloader的。
此時(shí),需要打開(kāi)應用筆記AN2606《STM32微控制器系統存儲器自舉模式》了解一下STM32G0B1在系統Bootloader下GPIO的狀態(tài)。
由于之前已經(jīng)檢測到PA2/PA3和PA9/PA10為高電平,而這兩個(gè)引腳對剛好是Bootloader中所用到USART1和USART2對應的GPIO引腳。于是,檢查其在Bootloader中的配置狀態(tài),請參考圖1。
Figure 1 系統Bootloader下USART1/2的端口狀態(tài)
從圖1中可以了解到PA2/PA3/PA9/PA10均配置為復用推挽結構,帶上拉電阻。其中PA10/PA3為輸入口,PA2/PA9為輸出口。
使用一個(gè)1k?的電阻來(lái)測量PA9/PA10的端口狀態(tài),來(lái)確定其高電平的來(lái)源。系統VDD的電壓為3.22V。
測量之前,需要了解一下GPIO的結構,如圖2。
Figure 2 復用功能配置下的I/O的結構
從圖2中可以得知,當作為輸出時(shí),端口上呈現的高電平來(lái)自P-MOS上的VDDIOX;當作為輸入時(shí),端口上呈現的高電平來(lái)自上拉電阻上的VDDIOX。下面來(lái)驗證測試一下。
先對輸出口PA9進(jìn)行測量,使用1k?電阻串入PA9與VSS之間,并串上電流表,測得電流為3.22mA。由U=I·R公式,剛剛好,總電阻R = U / I = 3.22V ÷ 3.22mA = 1k?。也就是說(shuō),PA9的高電平由推挽結構中的P-MOS連接的VDDIOX提供,內部沒(méi)有電阻。
再來(lái)對輸入口PA10進(jìn)行測量,使用1k?電阻串入PA10與VSS之間,并串上電流表,測得電流為85.4uA??傠娮鑂 = U / I = 3.22V ÷ 85.4uA = 37.7k?,大于在外部串接的1k?電阻。也就是說(shuō),PA10的高電平來(lái)自上拉電阻所連接的VDDIOX,而且內部上拉電阻RPU = 37.7k? - 1k? = 36.7k?。
多加一步再次確認輸入口PA10的情況,這次不使用1k?電阻,而是直接將PA10串上電流表連接到VSS,得到電流值為87.7uA。內部上拉電阻RPU = U / I = 3.22V ÷ 87.7uA = 36.7k?,與上面的測試是相同的。也符合STM32G0B1數據手冊中內部上拉電阻的范圍,如圖3。
Figure 3 I/O的上下拉電阻參數
存在的風(fēng)險
到此,已經(jīng)清楚用戶(hù)存儲區沒(méi)有燒錄代碼的時(shí)候,STM32啟動(dòng)將進(jìn)入系統 Bootloader,PA9被設置為復用輸出并輸出高電平,從而推動(dòng)外部電路產(chǎn)生的電流增加。但是我們應該更加深入地研究這個(gè)問(wèn)題??蛻?hù)的情況還算是比較好的,接的是一個(gè)驅動(dòng)電路,并不會(huì )帶來(lái)?yè)p壞。
想象一下,如果在客戶(hù)的應用中,PA9是用作輸入口,用來(lái)連接一個(gè)傳感器的中斷輸出,比如連接3軸MEMS加速度計LIS2DH12的INT1/2引腳。查看LIS2DH12的數據手冊,可以得知INT1和IN2引腳的初始狀態(tài)是輸出低電平的,如圖4。
Figure 4 LIS2DH的INT1/INT2引腳初始狀態(tài)
由于LIS2DH12的INT引腳初始狀態(tài)是推挽輸出且輸出低電平,如果直接連接到PA9,而用戶(hù)打算將空片先焊接于用戶(hù)板,再進(jìn)行代碼燒錄的話(huà),那么,當上電的時(shí)候,LIS2DH12的INT引腳輸出低電平,而STM32G0B1進(jìn)入內部Bootloader后PA9輸出高電平,直連將導致短路,電流從STM32G0B1的PA9內部的VDDIOX經(jīng)過(guò)P-MOS,從PA9引腳出來(lái),經(jīng)過(guò)連接線(xiàn),到達LIS2DH12的INT引腳,從內部的M-MOS流到VSS,中間因為沒(méi)有電阻而造成短路,很可能會(huì )對芯片產(chǎn)生損壞。所以必須加以注意!
PA10作為復用輸入功能,倒是沒(méi)有這個(gè)風(fēng)險。
結論
由于空片檢測功能的存在,帶有此功能的STM32型號在空片的情況下啟動(dòng),將會(huì )進(jìn)入系統存儲區,執行內部Bootloader。內部Bootloader會(huì )將部分GPIO設置為復用功能輸出引腳并輸出高電平或低電平,如果此引腳在用戶(hù)應用中作為輸入引腳連接到外部芯片的輸出引腳,那么STM32空片事先焊接于用戶(hù)板時(shí),上電將可能帶來(lái)極大的風(fēng)險。在GPIO設計中如遇到有空片檢測功能的STM32必須對此加以注意。
解決辦法
兩種解決辦法供用戶(hù)選擇。
1) 在兩個(gè)芯片的連接中串入電阻進(jìn)行保護,流經(jīng)此電阻的電流必須要低于GPIO的注入電流,而且還必須保證不影響雙邊的高低電平識別。
2) 在使用帶有空片檢測功能的STM32型號中,在硬件設計上要預先檢查AN2606中所描述的Bootloader使用并配置的復用功能輸出引腳,在GPIO設計時(shí)避免在用戶(hù)應用中將其作為輸入引腳。
以上兩種方法,推薦使用第二種方法,更簡(jiǎn)單、更穩妥。
來(lái)源:STM32單片機
免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問(wèn)題,請聯(lián)系小編進(jìn)行處理。
推薦閱讀:
開(kāi)關(guān)穩壓器的封裝體積正變得越來(lái)越小