板子做好了,MCU也焊上了,但是SWD連接不上、無法下載程序,這該怎么辦?
這個問題似乎經(jīng)常遇到,分享一下最近遇到的幾起案例。
1)案例1,A工程師做了5塊板子,一個都連不上。
在確認連線無問題后,我第一時間想到了供電問題。將之前MCU獨立供電改為由Jlink給板子供電后問題就解決了。
連接失敗的原因是MCU采用5V供電,而Jlink輸出為3.3V,電平不匹配。3.3V無法被5V系統(tǒng)識別為高電平,5V系統(tǒng)識別高電平的最低電壓大約為0.7*5V=3.5V,所以改為Jlink給板子供電就正常了。當(dāng)然板子單獨供電MCU 5V也能連接,只需要讓Jlink電平也工作在5V就可以。比如用戶這個Jlink,拆開后里面有一個跳線帽,默認是在3.3V這一側(cè),換到5V那一側(cè)短接,就可以變成5V電平了。
2)案例2,B工程師做了5塊板子,其中3塊板子能正常連接燒錄,另外2塊板子連接有問題。
5塊相同的板子燒錄了完全相同的程序,但其中2塊存在問題。最初我懷疑是那2塊硬件有問題,后確認硬件也是正常的沒問題,
后來一個線索提醒了我,就是了解到那2塊有問題的板子第一次是可以連接下載的,是下載了一次之后不行的,另外B工程師在程序里修改過選項字節(jié)。
關(guān)于選項字節(jié)的詳細說明此處不再贅述。這是一塊特殊的Flash存儲區(qū)域,其修改可通過專用上位機軟件或用戶代碼實現(xiàn)。不管哪種方式,在操作選項字節(jié)時,都一定要注意保持電源穩(wěn)定。因為如果發(fā)生電源劇烈波動或者重啟,就可能會出現(xiàn)選項字節(jié)區(qū)域已經(jīng)被擦除了但是還沒有正確寫入新值的問題,由于沒有被完整寫入,在后面選項字節(jié)加載前,由于原始值和反碼值比對不通過,就可能會被強制修改為其他值,導(dǎo)致RDP等級發(fā)生變化,進而出現(xiàn)SWD無法連接的情況。
該工程師在程序初始階段便操作了選項字節(jié),而燒錄時夾具探針與板子的接觸可能不穩(wěn)定,從而導(dǎo)致上述問題。
應(yīng)對措施是等待電源穩(wěn)定后再操作選項字節(jié),例如在程序中加入短暫延時,確保上電穩(wěn)定后再執(zhí)行選項字節(jié)操作。因為他板子上還有一個對外的串口,生產(chǎn)測試時也會通過這個串口來接收數(shù)據(jù),或者可以在串口接收到數(shù)據(jù)后去操作選項字節(jié),因為這時電源是穩(wěn)定的。總之,避開燒錄時因為接觸不良導(dǎo)致電源波動的那段時間去操作選項字節(jié)就可以了。此外程序里操作選項字節(jié)的話,要注意只需要執(zhí)行一次即可,不要每次復(fù)位后都去更改選項字節(jié)。
3)案例3,C工程師之前項目連接都沒問題,新做了一個項目連接不上了。
這個問題是因為把MCU BOOT引腳拉高導(dǎo)致的,在硬件設(shè)計時需注意。
還有其它一些SWD無法連接的情況:
1)MCU進入了低功耗狀態(tài)。因為進入低功耗后,SWD的時鐘停了,所以無法連接。解決這個問題有兩個方法:a)調(diào)試時,程序里進入低功耗前可以加個幾秒的延時,這樣下次上電或者復(fù)位后,就有足夠的時間去連接。 b)調(diào)試器的復(fù)位引腳和MCU的Reset引腳連接上,通過硬復(fù)位在進入低功耗前可以連接下載。
2)SWD被復(fù)用為其他功能了。在管腳不夠用的時候,SWD接口可能會被用作其他功能,這種情況也是建議程序里加一些延時。
3)除了上述提到的BOOT引腳,有的MCU還有NMI引腳,如果該引腳上電復(fù)位時為低電平,那么就會進入到NMI中斷里,導(dǎo)致SWD無法正常連接。
4)調(diào)試熱插拔過程中,把SWD接口干壞了。這種情況建議盡量避免熱插拔,可以先連接好線,再上電。此外,盡量避免SWD先上電而MCU后上電的情況。
以上情況如果都不是的話,那么還有一種可能是芯片焊錯了,這種情況我也有遇到過。
所以下次如果還遇到MCU SWD無法連接的問題時,可優(yōu)先排查上述情況。