
做硬件這幾年燒錄芯片算是既基礎(chǔ)又最容易讓人血壓升高的一關(guān)。明明是照著原理圖接的線按著手冊寫的配置結(jié)果點擊燒錄按鈕之后不是報No target connected就是卡在Timeout communicating with target再要么就是校驗失敗、擦除失敗甚至把芯片直接搞到鎖死。我統(tǒng)計過自己手上經(jīng)手過的項目新板子第一次燒錄的成功率大概只有七成左右剩下三成基本都死在這幾類典型問題上。這篇就把我這些年反復(fù)踩過的坑、排過的錯整理出來圍繞“燒錄芯片常見錯誤”這個主題講清楚五大類高頻故障的根本原因、排查方法和解決步驟。不管是剛?cè)腴T的學(xué)習(xí)者還是已經(jīng)有幾年經(jīng)驗的工程師照著這篇的思路走一遍大部分燒錄失敗問題都能定位到根上。1. 供電不穩(wěn)藏在接線后頭的第一殺手1.1 為什么供電問題總是最先被忽略燒錄報錯的時候絕大多數(shù)人的第一反應(yīng)是檢查接線、換燒錄器、重裝驅(qū)動很少有人會先拿萬用表去量目標(biāo)板的核心電壓。但根據(jù)我過去的經(jīng)驗燒錄失敗里至少有三分之一根子就出在供電上。芯片燒錄對供電的紋波要求其實比正常運(yùn)行要高。燒錄器通過調(diào)試接口往芯片里寫Flash時芯片內(nèi)部的電荷泵和高壓發(fā)生器會瞬間拉高電流需求如果供電能力不夠或者電源紋波太大燒錄時序就會被打亂。一個典型場景是用電腦USB口直接給目標(biāo)板供電又同時掛了燒錄器、傳感器、屏幕USB口電流一超電壓從5V掉到4.6V板子上的LDO輸出跟著塌芯片進(jìn)入欠壓復(fù)位燒錄自然失敗。還有一個容易被忽略的點是共地。燒錄器和目標(biāo)板必須共地如果兩個地之間有電位差哪怕只有0.5VSWD或者ISP的時序就完全亂了。我遇到過不少次燒錄器插著電腦USB目標(biāo)板用獨(dú)立的電源適配器供電兩邊看起來都沒問題但就是連不上芯片最后量了一下發(fā)現(xiàn)兩個地之間居然有1.2V的壓差把地線單獨(dú)接上之后問題立刻消失。1.2 具體排查步驟與解決措施針對供電問題我的排查順序是固定的一步步來基本不會漏先拿萬用表量目標(biāo)板電源引腳的對地電壓確認(rèn)數(shù)值在芯片數(shù)據(jù)手冊規(guī)定的范圍內(nèi)比如STM32F103是2.0V到3.6V如果量出來只有2.7V那大概率是LDO選型不對或者輸入電壓不夠。再看燒錄器是否帶目標(biāo)板供電功能。很多燒錄器比如常見的CMSIS-DAP、J-Link的VTref引腳會檢測目標(biāo)板電壓如果這個引腳懸空或者電壓不對燒錄器會直接報錯根本不會開始燒錄。這種情況接上目標(biāo)板的3.3V到VTref即可。用示波器看電源紋波要求峰值紋波在芯片正常工作范圍內(nèi)一般控制在50mV以內(nèi)比較穩(wěn)。如果紋波大在電源輸出端并聯(lián)一個10uF鉭電容加0.1uF陶瓷電容。檢查燒錄器能力是不是夠。普通的ST-Link給目標(biāo)板供電最多也就幾百毫安如果板子上還有電機(jī)、無線模塊這種大電流設(shè)備務(wù)必用外部電源供電并把燒錄器設(shè)成不供電模式。注意部分芯片在燒錄時要求先上電后連接調(diào)試器或者反過來先接調(diào)試器再上電這個順序在數(shù)據(jù)手冊里會有明確說明。比如老款的AVR芯片如果先給芯片上電再接SPI編程器有時會識別不到正確做法是編程器先占用SPI引腳再給芯片上電。2. 接線錯誤看著簡單翻車最多2.1 燒錄接口的線序與信號完整性如果說供電是暗坑那接線錯誤就是明坑坑得明明白白但你還是會踩。尤其是現(xiàn)在很多開發(fā)板把燒錄接口做成了2.54mm排針沒有防呆設(shè)計插反、錯位、漏接都是常事。以最常見的SWD接口為例標(biāo)準(zhǔn)四線是SWDIO數(shù)據(jù)、SWCLK時鐘、GND、VTref參考電壓。但不同板子上的排針排列順序并不統(tǒng)一有的把電源放左邊有的放右邊有的中間插了一根RESET或者SWO。最穩(wěn)的做法就是別憑記憶插線每次拿到新板子先用萬用表通斷檔找到GND和電源引腳再對照原理圖把SWDIO和SWCLK對號入座。接線長度和線材質(zhì)量也要提一嘴。SWD的時鐘頻率如果跑到10MHz以上十幾厘米的杜邦線就開始有明顯信號反射了。我自己實測過20cm杜邦線在8MHz時還能勉強(qiáng)工作提到10MHz穩(wěn)定性和出錯率就明顯變差。解決辦法有兩個方向一是把SWCLK頻率降下來比如ST-Link在Keil里把Max Clock改成1MHz肯定能通二是換屏蔽線或者直接縮短線纜長度。2.2 用邏輯分析儀抓波形來斷言時序好壞有些老手會跟你說“接線沒問題”但問題恰恰出在接觸不良上。面包板用久了彈片氧化杜邦線插頭松了排針虛焊這種“軟故障”用肉眼完全看不出來量通斷也未必量得出來因為靜態(tài)是通的一碰就斷。我的排查方法是在燒錄器跟目標(biāo)板之間串一個邏輯分析儀抓SWCLK和SWDIO的波形。正常燒錄時能清楚看到時鐘連續(xù)翻轉(zhuǎn)、數(shù)據(jù)線上有規(guī)律的位流。如果波形上時鐘有毛刺、數(shù)據(jù)線長時間拉高沒有任何動作那基本可以斷定接觸不良或者線序反了。這個方法在排查ISP串口燒錄時同樣好用直接抓TX、RX兩路波形看芯片有沒有回ACK比反復(fù)猜高效得多。提示如果你用的邏輯分析儀采樣率不夠抓高速SWD信號時會看到大量假毛刺。這時候把燒錄時鐘調(diào)到1MHz以下再抓波形會干凈很多足夠判斷連接通斷和線序?qū)﹀e。3. 目標(biāo)芯片沒進(jìn)燒錄模式很多問題其實卡在這一步3.1 Boot模式與復(fù)位時序是燒錄的前置條件供電沒問題、接線也對點了燒錄還是報錯這時候就要考慮芯片是不是真的“愿意”讓你燒了。很多芯片出廠后直接運(yùn)行用戶程序而用戶程序可能把調(diào)試引腳復(fù)用成了GPIO或者把Flash讀保護(hù)打開這時候燒錄器根本連不上。針對這類問題芯片廠商設(shè)計了Boot模式引腳或者燒錄使能時序。用STM32舉例BOOT0引腳拉高后從系統(tǒng)存儲器啟動系統(tǒng)存儲器里的Bootloader會響應(yīng)串口ISP指令但注意STM32的SWD燒錄不受BOOT0影響SWD接口在復(fù)位期間始終有效除非用戶代碼里關(guān)了調(diào)試端口或者開了讀保護(hù)。所以STM32連不上SWD的第一反而不是BOOT0而是檢查是否開了讀保護(hù)。ESP32系列則靠GPIO0和EN引腳的時序配合。進(jìn)入下載模式的要求是GPIO0拉低EN復(fù)位引腳從高到低跳變芯片復(fù)位后進(jìn)入下載模式。很多初學(xué)者只拉低了GPIO0但芯片沒有復(fù)位還是運(yùn)行在舊固件里燒錄自然失敗。Espressif官方的燒錄工具會在連接時自動控制DTR和RTS來切換復(fù)位時序如果你用第三方工具或者手動接線燒錄就需要自己搞定這兩根線。AVR芯片的ISP燒錄則是靠SPI使能時序。芯片上電后在SPI時鐘線SCK上產(chǎn)生至少6個上升沿且此時RESET引腳保持低電平芯片才會進(jìn)入編程模式。如果RESET沒有被拉低或者SCK上沒有脈沖芯片就直接跑用戶程序了編程器自然無響應(yīng)。3.2 各類芯片進(jìn)入燒錄模式的對照速查表為了方便查閱我把常見芯片平臺的燒錄模式進(jìn)入條件整理成了一張表芯片平臺燒錄接口進(jìn)入燒錄模式的條件最常見失敗原因STM32SWDSWDIO/SWCLK接口復(fù)位后穩(wěn)定連接需關(guān)閉RDP讀保護(hù)代碼里關(guān)了調(diào)試端口、開了讀保護(hù)STM32串口ISPUSART1/2/3BOOT01復(fù)位后進(jìn)入BootloaderBOOT0沒拉高、復(fù)位時序沒觸發(fā)ESP32UART0下載GPIO00EN上升沿復(fù)位GPIO0電平不穩(wěn)、沒有復(fù)位脈沖ESP8266UART0下載GPIO00RST復(fù)位同上外加上電瞬間GPIO0被拉高AVR經(jīng)典系列SPI ISPRESET拉低SCK六個上升沿RESET浮空、外部電容影響時序STC89系列串口ISP冷啟動斷電再上電沒有冷啟動只是點了軟件燒錄NXP LPCISP/UARTPIO拉低后復(fù)位進(jìn)入ISP引腳電平狀態(tài)不對、復(fù)位時序錯誤Microchip PICICSP上電時序VDD先上電MCLR拉高M(jìn)CLR電壓不夠高、編程時鐘過快這張表是我在實際項目里反復(fù)驗證過的對應(yīng)的“最常見失敗原因”一欄基本覆蓋了90%以上的實際故障場景。3.3 不復(fù)位直接跑飛用戶代碼把調(diào)試口占用的問題還有一個高頻場景尤其在做低功耗或者引腳資源緊張的項目時特別常見用戶在初始化代碼里把SWD引腳重映射成了GPIO一下載完程序板子就再也連不上了。這種情況不是芯片壞了而是沒有調(diào)試通道讓你擦除Flash。解決思路是“先發(fā)制人”第一版固件里永遠(yuǎn)保留SWD引腳功能等所有功能調(diào)完、量產(chǎn)前再考慮引腳復(fù)用。如果已經(jīng)踩了坑板子連不上調(diào)試器了就用串口ISP方式擦除整片F(xiàn)lash把讀保護(hù)和引腳復(fù)用狀態(tài)清掉再用SWD燒錄正常固件。拿STM32舉一個實測可用的串口ISP擦除流程BOOT0接3.3V用USB轉(zhuǎn)TTL接USART1的TX/RX打開STM32CubeProgrammer選UART模式連接后先執(zhí)行Full chip erase然后斷開BOOT0恢復(fù)低電平重新上電芯片就能用SWD正常連接了。4. 軟件與驅(qū)動配置型號、速度、固件一個都不能錯4.1 芯片型號選錯的隱蔽代價硬件都正常了剩下的問題基本都藏在軟件配置里。第一個坑就是芯片型號選錯。很多燒錄工具會根據(jù)型號自動選擇Flash容量、頁大小、算法選錯之后輕則燒錄后校驗失敗重則擦除地址越界把不該動的地方動了。舉一個真實例子同一種封裝下STM32F103C8T6是64KB FlashSTM32F103CBT6是128KB Flash兩者引腳完全兼容。如果板子上是CBT6工具里卻選成C8T6燒錄時會按64KB的算法燒程序超過64KB的直接報錯反過來如果板子上是C8T6工具里選了CBT6燒錄時擦除地址沖到128KB范圍雖然C8T6實際沒有那么多Flash但有些工具會擦到保留區(qū)造成奇怪的異常。排查方法很直接打開燒錄工具或IDE里的設(shè)備選擇列表逐個確認(rèn)封裝的Flash大小、RAM大小、內(nèi)核版本。有時候一個系列的不同型號芯片燒錄算法并不相同選錯就會出現(xiàn)Error: Flash Download failed - Cortex-M3這類報錯。4.2 通信速度與協(xié)議參數(shù)快不一定好通信速度是另一個背著不少鍋的參數(shù)。SWD接口速度可以設(shè)置得很高但實際能不能跑上去取決于線纜質(zhì)量、目標(biāo)板layout、芯片本身的調(diào)試接口實現(xiàn)。J-Link默認(rèn)的SWD速度經(jīng)常是4MHzST-Link在Keil里默認(rèn)可能是最高頻率這些默認(rèn)值在飛線環(huán)境下經(jīng)常燒錄失敗。我建議的參數(shù)起點是SWD 1MHzSPI ISP 250kHz串口ISP 115200bps。這個速度組合下絕大多數(shù)飛線場景都能穩(wěn)定燒錄。確認(rèn)穩(wěn)定后再逐步往上調(diào)速直到出現(xiàn)錯誤再退回一檔。量產(chǎn)燒錄時可以用更高速度但前提是治具和線纜質(zhì)量穩(wěn)定。另外Intel Hex還是Bin格式的差異也值得注意。Hex文件里帶地址信息燒錄器按地址寫入Bin文件是裸數(shù)據(jù)需要手動指定起始地址。如果工具里默認(rèn)的起始地址不對比如給STM32燒錄時Bin文件被寫到了0x08000000以外的地址芯片上電就跑飛。我習(xí)慣直接用Hex格式地址信息在文件里自帶少一步人肉確認(rèn)。4.3 驅(qū)動與燒錄器固件軟件層面的隱藏地雷驅(qū)動問題常見但不能輕視。CMSIS-DAP類燒錄器在Windows下如果驅(qū)動版本不對設(shè)備管理器里能看到設(shè)備但無法正常工作CH340串口芯片如果裝的是老驅(qū)動在高版本W(wǎng)indows下速率不穩(wěn)會出現(xiàn)連續(xù)校驗錯誤一些仿制J-Link還會因為固件版本太新被識別為盜版直接拒絕工作。這類問題的排查思路是先確認(rèn)操作系統(tǒng)識別到燒錄器設(shè)備再確認(rèn)燒錄工具能枚舉到它最后才是連接目標(biāo)芯片。任何一個環(huán)節(jié)失敗先看設(shè)備管理器再看工具日志。特別提醒拿到新燒錄器第一件事是升級固件很多燒錄失敗是出廠固件自帶的bug導(dǎo)致的升完級之后莫名其妙就穩(wěn)定了。5. 芯片鎖死與加密最難搞也最嚇人的一類問題5.1 讀保護(hù)、加密位與熔絲位到底保護(hù)了什么燒錄失敗里最嚇人的一檔是芯片被鎖死。明明之前還能連上某次燒錄之后突然連不上了而且報錯信息里出現(xiàn)RDP Level 1、Device is read-protected、Target device has been locked之類的話很多人第一反應(yīng)是芯片壞了甚至直接扔了換新片。實際上這是芯片的讀保護(hù)機(jī)制在起作用。STM32的讀保護(hù)RDP分三個等級Level 0關(guān)閉保護(hù)Level 1禁止外部調(diào)試接口讀取FlashLevel 2永久保護(hù)且不可降級。最常見的翻車場景是在CubeMX或燒錄工具里不小心勾選了讀保護(hù)或者固件里的選項字節(jié)被改寫導(dǎo)致芯片暫時無法通過調(diào)試接口訪問。AVR芯片的熔絲位Fuse則是另一種機(jī)制其中RSTDISBL禁用復(fù)位引腳和SPIEN禁用SPI編程都是高危選項。如果誤把SPI編程熔絲位關(guān)掉這片芯片用普通ISP編程器就再也進(jìn)不去了只能靠高壓并行編程器或者JTAG口來解對個人開發(fā)來說相當(dāng)于報廢。5.2 解除鎖定的實操步驟針對STM32的讀保護(hù)鎖定解除方法通常有以下幾步實測可用用STM32CubeProgrammer選擇對應(yīng)的燒錄器連接時如果提示讀保護(hù)選擇Remove read protection選項。工具會彈窗提示“這將擦除整片F(xiàn)lash”確認(rèn)后執(zhí)行。執(zhí)行過程中芯片會做一次整片擦除把Flash里的內(nèi)容和選項字節(jié)全部清掉。斷開連接重新上電此時芯片應(yīng)該恢復(fù)到Level 0可以正常燒錄。步驟看著簡單但有兩點必須提醒第一Level 1讀保護(hù)被移除時必定擦除Flash所以如果里面有量產(chǎn)固件或者校準(zhǔn)數(shù)據(jù)先掂量掂量再操作第二Level 2保護(hù)一旦啟用沒有任何軟件方式能解除芯片直接變磚這個選項在量產(chǎn)工具里一定要禁止客戶勾選。AVR熔絲位解除的難度高一些。如果只是普通熔絲位配錯可以嘗試用高壓并行編程器恢復(fù)默認(rèn)如果手頭沒有高壓編程器只能換芯片。這里強(qiáng)烈建議AVR玩家在排針上預(yù)留高壓編程的接口關(guān)鍵時刻能救回來一片。5.3 防止誤鎖的硬規(guī)矩經(jīng)歷過幾次鎖死后我給自己定了幾條硬規(guī)矩分享出來供參考一切帶保護(hù)位、加密位、熔絲位的燒錄工具第一次用之前先讀一遍當(dāng)前配置截圖存檔。燒錄前默認(rèn)關(guān)閉所有保護(hù)選項除非產(chǎn)品明確要求開啟安全加密。量產(chǎn)用的燒錄腳本或工具配置里禁止勾選“設(shè)置讀保護(hù)”這類選項。開發(fā)階段保留串口ISP或Bootloader作為后門萬一SWD被占用了還能從串口救回來。6. 一套能落地的排查方法論6.1 分治法每次只動一個變量燒錄失敗的問題往往不是單一原因而是多個因素疊加在一起。比如供電不穩(wěn)加線序錯加型號選錯三個問題同時存在那么你只修任何一個都無法解決。所以我更推薦分治法的思路。拿到一個燒錄失敗的問題從最底層開始逐項驗證用萬用表確認(rèn)目標(biāo)板電源電壓正常紋波可接受。確認(rèn)燒錄器能識別到目標(biāo)芯片。以STM32為例在STM32CubeProgrammer的Automatic Mode下可以看到連接的芯片ID如果顯示Unknown或者No device先不燒錄停下來查連接。降低通信速度到保守值再嘗試燒錄一個最小測試程序。一切正常后再逐步恢復(fù)用戶代碼、提高速度、開啟各種功能。每次只動一個變量這樣問題定位才快。很多人燒錄失敗后喜歡同時換線、換燒錄器、換軟件設(shè)置一套組合拳下來問題可能碰巧解決了但根本原因完全沒搞清楚下次換個環(huán)境又炸了。6.2 最小系統(tǒng)驗證法區(qū)分板子問題還是芯片問題還有一個思路值得單獨(dú)拿出來說就是最小系統(tǒng)驗證。遇到死活燒錄不上的板子把目標(biāo)芯片拆下來或者用轉(zhuǎn)接板放到一個已知良好的最小系統(tǒng)板上試燒。如果最小系統(tǒng)板上能正常燒錄說明芯片本身是好的問題出在你的板子電路上如果最小系統(tǒng)板也燒不了可能芯片已經(jīng)被鎖死或者損壞了。這樣做最大的好處是把問題范圍砍掉一半。我之前遇到一塊板子無論怎么調(diào)都燒錄失敗用最小系統(tǒng)板一測芯片完全正常最后發(fā)現(xiàn)是主板上復(fù)位引腳對地電容容值太大導(dǎo)致復(fù)位時序不滿足燒錄器的要求。這個問題在原理圖review階段很難注意到但用最小系統(tǒng)法幾分鐘就能鎖定方向。6.3 用日志驅(qū)動排查而不是靠猜燒錄工具的日志窗口被很多人無視但工程師排查問題日志往往是第一手信息。不同工具的日志詳細(xì)程度不一樣像STM32CubeProgrammer會輸出詳細(xì)的操作過程OpenOCD在-d參數(shù)下會輸出調(diào)試級日志avrdude默認(rèn)就會打印芯片簽名和熔絲位配置。我的習(xí)慣是每次燒錄失敗先把日志復(fù)制出來搜索關(guān)鍵詞??吹絅o target connected和Target connection failed雖然都表示連不上但一個偏物理連接一個偏協(xié)議握手排查方向完全不一樣。養(yǎng)成先看日志再動手的習(xí)慣能省下大量盲猜的時間。7. 常見問題速查表最后放一張我處理過的大量燒錄失敗案例總結(jié)出來的速查表按報錯信息或現(xiàn)象查就行建議保存報錯信息 / 現(xiàn)象首選排查方向次要排查方向備選手段No target connected供電與VTref線序、虛焊換短粗線連接Target connection failed目標(biāo)板復(fù)位電路燒錄速度過高手動復(fù)位再點燒錄Timeout communicating with targetBoot引腳狀態(tài)用戶代碼占用了調(diào)試口串口ISP全片擦除Flash Download failed芯片型號選錯Flash容量/算法不匹配核對ID、換算法Verify failed at address...供電紋波大通信速度過高降速、加電容濾波RDP Level 1 / read-protected讀保護(hù)開啟選項字節(jié)被改寫移除保護(hù)會擦除全片Error: Target device is locked熔絲位被鎖保護(hù)等級過高換芯片或高壓編程器燒錄成功但運(yùn)行異常起始地址錯用戶代碼配置問題核對Hex地址和啟動文件同一批板子部分燒錄失敗生產(chǎn)治具接觸不良芯片批次差異清潔觸點、換彈針一燒就斷連電源驅(qū)動能力不足燒錄器供電過載改外部供電、加大電容這張表里的每一行都對應(yīng)著真實修板子過程中至少一次的經(jīng)驗教訓(xùn)。如果你遇到?jīng)]列進(jìn)去的現(xiàn)象歡迎按第6節(jié)的方法論自己定位一遍大部分問題都能拆出來。8. 如何從根源上降低燒錄失敗率排查做得多了會慢慢發(fā)現(xiàn)一個規(guī)律燒錄失敗這件事真正“難”的問題很少絕大多數(shù)都是基礎(chǔ)問題反復(fù)出現(xiàn)。想從根源上降低失敗率與其每次都靠排查救火不如在設(shè)計階段就做好幾件事。第一是PCB設(shè)計階段把燒錄接口做得足夠皮實。SWD四線全部引到獨(dú)立的2.54mm排針加TVS管保護(hù)串33Ω電阻限制邊沿速率電源引腳旁邊加上100nF和10uF去耦電容復(fù)位引腳加上拉電阻和10nF左右的小電容既保證正常復(fù)位又不至于拖慢燒錄時序。第二是固件里預(yù)留恢復(fù)通道。Bootloader加APP的分區(qū)方案或者至少保留串口ISP引腳能讓你在SWD被用戶代碼干掉之后還有條活路。開發(fā)階段一定不要開讀保護(hù)量產(chǎn)出廠前再統(tǒng)一加密。第三是統(tǒng)一燒錄工具鏈不要一個項目換三種工具。固定的燒錄器、固定的軟件版本、固定的通信速率出了問題才有穩(wěn)定的參照系。我見過團(tuán)隊里A同事用J-Link燒錄沒問題B同事用DAP燒錄就是失敗最后發(fā)現(xiàn)就是速度參數(shù)不一樣浪費(fèi)了大半天。有時候燒錄失敗并不是硬件壞了而是思路太快、排查太慢。慢下來一項項驗證問題很快自己就現(xiàn)形了。