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