問題長什麼樣
要把程式寫進一顆微控制器,需要一台「燒錄器」(也叫除錯探針)。 我們手上只有一台原廠的,而三塊板子要同時出借,就少了兩台。
桌上其實還有兩塊別的開發板,每一塊上面都內建了一台燒錄器 ——那是它們用來燒自己的。問題是:那些燒錄器是另一家廠商做的, 而那家廠商的軟體只認自家的晶片。
所以直覺的結論是「那兩台不能用」。我們就是這樣認定的,然後開始繞遠路。
關鍵的分層:誰決定「支援哪些晶片」
整條鏈其實有三層,而大部分人(包括我們)一開始都把它想成一層:
| 層 | 做什麼 | 知道對面是什麼晶片嗎 |
|---|---|---|
| 電腦上的軟體 | 知道「這顆晶片的記憶體怎麼抹、怎麼寫」 | 知道 |
| 燒錄器韌體 | 只負責把訊號打出去 | 不知道,也不需要知道 |
| 目標晶片 | 被寫入的那一顆 | — |
「支援哪些晶片」是第一層決定的,不是燒錄器決定的。 廠商的軟體拒絕非自家晶片,那是一條商業上的規則, 不是硬體上的限制——中間那層根本沒有能力分辨。
換句話說:換掉電腦上的軟體,那台燒錄器就能燒別家的晶片。 而開源的替代軟體本來就存在,也本來就支援我們那顆晶片。
實際要做的只有三件事
一、把燒錄器跟它自己的晶片斷開
那些開發板出廠時,內建燒錄器是接到板子自己的晶片上的。 要拿它去燒別的東西,得先把這個連接拔掉——通常是兩個跳線帽, 拔掉之後燒錄器就會改走板邊的除錯接頭。
這件事一定要查手冊。 我們憑印象給了一次指示, 結果是對的;後來自己懷疑又改口,那次才是錯的。 兩次都可以用同一個動作解決:把手冊打開。
二、換掉電腦上的驅動程式
廠商的驅動只讓自家軟體使用那台燒錄器。換成通用的驅動之後, 開源工具才叫得動它。這一步只改電腦上的設定,不動硬體、不寫任何東西進去,隨時可以還原。
要注意的是:那台燒錄器對電腦來說其實是三個裝置合在一起 (除錯、隨身碟、序列埠)。只換「除錯」那一個,另外兩個維持原狀, 原本的用法就都不會壞。
三、換成開源的燒錄軟體
開源工具靠「晶片描述檔」知道每顆晶片怎麼燒,而那些描述檔是各家原廠自己發布的。 我們那顆晶片的描述檔早就在官方套件裡,而且電腦上已經裝好了。
最貴的一課:讀得到,不代表讀的是你以為的東西
接好線之後,第一次讀取成功了,我們當場宣布「瓶頸解除」。 那是假的。
第一步的跳線帽根本沒拔掉(把板上印的編號看錯了一個字), 所以燒錄器還連在它自己的晶片上——我們讀到的是那塊板子自己,不是目標。
而線索早就在讀數裡:讀回來的那個數字,正好是那塊板子記憶體的大小, 跟目標晶片對不上。我們前一天才親手寫下過這個判斷範圍,卻沒拿來檢查自己的讀數。
後來怎麼抓到的
換一個工具連線時,它順口印了一行「偵測到的處理器型號」——而那個型號是錯的。 再補讀兩個晶片自報的身分暫存器,才確定接錯了對象。
| 問題 | 答案 |
|---|---|
| 讀得到東西嗎? | 讀得到 ✓ |
| 讀到的是誰? | 錯的晶片 ✗ |
連上之後第一件事,是確認「對面是誰」,不是「讀得到嗎」。 讀得到值只證明有東西在回話。 這條規則的成本,是我們一整個上午。
第二課:工具自己驗不過,不等於寫壞了
同一天遇到兩次,症狀一模一樣,原因完全不同:
| 看到的錯誤 | 真正的原因 |
|---|---|
| 「燒錄程序初始化失敗」 | 拿A 晶片的燒錄程序去跑在 B 晶片上(就是上面那個接錯) |
| 「寫進去的內容跟檔案不符」 | 寫入其實是對的,是工具把資料從錯誤的位置讀回來比對 |
第二個的證據很漂亮:比對出來的差異裡,「期望值」和「實際值」分別是兩支不同程式的起始位址 ——一眼就看得出它讀的是另一個區域,不是寫壞了。
兩次都是靠「換一個獨立的工具再驗一次」分辨出來的。 這也是為什麼最後每一項都用原廠工具再驗一遍: 寫的人和驗的人,不要是同一個。
結果
| 項目 | 之前 | 之後 |
|---|---|---|
| 可用的燒錄器 | 1 台 | 3 台 |
| 要花的錢 | — | 0 元(都是本來就有的) |
| 要動的硬體 | — | 只有兩個跳線帽 |
而先前為了解這個問題所做的——拆開一支壞掉的除錯器、解開它的保護、 量出腳位、移植兩套韌體——全部都不需要了。
那些工作本身沒有白費(過程與量到的事實都留著), 但它們解的是一個其實不存在的問題。
可以帶走的三句話
- 「不支援」有時是商業規則,不是物理限制。 先分清楚這件事卡在哪一層,再決定要不要繞路。
- 連上之後先確認「對面是誰」。 讀得到值只證明有東西在回話,不證明那是你要的東西。
- 寫的人和驗的人不要是同一個。 工具自己說「成功」或「失敗」,都要有第二個來源。
老實說的限制
- 開源工具不是全都能做。 實測下來,它能寫主程式區、 也能改晶片的設定區,但其中一個區域它讀不回來自我驗證—— 那一項只能靠原廠工具確認。能力邊界是量出來的,不是假設的。
- 換驅動之後,那家廠商的官方軟體可能就認不到那台燒錄器了。 我們不用那些軟體所以無所謂;要用的人得換回去。
- 晶片的設定區要「先讀再寫」。 那種記憶體只能把 1 變成 0,不能反過來。直接套用別塊板子的設定值, 可能會要求做不到的事,或連帶清掉你不知道用途的設定。
- 這條路省下的是錢和時間,不是知識。 真正讓我們敢換掉整層軟體的,是先搞清楚了「哪一層決定支援哪些晶片」。