失敗排查與救磚:從Cannot update firmware到SWD恢復(fù))
前幾天給一塊 Nucleo-F767ZI 下載程序時(shí)IDE 彈窗提示要更新板載 ST-Link 固件我隨手點(diǎn)了確認(rèn)幾秒后報(bào)錯(cuò)Cannot update firmware for ST-Link。再點(diǎn)一次依舊卡在同一個(gè)位置拔了重插Windows 干脆連設(shè)備都認(rèn)不出來(lái)了。這個(gè)場(chǎng)景我相信不是只有我一個(gè)人遇到過(guò)一塊官方板調(diào)試器莫名要求升級(jí)升級(jí)又失敗最后連目標(biāo)芯片都連不上。這篇文章就把我完整排查、手動(dòng)刷寫(xiě)和最終救磚的過(guò)程寫(xiě)下來(lái)包括 ST-Link 固件更新的觸發(fā)機(jī)制、驅(qū)動(dòng)層面的坑、DFU 強(qiáng)制恢復(fù)以及萬(wàn)一板載調(diào)試器救不回來(lái)時(shí)怎么用外部 ST-Link 走 SWD 繼續(xù)開(kāi)發(fā)。后面再遇到同樣報(bào)錯(cuò)照著這個(gè)順序排查能省下好幾個(gè)小時(shí)的折騰時(shí)間。1. Cannot update firmware 彈窗到底在說(shuō)什么先搞懂 ST-Link 固件更新的觸發(fā)機(jī)制1.1 為什么一塊新板子也會(huì)要求更新固件ST-Link 不是一個(gè)純硬件調(diào)試器它內(nèi)部有一片小存儲(chǔ)空間裝著固件通過(guò) USB 枚舉成一個(gè)調(diào)試器 虛擬串口。ST 會(huì)定期更新這版固件修復(fù)連接穩(wěn)定性問(wèn)題、增加對(duì)新芯片的支持。你打開(kāi) STM32CubeProgrammer、IAR、Keil 或者 STM32 ST-LINK Utility 時(shí)工具會(huì)先通過(guò) USB 讀取 ST-Link 的固件版本號(hào)如果低于工具自身內(nèi)置的最低版本要求就會(huì)彈出升級(jí)提示。Nucleo-F767ZI 這類官方板出廠時(shí)板載 ST-Link 固件可能停留在比較早的版本而新版本的 STM32CubeProgrammer 對(duì) ST-Link 固件要求越來(lái)越高所以哪怕你剛拆封也會(huì)遇到升級(jí)提示。這不是板子壞了只是工具鏈想讓調(diào)試器先升級(jí)再干活。我見(jiàn)過(guò)很多人的操作是看到彈窗直接點(diǎn) Upgrade然后進(jìn)度條走到一半卡住接著就是 Cannot update firmware for ST-Link。問(wèn)題在于這個(gè)彈窗背后的升級(jí)流程并不是簡(jiǎn)單的往調(diào)試器里寫(xiě)一次數(shù)據(jù)它分成了好幾個(gè)階段任何一個(gè)環(huán)節(jié)掉鏈子都會(huì)報(bào)這個(gè)錯(cuò)。1.2 升級(jí)流程拆開(kāi)看問(wèn)題出在哪一步ST-Link 的固件升級(jí)流程大致分三步正常模式下識(shí)別 ST-Link讀取當(dāng)前固件版本將 ST-Link 切換到 DFUDevice Firmware Upgrade模式USB 重新枚舉通過(guò) DFU 接口寫(xiě)入新固件完成后再切回正常模式。很多報(bào) Cannot update firmware 的情況其實(shí)是卡在第二步。ST-Link 切到 DFU 模式后USB 的 VID/PID 會(huì)變Windows 需要另一套驅(qū)動(dòng)去識(shí)別這個(gè) DFU 設(shè)備。如果你的系統(tǒng)里只有正常模式下的 ST-Link 驅(qū)動(dòng)沒(méi)有 DFU 設(shè)備對(duì)應(yīng)的驅(qū)動(dòng)那么切換之后設(shè)備就變成未知設(shè)備工具自然沒(méi)法繼續(xù)寫(xiě)固件。還有一個(gè)常見(jiàn)情況是你同時(shí)開(kāi)著 IDE 調(diào)試會(huì)話ST-Link 正被 IAR 或 Keil 占用。升級(jí)工具去讀設(shè)備時(shí)拿不到獨(dú)占訪問(wèn)權(quán)也會(huì)直接失敗。我自己的習(xí)慣是在碰到升級(jí)彈窗時(shí)先別急著點(diǎn)。先關(guān)掉所有可能占用調(diào)試器的軟件只保留升級(jí)工具再點(diǎn)升級(jí)。如果還是失敗再往下走手動(dòng)流程。2. 第一輪排查換線、換口、查驅(qū)動(dòng)先排除最廉價(jià)的故障點(diǎn)2.1 物理層故障USB 線、供電、連接器這里說(shuō)的物理層聽(tīng)起來(lái)很基礎(chǔ)但它真的能導(dǎo)致 50% 以上的玄學(xué)報(bào)錯(cuò)。Nucleo-F767ZI 的板載 ST-Link 通過(guò) CN1 那個(gè) Micro-USB 口供電并通信如果 USB 線質(zhì)量差、線芯太細(xì)或者你插在筆記本的 USB-Hub 上設(shè)備能在正常模式下識(shí)別但切到 DFU 后瞬間電流波動(dòng)大枚舉就會(huì)失敗。我處理過(guò)一塊板子用戶描述每次升級(jí) ST-Link 必失敗換了兩臺(tái)電腦都一樣最后發(fā)現(xiàn)是那根 USB 線只有電源線沒(méi)有數(shù)據(jù)線設(shè)備管理器里能看到設(shè)備是因?yàn)楣╇姷搅说ㄐ乓幻蛿?。換成手機(jī)原裝數(shù)據(jù)線后一次成功。排查順序應(yīng)該是換一根短而粗的 USB 線最好是帶屏蔽的直插電腦主板 USB 口不要經(jīng)過(guò) Hub拔掉板子上所有其他連接包括目標(biāo)芯片側(cè)的串口線、外部電源只保留 ST-Link 的 USB 線如果電腦前面板口不行換后面板口試試。這一步花五分鐘就能排除大部分物理問(wèn)題別一上來(lái)就刷固件。2.2 設(shè)備管理器里到底應(yīng)該看到什么在 Windows 下把 ST-Link 插上電腦后打開(kāi)設(shè)備管理器重點(diǎn)看通用串行總線設(shè)備和端口COM 和 LPT兩類。正常情況下Nucleo-F767ZI 的板載 ST-Link 會(huì)顯示STM32 STLink同時(shí)有一個(gè)虛擬串口設(shè)備。如果打開(kāi) STM32CubeProgrammer 的固件升級(jí)工具并讓 ST-Link 進(jìn)入 DFU 模式設(shè)備管理器里會(huì)出現(xiàn)STM32 STLink dongle。我整理了一張常見(jiàn)狀態(tài)對(duì)照表排查時(shí)可以直接對(duì)著看設(shè)備管理器顯示含義怎么處理STM32 STLinkST-Link 正常模式驅(qū)動(dòng)正??梢灾苯訃L試升級(jí)STM32 STLink dongleST-Link 已經(jīng)進(jìn)入 DFU 模式等待寫(xiě)入固件用官方升級(jí)工具繼續(xù)刷寫(xiě)未知設(shè)備 / USB Device Not Recognized驅(qū)動(dòng)沒(méi)匹配上或枚舉失敗卸載設(shè)備重裝驅(qū)動(dòng)或換 USB 口MBED CMSIS-DAP板子處于 Mbed 固件模式切換到 ST-Link 模式或重新刷回原廠固件如果顯示STM32 STLink dongle但升級(jí)工具一直報(bào)錯(cuò)多半是驅(qū)動(dòng)和工具的匹配問(wèn)題。這時(shí)候不要慌卡在 DFU 模式反而說(shuō)明硬件沒(méi)死只是固件沒(méi)寫(xiě)完。2.3 驅(qū)動(dòng)殘留引起的識(shí)別錯(cuò)亂很多老玩家電腦上同時(shí)裝過(guò) STM32 ST-LINK Utility、STM32CubeProgrammer、IAR、Keil還有各種版本的驅(qū)動(dòng)。這些工具各自會(huì)往系統(tǒng)里注冊(cè) USB 驅(qū)動(dòng)驅(qū)動(dòng)之間版本沖突是 Cannot update firmware 的高發(fā)原因。一個(gè)比較干凈的驅(qū)動(dòng)重裝流程是這樣的拔掉 ST-Link在設(shè)備管理器里把現(xiàn)有的 STM32 STLink、STM32 STLink dongle、未知設(shè)備全部卸載卸載時(shí)勾選刪除此設(shè)備的驅(qū)動(dòng)程序軟件重啟電腦重新插上 Nucleo 板讓系統(tǒng)自動(dòng)裝一次驅(qū)動(dòng)只打開(kāi) STM32CubeProgrammer 一個(gè)工具再試升級(jí)。如果系統(tǒng)自動(dòng)安裝驅(qū)動(dòng)后設(shè)備依然顯示未知設(shè)備可以試試用 Zadig 把 ST-Link 的接口驅(qū)動(dòng)改成 WinUSB。這個(gè)操作有一定風(fēng)險(xiǎn)只建議在官方驅(qū)動(dòng)怎么都認(rèn)不到設(shè)備時(shí)使用而且不要手滑改別的設(shè)備。改完之后如果官方工具還是不認(rèn)可以再用 Zadig 換回原驅(qū)動(dòng)。3. 正戲用 STM32CubeProgrammer 手動(dòng)把 ST-Link 刷回正常狀態(tài)3.1 工具選擇為什么推薦 STM32CubeProgrammer 而不是老牌 ST-Link Utility網(wǎng)上很多教程提的是 STM32 ST-LINK Utility這個(gè)工具確實(shí)經(jīng)典但要注意它已經(jīng)停止更新最后版本停留在 4.6.0內(nèi)置的 ST-Link 固件版本也比較老。如果你拿著新出的 Nucleo 板去用這個(gè)老工具升級(jí)它很可能認(rèn)得出設(shè)備但給你刷的固件版本并不夠新或者因?yàn)榧嫒菪詥?wèn)題刷到一半就斷了。STM32CubeProgrammer 是 ST 現(xiàn)在主推的一體化工具調(diào)試、燒錄、讀保護(hù)、固件升級(jí)全都能干Windows/Linux/macOS 都有版本。固件升級(jí)功能就藏在主界面的 ST-LINK 配置區(qū)里入口很淺。能裝新工具就別用老工具這不是說(shuō)老工具不能用而是省得踩一些沒(méi)必要的版本坑。STM32CubeProgrammer 安裝包本身會(huì)帶對(duì)應(yīng)版本的 ST-Link 固件升級(jí)成功率比老工具高得多。3.2 手動(dòng)升級(jí)的標(biāo)準(zhǔn)操作流程動(dòng)過(guò)驅(qū)動(dòng)和物理層之后用 STM32CubeProgrammer 手動(dòng)升級(jí)的操作流程如下打開(kāi) STM32CubeProgrammer先不要連接目標(biāo)芯片在主窗口右上角的 ST-LINK 配置區(qū)找到Firmware upgrade按鈕并點(diǎn)擊工具會(huì)彈出一個(gè)升級(jí)窗口顯示當(dāng)前連接的 ST-Link 序號(hào)、當(dāng)前固件版本和可升級(jí)的固件版本點(diǎn)擊Refresh確認(rèn)設(shè)備能正常識(shí)別選擇要升級(jí)的固件版本點(diǎn)擊Upgrade觀察進(jìn)度條整個(gè)過(guò)程一般 30 秒以內(nèi)。這中間有個(gè)很多人不知道的細(xì)節(jié)升級(jí)窗口里提示的操作順序是先斷開(kāi) ST-Link 與目標(biāo)板的連接只保留 USB 連接。我在實(shí)際測(cè)試中發(fā)現(xiàn)Nucleo-F767ZI 板載 ST-Link 和目標(biāo)芯片之間默認(rèn)有 SWD 連接如果目標(biāo)芯片正好處于異常狀態(tài)比如讀保護(hù)開(kāi)啟或者進(jìn)入了低功耗模式會(huì)對(duì) ST-Link 的枚舉產(chǎn)生干擾。所以我在升級(jí)前會(huì)把板上連接 ST-Link 和目標(biāo) MCU 的跳線帽先拔掉或者直接把目標(biāo)芯片的供電斷開(kāi)只讓 ST-Link 單獨(dú)工作。升級(jí)過(guò)程中千萬(wàn)不要拔線也不要打開(kāi)其他任何會(huì)訪問(wèn) USB 的軟件。進(jìn)度條走完之后拔掉 USB 線重新插一次再回到升級(jí)窗口點(diǎn)Refresh看到版本號(hào)已經(jīng)更新到最新就說(shuō)明成功了。3.3 刷寫(xiě)完后的驗(yàn)證升級(jí)完成后最直接的驗(yàn)證方式是重新打開(kāi) STM32CubeProgrammer點(diǎn)擊連接看日志窗口里打印的固件版本號(hào)。比如從V2.J24變成V2.J39這種版本號(hào)在日志里一目了然。如果日志里出現(xiàn)ST-Link firmware upgraded successfully之類的信息基本就穩(wěn)了。然后再把之前拔掉的跳線帽裝回去試著讀一下目標(biāo)芯片的 ID能讀到 0x451 之類的高系列 ID 就說(shuō)明整個(gè)鏈路全部恢復(fù)正常。還有一點(diǎn)要提醒升級(jí)完 ST-Link 固件后虛擬串口會(huì)重新枚舉一次這時(shí)候設(shè)備管理器里可能短暫消失再出現(xiàn)這是正常的。如果串口號(hào)變了你的串口工具記得重新選擇新出現(xiàn)的 COM 口。4. 救磚升級(jí)中斷后 ST-Link 變未知設(shè)備怎么辦4.1 強(qiáng)制進(jìn)入 DFU 模式讓工具重新識(shí)別如果之前升級(jí)失敗后 ST-Link 卡在了一個(gè)既不正常也不是完整 DFU 的中間狀態(tài)設(shè)備管理器顯示未知設(shè)備這時(shí)候需要用物理手段強(qiáng)制它進(jìn)入 DFU 模式。Nucleo-F767ZI 的板載 ST-Link 并沒(méi)有留專門的 BOOT 跳線但 ST-Link 的 MCU 出廠時(shí)預(yù)置了 DFU bootloader只要在 USB 枚舉階段讓 ST-Link 的 MCU 認(rèn)為需要進(jìn)入模式它就會(huì)進(jìn)入。實(shí)際操作方式很簡(jiǎn)單拔掉板子的 USB 線完全斷電按住板子上的復(fù)位鍵Nucleo-F767ZI 板卡上標(biāo)注為 B1 或 RESET 的那個(gè)按鍵不放插上 USB 線保持按住復(fù)位鍵 2-3 秒后再松開(kāi)。這個(gè)動(dòng)作的目的和很多單片機(jī)按住 BOOT0 下載類似就是讓 ST-Link MCU 在上電時(shí)直接進(jìn)入 DFU bootloader。操作完再去設(shè)備管理器看大概率會(huì)看到STM32 STLink dongle說(shuō)明已經(jīng)救回來(lái)了。如果按住復(fù)位鍵插線還是無(wú)法識(shí)別可以換一個(gè) USB 口或者換一臺(tái)干凈的系統(tǒng)再試。這一步成功的關(guān)鍵是 USB 枚舉瞬間的供電穩(wěn)定性之前說(shuō)的線材問(wèn)題在這里同樣影響很大。4.2 固件包從哪來(lái)版本怎么選ST-Link 固件文件本身不通過(guò)網(wǎng)上隨便下載而是由工具自帶。STM32CubeProgrammer 安裝目錄里有一份 ST-Link 固件包位置通常在安裝路徑下的Drivers或firmware目錄。當(dāng)你在升級(jí)工具里點(diǎn)刷新時(shí)工具會(huì)自動(dòng)加載這個(gè)固件包不需要手動(dòng)指定路徑。如果你用的是單獨(dú)的 ST 官網(wǎng)固件升級(jí)包 STSW-LINK007它解壓后也有一個(gè)固件文件目錄。版本號(hào)建議直接選最新不用刻意選舊的。唯一要注意的是別拿 ST-Link/V3 的固件刷到 V2 設(shè)備上工具一般會(huì)按設(shè)備型號(hào)自動(dòng)匹配但如果你手動(dòng)選擇文件還是要看清楚文件名。還有一點(diǎn)山寨 ST-Link 的板子刷固件經(jīng)常會(huì)失敗因?yàn)樗?MCU 型號(hào)可能不是原版芯片或者固件被動(dòng)了手腳。這也是我推薦用原廠板載調(diào)試器折騰的原因原廠芯片刷不壞最多重新刷一遍山寨貨就說(shuō)不準(zhǔn)了。4.3 Linux 環(huán)境下怎么處理如果你是在 Linux 下遇到這個(gè)報(bào)錯(cuò)處理思路和 Windows 類似但前置條件要多一條讓當(dāng)前用戶有權(quán)限訪問(wèn) USB 設(shè)備。STM32CubeProgrammer 的 Linux 安裝包里帶了一組 udev 規(guī)則安裝之后需要手動(dòng)拷貝到系統(tǒng)目錄并重載。參考做法sudo cp Drivers/rules/*.rules /etc/udev/rules.d/ sudo udevadm control --reload-rules sudo udevadm trigger把規(guī)則裝好之后重新插板子再啟動(dòng) STM32CubeProgrammer 的升級(jí)工具。Linux 下沒(méi)有 Windows 那么復(fù)雜的驅(qū)動(dòng)殘留問(wèn)題只要權(quán)限到位升級(jí)成功率反而更高。唯一麻煩的是如果你插上板子后系統(tǒng)把設(shè)備識(shí)別成ttyACM串口設(shè)備升級(jí)工具卻看不到大概率是 udev 規(guī)則沒(méi)生效優(yōu)先排查權(quán)限。5. 讀保護(hù)這個(gè)隱形殺手目標(biāo)芯片 RDP 和 ST-Link 連接的糾纏5.1 讀保護(hù)為什么會(huì)干擾調(diào)試鏈路排查 ST-Link 升級(jí)問(wèn)題時(shí)很容易忽略目標(biāo)芯片側(cè)的狀態(tài)。Nucleo-F767ZI 核心是 STM32F767ZI如果這顆芯片之前被設(shè)置了讀保護(hù)RDP Level 1它會(huì)拒絕調(diào)試器通過(guò) SWD 訪問(wèn) flash。這種情況下ST-Link 在連接目標(biāo)時(shí)會(huì)報(bào)錯(cuò)哪怕 ST-Link 自身固件正常工具也會(huì)把錯(cuò)誤信息混在一起讓人誤以為 ST-Link 壞了。還有一種更隱蔽的情況目標(biāo)芯片處于讀保護(hù)狀態(tài)時(shí)如果它恰好把 SWD 引腳配置成了普通 GPIO 或者低功耗模式會(huì)拉低 SWDIO 或 SWCLK 的電平。ST-Link 在升級(jí)固件前需要讀取目標(biāo)芯片狀態(tài)做握手握手失敗后升級(jí)工具就回報(bào) Cannot update firmware。所以我現(xiàn)在的排查習(xí)慣是遇到 ST-Link 相關(guān)報(bào)錯(cuò)先斷開(kāi) ST-Link 與目標(biāo)芯片的 SWD 連接只留 ST-Link 單獨(dú)工作。如果單獨(dú)工作一切正常再接上目標(biāo)芯片問(wèn)題大概率出在目標(biāo)側(cè)而不是 ST-Link 側(cè)。5.2 用 ST-Link Utility 解除讀保護(hù)的正確姿勢(shì)解除讀保護(hù)最常用的工具還是官方工具STM32CubeProgrammer 可以STM32 ST-LINK Utility 也可以。用 STM32 ST-LINK Utility 的操作路徑是連接目標(biāo)芯片后菜單欄Target→Option Bytes在Read Out Protection一欄把值從 Level 1 改成 Level 0然后點(diǎn)Apply。工具會(huì)彈一個(gè)警告提示開(kāi)啟 Level 0 將擦除整個(gè) Flash確認(rèn)后執(zhí)行芯片就會(huì)回到無(wú)保護(hù)狀態(tài)。用 STM32CubeProgrammer 更直接連接時(shí)如果檢測(cè)到讀保護(hù)會(huì)彈窗問(wèn)你是否解除選 Yes 之后它會(huì)自動(dòng)做整片擦除并恢復(fù) Level 0。需要特別記牢的是解除讀保護(hù)必然觸發(fā)全片擦除。如果芯片里有量產(chǎn)固件或者不想丟的數(shù)據(jù)先想想有沒(méi)有備份。沒(méi)有備份的話只能接受從零開(kāi)始的事實(shí)。另外如果你看到的是 Level 2情況就完全不一樣了。Level 2 是最高級(jí)別讀保護(hù)調(diào)試接口基本永久關(guān)閉ST-Link 連 SWD ID 都可能讀不出來(lái)。這種情況下不用想著用 ST-Link 硬解只能走系統(tǒng) Bootloader比如 UART/USB DFU 里的選項(xiàng)字節(jié)擦除或者直接換芯片。Level 2 保護(hù)一開(kāi)ST-Link 這邊再折騰都是白費(fèi)勁。我在實(shí)際操作時(shí)會(huì)先把 ST-Link 固件升到最新再處理目標(biāo)芯片的讀保護(hù)。原因很簡(jiǎn)單舊固件的 ST-Link 對(duì) RDP 狀態(tài)的識(shí)別和交互不夠完善處理讀保護(hù)時(shí)偶爾會(huì)卡在奇怪的狀態(tài)新固件更穩(wěn)。6. 備選方案板載 ST-Link 徹底罷工后用外部 ST-Link 走 SWD 續(xù)命6.1 先理清 SWD 四根線的關(guān)系如果板載 ST-Link 經(jīng)過(guò)各種刷寫(xiě)操作徹底沒(méi)反應(yīng)了最務(wù)實(shí)的辦法不是繼續(xù)救而是換一個(gè)外部 ST-Link 通過(guò) SWD 接口直接連目標(biāo)芯片。畢竟 Nucelo-F767ZI 的價(jià)值在 F767 這顆芯片上調(diào)試器壞了不影響芯片本身。SWD 調(diào)試只需要四根線就能跑起來(lái)SWDIO、SWCLK、GND、VCC。其中 SWDIO 是雙向數(shù)據(jù)線SWCLK 是時(shí)鐘線GND 必須共地VCC 用于電平參考告訴調(diào)試器目標(biāo)芯片的電壓域。對(duì)應(yīng)到 STM32F767ZI 芯片上SWDIO 就是 PA13SWCLK 就是 PA14這兩個(gè)引腳是復(fù)用的只要芯片沒(méi)有被完全鎖死調(diào)試器就能通過(guò)它們?cè)L問(wèn)內(nèi)部資源。Nucleo-F767ZI 板上其實(shí)有現(xiàn)成的 SWD 排針位置在 ST-Link 和目標(biāo)芯片之間絲印上通常會(huì)標(biāo) SWDIO、SWCLK、GND 等。不同批次的板子絲印可能略有差別有的寫(xiě) TMS/TCK 而不是 SWDIO/SWCLK含義是一樣的。找不準(zhǔn)的話翻一下板卡的用戶手冊(cè) UM1974上面有完整的引腳分布圖。6.2 標(biāo)準(zhǔn) 20pin 座子怎么接最省心很多外接 ST-Link 的線纜末端是 ARM 標(biāo)準(zhǔn)的 20pin IDC 座子也就是熱詞里提到的那個(gè) 2.54mm 20pin 座子。SWD 模式不需要接滿 20 根只要找準(zhǔn)幾個(gè)關(guān)鍵引腳就行。我按常見(jiàn)的 ARM 20pin 標(biāo)準(zhǔn)排列整理了一張表照著接就行信號(hào)20pin 座子引腳號(hào)說(shuō)明VCC1目標(biāo)板參考電壓通常在 1.65V-3.6VSWDIO2數(shù)據(jù)線對(duì)應(yīng) PA13SWCLK4時(shí)鐘線對(duì)應(yīng) PA14GND6公共地nRESET10可選強(qiáng)烈建議接上用于復(fù)位目標(biāo)座子方向怎么看一般 20pin 座子的 1 腳位置會(huì)有小三角或者方點(diǎn)絲印找準(zhǔn) 1 腳之后其他腳按順序數(shù)就行。奇數(shù)腳大多是 GND偶數(shù)腳是信號(hào)這個(gè)規(guī)律能幫你快速校驗(yàn)有沒(méi)有插反。新手容易犯的一個(gè)錯(cuò)是只接四根線不接 nRESET。如果目標(biāo)芯片在調(diào)試時(shí)跑飛了或者處于低功耗狀態(tài)沒(méi)有硬件復(fù)位線的話調(diào)試器沒(méi)法把它重新拉回調(diào)試狀態(tài)。所以在有 nRESET 的情況下能接就接上。6.3 外接調(diào)試器后的配置要點(diǎn)用外部 ST-Link 連接 Nucleo-F767ZI 時(shí)先別急著點(diǎn)連接注意幾個(gè)配置細(xì)節(jié)把板載 ST-Link 和目標(biāo)芯片之間的跳線/排針斷開(kāi)否則兩個(gè)調(diào)試器同時(shí)掛在 SWD 總線上會(huì)出現(xiàn)總線沖突誰(shuí)都連不上在 STM32CubeProgrammer 的 ST-LINK 配置區(qū)選擇外部 ST-Link 的序列號(hào)如果同時(shí)插著板載調(diào)試器先只插一個(gè)連接速度建議先從低頻開(kāi)始比如 400kHz確認(rèn)能穩(wěn)定識(shí)別后再逐步提高能正常連接的話 1800kHz 通常也沒(méi)問(wèn)題接口類型選 SWD不是 JTAG。外部 ST-Link 如果是山寨版本驅(qū)動(dòng)和固件都可能不標(biāo)準(zhǔn)偶爾會(huì)出現(xiàn)連接上了但下載很慢或者校驗(yàn)失敗的情況。這種時(shí)候把連接頻率調(diào)低一檔成功率會(huì)明顯上升。實(shí)際上我自己手頭常備一個(gè)幾十塊的山寨 ST-Link V2作用就是專門給各種板子的目標(biāo)芯片救急。原廠板載調(diào)試器升級(jí)失敗、芯片被刷進(jìn)錯(cuò)誤程序?qū)е?SWD 被禁用、讀保護(hù)開(kāi)過(guò)頭……這些場(chǎng)景下外部 ST-Link 從外部接管 SWD往往比死磕板載 ST-Link 的 DFU 模式高效得多。說(shuō)到底Cannot update firmware for ST-Link 這個(gè)報(bào)錯(cuò)絕大多數(shù)情況都是驅(qū)動(dòng)、USB 枚舉和工具占用三個(gè)老問(wèn)題在搗亂。先把物理層和驅(qū)動(dòng)層排查干凈再用官方工具手動(dòng)走一遍升級(jí)流程成功率已經(jīng)很高。真到了板載 ST-Link 救不回來(lái)的地步也別急著退貨用外部 ST-Link 從 SWD 口接入繼續(xù)調(diào)試就是了。做嵌入式開(kāi)發(fā)手里有個(gè)外部調(diào)試器有時(shí)候比糾結(jié)一塊板子的板載調(diào)試器更省心。