利器)
很多人手里握著 ST-Link絕大多數(shù)時(shí)候只是拿來(lái)給 IDE 點(diǎn)一下“下載”按鈕芯片里是什么狀態(tài)、Flash 里到底寫了什么、板子被鎖死了怎么救一概不清楚。ST-LINK Utility 這個(gè)工具恰恰就是解決這些“下載按鈕之外”問題的。它在老工程師圈子里被戲稱為“最后的救命稻草”在新工程師手里卻經(jīng)常只被當(dāng)作一個(gè)下載 hex 的替代品。這篇博文我想把它的下載安裝、完整使用流程、批量燒錄和故障排查一次性講透希望對(duì)從事嵌入式開發(fā)、產(chǎn)線支持和售后維修的朋友都有點(diǎn)實(shí)際幫助。1. 認(rèn)識(shí) ST-LINK Utility沒它的時(shí)候你會(huì)在哪些場(chǎng)景卡住1.1 它到底是什么和 IDE 自帶的燒錄器區(qū)別在哪ST-LINK Utility 是面向 STM32 全系列 Cortex-M 內(nèi)核微控制器的桌面端編程工具。你可以把它理解成一個(gè)“獨(dú)立于工程代碼之外的 Flash 操作臺(tái)”它不關(guān)心你的源碼不參與編譯只負(fù)責(zé)和 ST-LINK 調(diào)試器通信對(duì)芯片內(nèi)部的 Flash、選項(xiàng)字節(jié)、OTP 區(qū)域做讀寫、擦除和校驗(yàn)。IDE比如舊版 Keil MDK 或 IAR里自帶的燒錄功能本質(zhì)上也是調(diào)用 ST-LINK 的驅(qū)動(dòng)庫(kù)去操作 Flash但它有一個(gè)前提你必須有一個(gè)完整可編譯的工程。假如你手上只有一個(gè) hex/bin 文件、一段沒有源碼的固件、或者一塊進(jìn)度條卡在“Download”不動(dòng)又不知道原因的開發(fā)板IDE 就非常別扭。ST-LINK Utility 則完全繞開了工程體系把芯片當(dāng)成一個(gè)裸設(shè)備來(lái)操作直接面對(duì) Flash 的每一個(gè)字節(jié)。另外一個(gè)容易忽略的區(qū)別是IDE 的下載邏輯是“按扇區(qū)增量寫入”它只擦除有代碼變化的區(qū)域ST-LINK Utility 在做全片編程時(shí)往往會(huì)執(zhí)行更徹底的操作流程這對(duì)排查一些“明明編譯通過了但程序行為很奇怪”的隱性 Flash 殘留問題非常有幫助。很多同事在 Keil 里反復(fù) Download 都搞不定的偶發(fā)故障我讓他們用 ST-LINK Utility 做一次全片擦除重新燒錄十有八九就正常了。原因很簡(jiǎn)單IDE 的增量燒錄不會(huì)把已經(jīng)擦除的“空洞”或舊版本殘留全部清干凈芯片里偶爾殘留一些無(wú)用數(shù)據(jù)可能導(dǎo)致中斷向量表錯(cuò)亂或存儲(chǔ)區(qū)重疊。1.2 日常工作里真正需要它的幾個(gè)場(chǎng)景這不是一個(gè)需要“天天打開”的工具但一旦出事它就是那個(gè)能救場(chǎng)的。固件備份與比對(duì)板子上的程序跑得好好的但你手里沒有源碼或者不確定最新出貨版本是不是這個(gè)用 Utility 的 Read Back 功能把整片 Flash 讀出來(lái)存成 bin 文件再和另一個(gè)正常板子讀出來(lái)的內(nèi)容做比對(duì)差異一目了然。板子被讀寫保護(hù)鎖死野外設(shè)備升級(jí)到一半斷電、調(diào)試時(shí)誤使能了 RDP讀保護(hù)級(jí)別 1、或者 SWD 引腳被程序復(fù)用成了 GPIO導(dǎo)致調(diào)試器連接不上。Utility 的“連接-全片擦除”路徑是官方支持的標(biāo)準(zhǔn)自救流程。批量生產(chǎn)燒錄小批量產(chǎn)線不依賴 IDE 授權(quán)的情況下Utility 的命令行模式配合批處理腳本是低成本量產(chǎn)方案里很成熟的一種。幾臺(tái)電腦、一個(gè) hex 文件、一根 ST-LINK就能跑起一個(gè)簡(jiǎn)易燒錄工位。查看芯片內(nèi)部狀態(tài)想知道 Flash 有沒有寫滿、某塊地址區(qū)域存了什么配置、選項(xiàng)字節(jié)被改成了什么IDE 是不會(huì)告訴你的。Utility 的內(nèi)存窗口直接映射整個(gè)存儲(chǔ)空間全體一目了然??梢哉f(shuō)凡是和“STM32 芯片 Flash 本身”有關(guān)的問題它都管凡是和“源碼編譯”有關(guān)的問題它都不摻和。這個(gè)邊界想清楚你就知道什么時(shí)候該想起它。1.3 和老伙計(jì)、新工具之間的橫向?qū)Ρ萐T-LINK Utility 在官方產(chǎn)品序列里確實(shí)已經(jīng)進(jìn)入維護(hù)末期官方主推的替代方案是 STM32CubeProgrammer。但“替代”不代表“立刻廢棄”很多場(chǎng)景下 Utility 仍然有不可替代的價(jià)值對(duì)比維度ST-LINK UtilitySTM32CubeProgrammer界面簡(jiǎn)潔度非常簡(jiǎn)潔點(diǎn)擊即用功能豐富菜單層級(jí)多內(nèi)存窗口可視化左側(cè)樹形映射右側(cè)窗口直觀偏底層需要點(diǎn)選 Address 窗口命令行批量.bat ST-LINK_CLI輕量Python/CubeProgrammer 更靈活固件升級(jí) ST-LINK老版本菜單里有獨(dú)立入口新版獨(dú)立升級(jí)程序大 Flash 外部存儲(chǔ)器支持部分外部 Flash 編程更完善新芯片型號(hào)支持較老對(duì)新系列支持有限跟隨新片發(fā)布節(jié)奏所以我的態(tài)度從來(lái)不是一刀切。如果你的芯片型號(hào)比較舊F1/F4/F0 這些、生產(chǎn)環(huán)境是 Windows XP/7、或者你不想為了一個(gè) bin 文件下載幾百 MB 的新工具Utility 依然很順手。如果你用的是新出的 G0/L4系列遇到型號(hào)不支持的情況那還是老老實(shí)實(shí)用 STM32CubeProgrammer。工具不在新舊在于你清不清楚它的邊界。2. 下載與安裝老工具也有講究千萬(wàn)別踩驅(qū)動(dòng)坑2.1 從哪里下載、選哪個(gè)版本ST-LINK Utility 的官方下載渠道是 ST 官網(wǎng)的 TOOLS AND SOFTWARE 板塊。注意一點(diǎn)它的完整軟件名是 “STM32 ST-LINK Utility”別和 “ST-LINK/V2-1 固件升級(jí)程序” 搞混這兩個(gè)是不同的安裝包。前者是主程序后者是單獨(dú)給 ST-LINK 硬件升級(jí)用的默認(rèn)會(huì)在前者安裝時(shí)一并裝好。版本選擇上我建議直接選帶 “_setup.exe” 的最新 Windows 版。老版本比如 3.x 早期對(duì)新款 ST-LINK/V2 的兼容性差容易報(bào)告 “ ST-LINK firmware outdated” 然后拒絕連接。最新的 4.x 版本對(duì)新舊硬件兼容都不錯(cuò)界面上沒有翻天覆地的變化操作習(xí)慣一致。下載時(shí)留意你系統(tǒng)位數(shù)雖然有兼容模式但 64 位系統(tǒng)直接裝 64 位版少很多麻煩。安裝包體積不大幾十 MB 級(jí)別不像新款 IDE 動(dòng)輒上 GB這也是它適合放在產(chǎn)線電腦上的重要原因。2.2 安裝過程中的關(guān)鍵勾選安裝向?qū)б宦?Next 基本沒問題但有三個(gè)細(xì)節(jié)值得留意第一安裝路徑里絕對(duì)不要出現(xiàn)中文和空格。有同事裝在D:\軟件\ST Tools\下結(jié)果命令行模式死活找不到ST-LINK_CLI.exe最后發(fā)現(xiàn)是批處理腳本引號(hào)沒寫好中文路徑在 cmd 里編碼不一致。工具本身不受影響但命令行調(diào)用極其依賴路徑純凈統(tǒng)一用D:\STLink\這種最穩(wěn)。第二驅(qū)動(dòng)安裝那一步。安裝完成后通常會(huì)自動(dòng)裝好 ST-LINK 的 USB 驅(qū)動(dòng)但有些精簡(jiǎn)版系統(tǒng)或開啟了驅(qū)動(dòng)簽名強(qiáng)制的機(jī)器會(huì)失敗。你可以打開設(shè)備管理器看端口附近有沒有 “ST-LINK dongle” 或者通用串行總線設(shè)備下面有沒有感嘆號(hào)。如果有感嘆號(hào)右鍵更新驅(qū)動(dòng)手動(dòng)指向安裝目錄里的ST-LINK_USB_Driver文件夾即可不需要額外去網(wǎng)上下載第三方驅(qū)動(dòng)否則容易被捆綁流氓軟件。第三官方安裝包默認(rèn)會(huì)裝一個(gè) “ST-LINK Upgrade” 獨(dú)立程序保留它。后面 ST-LINK 硬件固件版本影響連接穩(wěn)定性時(shí)全靠它來(lái)升級(jí)別為了節(jié)省桌面空間把它合掉。2.3 硬件連接與識(shí)別檢查軟件裝好接下來(lái)把 ST-LINK 插到電腦用 SWD 四根線連目標(biāo)板SWDIO、SWCLK、GND以及供電如果板子沒有獨(dú)立電源。這里有個(gè)非常反直覺的經(jīng)驗(yàn)很多連接失敗不是線序問題而是電壓不匹配。新款 ST-LINK/V2 的 SWD 接口有電平轉(zhuǎn)換功能但部分老款或山寨 ST-LINK 只支持 3.3V 目標(biāo)板。如果你的板子是 5V 供電的外部傳感器模塊或者目標(biāo)芯片是 1.8V 內(nèi)核的低功耗系列SWDIO/SWCLK 的電平可能直接燒壞調(diào)試器或通訊異常。連接前先確認(rèn)目標(biāo)板供電范圍和 ST-LINK 的電壓跳線/模式說(shuō)明。連接后打開 Utility界面上方的連接按鈕會(huì)變成一個(gè)綠色圓點(diǎn)。如果顯示 “Target is connected” 且左側(cè) RAM/Flash 區(qū)域出現(xiàn)地址映射說(shuō)明通路正常。若提示 “Can not connect to target”大概率就是后面第 5 章要講的問題先別慌。3. 五個(gè)最高頻的使用場(chǎng)景逐個(gè)手把手拆解3.1 在線模式下載 hex/bin 文件這是日常打開率最高的功能。工具欄上那個(gè) “Open file” 按鈕選擇要下載的 hex 或 bin 文件文件一經(jīng)加載右側(cè)會(huì)顯示目標(biāo)地址和校驗(yàn)信息。hex 文件自帶地址信息工具會(huì)按照 hex 記錄里的地址自動(dòng)寫入對(duì)應(yīng)位置bin 文件則是一片裸數(shù)據(jù)你需要手動(dòng)指定起始地址。大多數(shù) F1 系列程序從0x08000000開始不要填錯(cuò)否則寫入的位置不對(duì)程序肯定跑不起來(lái)。下載前建議養(yǎng)成一個(gè)習(xí)慣先執(zhí)行一次 Erase 操作把整片 Flash 擦干凈再下載新固件。很多人為了省事點(diǎn) “Download” 按鈕讓工具自動(dòng)處理確實(shí)它也會(huì)自動(dòng)擦除必要的扇區(qū)但在排查問題階段全片擦除能排除“舊代碼殘留”這個(gè)變量。下載過程中左下角狀態(tài)欄會(huì)跳出File loaded successfully接著是Programming...再是Verification...三步齊全才說(shuō)明燒錄完整缺一不可。這里分享一個(gè)我踩過很多次的坑不要把 hex 文件當(dāng) bin 文件加載。hex 是文本格式每一行都以冒號(hào)開頭、帶有地址和校驗(yàn)碼bin 是純二進(jìn)制。一旦你用 bin 方式加載 hex起始地址全亂工具會(huì)把它當(dāng)裸數(shù)據(jù)寫進(jìn)你指定的地址輕重則程序跑飛重則把芯片配置區(qū)寫壞。判斷方法很簡(jiǎn)單保險(xiǎn)起見直接用 “Open file” 然后看一下右側(cè)加載的起始地址是否以0x0800...開頭以及數(shù)據(jù)量是否和 hex 大小匹配。3.2 讀回 Flash 內(nèi)容做備份和比對(duì)想備份芯片里的固件菜單欄選Target - Read Back你會(huì)看到一組地址范圍選項(xiàng)。如果只是想讀應(yīng)用程序區(qū)默認(rèn)從當(dāng)前 Flash 起點(diǎn)讀到末尾即可工具會(huì)把這部分內(nèi)容加載進(jìn)內(nèi)存窗口。然后File - Save File As保存類型選 Binary.bin或 Intel HEX.hex。我建議保存成 hex 而不是 bin原因在于 hex 自帶地址映射萬(wàn)一你下次想燒錄回去不用再猜起始地址。讀回之后想比對(duì)兩塊板子固件是否相同最簡(jiǎn)單的方式是分別讀兩個(gè)板子的 bin然后用支持二進(jìn)制比對(duì)的編輯工具做 Hash 校驗(yàn)或者逐字節(jié)比對(duì)。有的同事喜歡直接在 Utility 里打開第二個(gè)文件再和內(nèi)存窗口比較但界面比較工作量大了點(diǎn)。實(shí)際操作中我更常用命令行腳本做文件的 MD5 校驗(yàn)產(chǎn)線上不同批次板子的固件一致性驗(yàn)證效率最高。比如讀回固件后對(duì) bin 文件算 MD5和燒錄前的原文件 MD5 比對(duì)不一樣就說(shuō)明 Flash 里被改動(dòng)過。還有一個(gè)使用細(xì)節(jié)讀回操作會(huì)暫停 CPU 運(yùn)行如果你的板子上有其他外設(shè)在工作比如電機(jī)正在轉(zhuǎn)、顯示屏正在刷新Flash 讀回期間 CPU 突然停止可能導(dǎo)致外設(shè)輸出錯(cuò)誤狀態(tài)。遇到類似在線讀回場(chǎng)景務(wù)必把設(shè)備斷電、進(jìn)入待機(jī)狀態(tài)再做。3.3 全片擦除與選項(xiàng)字節(jié)管理擦除操作在Target - Erase Bulk。點(diǎn)擊后工具會(huì)彈出一個(gè)確認(rèn)框提示整個(gè) Flash 將會(huì)被擦除確認(rèn)后開始。這個(gè)操作會(huì)清空所有扇區(qū)包括你在程序里自己寫入的片內(nèi)配置數(shù)據(jù)、參數(shù)存儲(chǔ)區(qū)。因此全片擦除和全片讀回一樣做之前先確認(rèn)數(shù)據(jù)已經(jīng)備份。選項(xiàng)字節(jié)窗口在Target - Option Bytes打開后能看到幾組關(guān)鍵配置讀保護(hù)級(jí)別RDP0 是關(guān)閉保護(hù)1 是禁止從調(diào)試接口讀取 Flash2 是最高保護(hù)且永久生效。寫保護(hù)WRP按扇區(qū)勾選勾中的扇區(qū)無(wú)法通過調(diào)試接口和用戶程序?qū)懭???撮T狗強(qiáng)制選項(xiàng)某些應(yīng)用需要開啟硬件看門狗無(wú)法關(guān)閉。啟動(dòng)配置BOOT部分系列支持設(shè)置 boot 地址。最危險(xiǎn)的坑在這里把 RDP 從 1 改成 0 會(huì)導(dǎo)致整片 Flash 被自動(dòng)擦除這是芯片保護(hù)機(jī)制規(guī)定的不是工具 bug。也就是說(shuō)用 Utility 給一臺(tái)設(shè)置了讀保護(hù)的設(shè)備解除保護(hù)時(shí)固件和 Flash 里的所有數(shù)據(jù)會(huì)一并清空。產(chǎn)線返修時(shí)經(jīng)常有同事以為只是修改選項(xiàng)字節(jié)結(jié)果改完才發(fā)現(xiàn)板子成空片了。所以給帶保護(hù)的設(shè)備解鎖前務(wù)必先確認(rèn)固件已經(jīng)備份或者在解除保護(hù)后立刻重新燒錄。另外RDP 一旦設(shè)為級(jí)別 2調(diào)試接口將被永久鎖定再也無(wú)法連接這種情況任何軟件都救不回來(lái)只能更換芯片。所以選項(xiàng)字節(jié)窗口里設(shè)置 RDP 時(shí)一定要想清楚。3.4 外部 Flash 燒錄補(bǔ)充場(chǎng)景需要操作外部 SPI NOR Flash 時(shí)比如程序里有一個(gè)存儲(chǔ)字庫(kù)、圖片、日志的外部 Flash 芯片它掛在 STM32 的 SPI 接口上而你想在量產(chǎn)前直接把字庫(kù)燒進(jìn)去。Utility 的External Memory Programming功能可以配合目標(biāo)板上的引腳映射通過 STM32 的 SPI 接口對(duì)外部 Flash 編程。這個(gè)功能在不同系列上的支持程度不一舊工具對(duì) F1/F4 支持相對(duì)完整。這個(gè)功能的配置比較繁瑣需要在External Memory Loader里選擇與芯片匹配的 loader 文件loader 負(fù)責(zé)通過特定引腳組合收發(fā) SPI 信號(hào)。實(shí)際操作中如果你只是小批量燒錄我建議直接在程序里寫一段 IAP 邏輯把字庫(kù)作為固件的一部分放在片內(nèi) Flash 末尾然后由程序啟動(dòng)時(shí)搬運(yùn)到外部 Flash比折騰 External Loader 省心得多。只有當(dāng)產(chǎn)量大、需要純硬件操作時(shí)才值得花時(shí)間研究工具的外擴(kuò)燒錄功能。3.5 給 ST-LINK 硬件本身升級(jí)固件如果你插上 ST-LINK 后Utility 頂部狀態(tài)欄一直提示ST-LINK firmware outdated或者連接過程中頻繁斷連很可能是硬件固件版本過舊。打開ST-LINK Upgrade先點(diǎn) “Device Connect” 讓它識(shí)別硬件再點(diǎn) “Yes” 進(jìn)入升級(jí)模式然后 “Upgrade” 開始刷寫。升級(jí)過程中絕對(duì)不要斷開 USB也不要拔掉目標(biāo)板連接否則變磚風(fēng)險(xiǎn)不低。升級(jí)完需要重新插拔一次 USB確認(rèn)固件版本號(hào)已變化。這個(gè)操作建議每隔半年做一次ST-LINK 硬件固件更新通常是為了兼容新推出的芯片型號(hào)和修正通訊穩(wěn)定性不更新會(huì)嚴(yán)重影響新芯片的連接成功率。4. 命令行模式批量燒錄與產(chǎn)線自動(dòng)化的精髓4.1 ST-LINK_CLI 的關(guān)鍵參數(shù)ST-LINK Utility 的命令行程序叫ST-LINK_CLI.exe位于安裝目錄下。它支持的參數(shù)和圖形界面幾乎一一對(duì)應(yīng)。核心用法ST-LINK_CLI.exe -c SWD UR -p 固件.hex -v分解一下-c SWD UR連接配置。SWD指定使用 SWD 協(xié)議UR表示連接 USB 接口的 ST-LINK通用的-c指令模式。-p 固件.hex編程文件名。支持 hex 和 binbin 文件需要額外的起始地址參數(shù)比如-p data.bin 0x08000000。注意 bin 后面跟的是十六進(jìn)制地址不能帶0x前綴實(shí)際工具要求帶0x直接寫0x08000000即可。-v燒錄后執(zhí)行校驗(yàn)。沒有這個(gè)參數(shù)燒錄完不讀回比對(duì)產(chǎn)線如果開了省這一步出問題的概率大增。校驗(yàn)帶來(lái)的時(shí)間開銷很小但價(jià)值巨大量產(chǎn)腳本里必須帶上。常用的其他參數(shù)還包括-me全片擦除。-r8 起始地址 長(zhǎng)度 文件名按字節(jié)讀回 Flash 范圍并存成 bin 文件。比如-r8 0x08000000 0x10000 dump.bin表示從 0x08000000 開始讀 0x10000 字節(jié)保存為 dump.bin。-a 起始地址為 bin 文件指定編程起始地址。-NoRst編程后不復(fù)位芯片有些板子復(fù)位電路異常時(shí)可以用這個(gè)參數(shù)臨時(shí)繞過問題。4.2 用批處理寫一個(gè)簡(jiǎn)易產(chǎn)線燒錄腳本批量燒錄場(chǎng)景帶寬和工位電腦性能有限用圖形界面一個(gè)個(gè)點(diǎn)比腳本效率低太多。下面這個(gè)批處理是我在產(chǎn)線常用的一個(gè)模板配合 hex 文件即可跑起來(lái)echo off set HEX_FILEapp.hex echo 正在連接 ST-LINK... ST-LINK_CLI.exe -c SWD UR if errorlevel 1 goto ERR_CONNECT echo 正在全片擦除... ST-LINK_CLI.exe -c SWD UR -me echo 正在燒錄固件并校驗(yàn)... ST-LINK_CLI.exe -c SWD UR -p %HEX_FILE% -v if errorlevel 1 goto ERR_FLASH echo 燒錄成功 pause exit /b 0 :ERR_CONNECT echo 連接失敗請(qǐng)檢查 ST-LINK 和目標(biāo)板連接 pause exit /b 1 :ERR_FLASH echo 燒錄失敗請(qǐng)檢查固件文件和芯片狀態(tài) pause exit /b 1這里有三個(gè)重要的迭代心得第一每次操作前都做一次連接檢測(cè)。不要一上來(lái)就燒錄因?yàn)榕繜洉r(shí)接觸不良、目標(biāo)板供電不穩(wěn)是常態(tài)提前探測(cè)能省掉大量返工。腳本里如果檢測(cè)失敗就停下來(lái)讓操作員人工檢查比自動(dòng)重試更安全避免反復(fù)燒錄損壞 Flash 壽命。第二整片擦除 燒錄 校驗(yàn)是黃金三板斧。量產(chǎn)環(huán)節(jié)不要為了省時(shí)間省略校驗(yàn)燒錄進(jìn)去之后芯片跑起來(lái)是否正?;蚩梢酝ㄟ^上電自檢判斷但 Flash 內(nèi)容是否完整只能靠逐字節(jié)比對(duì)這一步是質(zhì)量底線。第三腳本路徑和文件編碼一定要注意。批處理文件如果包含中文路徑務(wù)必存成 ANSI 編碼否則在 UTF-8 的 Windows 上會(huì)亂碼報(bào)錯(cuò)。最簡(jiǎn)單的方式是路徑全英文腳本里也不寫中文只在回顯信息上用英文。產(chǎn)線操作員看到的一律是燒錄成功/失敗不需要保持中文。4.3 讀回腳本和校驗(yàn)技巧有時(shí)產(chǎn)線需要抽檢已經(jīng)燒錄的板子下面的腳本會(huì)讀回前 64KB 固件區(qū)并算 MD5ST-LINK_CLI.exe -c SWD UR -r8 0x08000000 0x10000 check.bin certutil -hashfile check.bin MD5 certutil -hashfile app.hex MD5注意app.hex 是十六進(jìn)制格式直接算 MD5 和 bin 不一樣。要對(duì)比需要把原始固件也轉(zhuǎn)成 bin可以用 Utility 圖形界面打開 hex 后另存為 bin或者用 hex2bin 小工具。讀回的 check.bin 才是純二進(jìn)制和原始固件的 bin 版本做 MD5 比對(duì)才有意義。這部分細(xì)節(jié)雖然小但足以讓不熟悉文件格式差異的同事卡殼半天。命令行模式的能力邊界在這里它不能處理需要圖形交互的錯(cuò)誤恢復(fù)流程比如芯片讀保護(hù)級(jí)別異常導(dǎo)致連接失敗時(shí)腳本只能報(bào)錯(cuò)無(wú)法自動(dòng)進(jìn)入特殊恢復(fù)流程。產(chǎn)線方案要把這些特殊分支留給人工處理腳本只覆蓋“健康板子”的標(biāo)準(zhǔn)流程。5. 連接失敗的排查清單從現(xiàn)象到根因5.1 連接不上按照這個(gè)順序試連接失敗是最折磨人的問題。我把常見原因按照概率高低整理成一個(gè)排查順序純操作經(jīng)驗(yàn)不按手冊(cè)順序步驟檢查項(xiàng)成功率提升點(diǎn)1目標(biāo)板供電電壓正常嗎萬(wàn)用表測(cè) VDD 和 GND別默認(rèn)“上電了”就是“供好電了”2SWDIO/SWCLK/GND 三根線接對(duì)了嗎示波器或萬(wàn)用表測(cè) SWDIO 引腳是否有邊沿變化3芯片復(fù)位引腳有沒有被外部拉低復(fù)位 IC 故障或手動(dòng)復(fù)位按鍵卡死都會(huì)導(dǎo)致連接失敗4目標(biāo)板有沒有獨(dú)立供電地和 ST-LINK 共地了嗎共地是 SWD 通訊成功的前提5芯片是否上電后立刻進(jìn)入低功耗模式低功耗模式下調(diào)試接口可能已經(jīng)關(guān)閉需在復(fù)位期間連接6有沒有其他程序占用 ST-LINK 的 USB 口關(guān)閉所有 IDE 調(diào)試會(huì)話只留 Utility 一個(gè)主人7芯片的 SWD 引腳是否被復(fù)用成了普通 GPIO使用連接時(shí)按住復(fù)位鍵再點(diǎn) Connect 的騷操作8芯片是否被設(shè)置了讀保護(hù) RDP 級(jí)別 1/2級(jí)別 1 可用全片擦除解除級(jí)別 2 只能換芯片其中第 7 條和第 8 條是嵌入式開發(fā)特有的高發(fā)問題。SWD 引腳被復(fù)用通常發(fā)生在程序初始化階段把 PA13/PA14對(duì)應(yīng) SWDIO/SWCLK設(shè)置為普通輸出。這里有個(gè)我用得最多的“連接期間復(fù)位”操作在連接對(duì)話框中把連接速度降到最慢然后在點(diǎn)擊 Connect 的同時(shí)按住目標(biāo)板復(fù)位按鍵保持復(fù)位狀態(tài)下連接再松開復(fù)位讓程序還沒來(lái)得及執(zhí)行引腳復(fù)用代碼時(shí)就被調(diào)試器接管。具體到 Utility 界面它沒有像 IAR 那樣提供專門的 connect-under-reset 勾選項(xiàng)但你可以通過調(diào)整連接時(shí)序和復(fù)位操作達(dá)到類似效果。實(shí)際操作是先在Target - Settings里把頻率調(diào)低到幾百 kHz然后 按住板子復(fù)位鍵 - 點(diǎn)擊 Connect - 松開復(fù)位鍵成功率很高。5.2 寫保護(hù)、讀保護(hù)和死鎖恢復(fù)“燒錄時(shí)提示Cannot program the memory” 是最常見的下載失敗彈窗。絕大多數(shù)情況是芯片被設(shè)置了寫保護(hù)或者之前的燒錄中斷導(dǎo)致 Flash 處于鎖定狀態(tài)?;謴?fù)方法分兩步第一步打開Target - Option Bytes查看寫保護(hù)扇區(qū)是否打了勾。如果打了取消勾選點(diǎn)擊 Apply。這里注意修改寫保護(hù)本身會(huì)先執(zhí)行一次全片擦除所以寫保護(hù)的解除動(dòng)作會(huì)清掉固件屬于正常行為不是工具抽風(fēng)。第二步如果解除寫保護(hù)后仍報(bào)告無(wú)法編程執(zhí)行一次 全片擦除再不行就檢查電源穩(wěn)定性。Flash 燒錄瞬間電流消耗比運(yùn)行大劣質(zhì) USB 口或壓降明顯的杜邦線會(huì)導(dǎo)致寫操作期間電壓跌落工具表現(xiàn)為編程中途失敗。讀保護(hù)解除的恢復(fù)邏輯比較特殊如果你遇到Read protection enabled這類提示首先確認(rèn)芯片當(dāng)前是可以被識(shí)別的。識(shí)別得到的情況下執(zhí)行 全片擦除 會(huì)自動(dòng)清除 RDP 級(jí)別 1芯片恢復(fù)可讀可寫狀態(tài)。本質(zhì)原因是芯片底層把 RDP 降級(jí)和全片擦除綁定在一起防止通過調(diào)試口暴力破解固件。級(jí)別 2 則不同它一旦被設(shè)置芯片將永久禁止調(diào)試接口訪問任何軟件都無(wú)法再連接只有通過修改芯片本身才能解鎖——但那是另一個(gè)話題普通開發(fā)者直接換新芯片即可。5.3 選項(xiàng)字節(jié)被改亂后的自救流程有人不小心把選項(xiàng)字節(jié)里的 BOR掉電復(fù)位門檻設(shè)成了過高的值導(dǎo)致芯片一上電就鎖死代碼還沒跑就被復(fù)位反復(fù)復(fù)位循環(huán)根本連不上。這種狀態(tài)不要以為只能換芯片還有一個(gè)技巧先把外部高速時(shí)鐘或內(nèi)部時(shí)鐘的啟動(dòng)配置暫時(shí)改到 RAM 啟動(dòng)模式BOOT 引腳或選項(xiàng)字節(jié)里的 BOOT 配置。然后連接調(diào)試器因?yàn)?RAM 不需要擦除芯片可以從 RAM 區(qū)域啟動(dòng)CPU 跑一個(gè)簡(jiǎn)單循環(huán)調(diào)試接口就能正常連接。連接上之后再恢復(fù)正常啟動(dòng)模式重新燒錄。不過這招在不同的 STM32 系列上操作略有差異部分新系列在選項(xiàng)字節(jié)完全損壞時(shí)這個(gè)辦法也受限真到了那一步只能靠 ISP 模式如果有的話恢復(fù)?;謴?fù)選項(xiàng)字節(jié)的最穩(wěn)妥操作是在Target - Option Bytes里把 RDP 級(jí)別恢復(fù)到默認(rèn) 0、WRP 全部取消勾選、BOR 恢復(fù)默認(rèn)值然后點(diǎn)擊 Apply。工具會(huì)一次性重新編程所有選項(xiàng)字節(jié)并觸發(fā)芯片復(fù)位。做這個(gè)操作之前務(wù)必拍下原來(lái)的選項(xiàng)字節(jié)配置方便恢復(fù)到生產(chǎn)狀態(tài)。寫在最后的經(jīng)驗(yàn)說(shuō)了這么多最后還是想啰嗦一句ST-LINK Utility 這類工具真正好用不是因?yàn)榘粹o多、界面炫而是因?yàn)樗鼘?duì) Flash 操作的“可視”和“可控”程度高。很多工程師習(xí)慣把一切交給 IDE遇到問題反而不明所以用 Utility 做幾次全片擦除、讀回、比對(duì)之后你會(huì)對(duì)芯片的存儲(chǔ)結(jié)構(gòu)、保護(hù)機(jī)制、啟動(dòng)流程有更深的理解。每次我?guī)托氯伺挪榘遄佣紩?huì)從連接時(shí)序、電源、讀保護(hù)這三個(gè)維度入手這套思路就是從這個(gè)工具上學(xué)來(lái)的。量產(chǎn)腳本里現(xiàn)在還在跑著 ST-LINK_CLI 的批處理每次看到它穩(wěn)定輸出 “Programming” 和 “Verification” 成功心里都很踏實(shí)。你要是手邊正好有一塊 STM32 板子不妨試著用它讀一次 Flash再寫一次 Flash看完這個(gè)過程你對(duì)“下載程序”這四個(gè)字的理解會(huì)完全不同。