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