UART 搬 byte
只負責把 0 和 1 依時間送過線;它不知道這是不是韌體,也不知道要寫去哪。
2026.09.15 · N2 / 已實測
LAB RESULT / N2 COMPLETE
真實韌體從 PC 經 UART0 進入 master,沿 SWD 抹除、寫入、逐 word 驗證,再讓 target 重新開機。桌上不需要 Nuvoton 工具。
01 / MENTAL MODEL
只負責把 0 和 1 依時間送過線;它不知道這是不是韌體,也不知道要寫去哪。
W、位址、長度、CRC 與 ACK 把 byte 變成「寫這一塊,而且知道有沒有收對」。
master 經 Debug Port / MEM-AP 停住核心,仍可讀寫 target 的記憶體與周邊暫存器。
抹頁、寫 word、回讀;最後 reset,CPU 才從新向量表建立一次乾淨的開機。
讀完這頁,你應該能回答:資料怎麼到 target?誰真正改了 flash?CRC、回讀、LED 各自證明到哪一層?為什麼燒完一定要 Reset?
02 / THE EVIDENCE CHAIN
方法:回讀一致只能證明位元組寫對;LED 在 reset 後閃爍,才同時驗證向量表、初始 SP、reset handler 與程式確實執行。
03 / WIRING MAP
板上沒有 USB–UART 橋接晶片。TX/RX 必須交叉,邏輯電平使用 3.3 V。
目標板若還接著 Nu-Link,先整組拔掉;兩個 master 不能同時驅動同一條 SWD 匯流排。
原描圖:TX=PB.2 / RX=PB.1 → 已否證。
實板 echo 定案為 TX=PB.1 / RX=PB.0;浮空 RX 會產生假位元組,計數增加不等於內容正確。
04 / PACKET WORKBENCH
封包總長 521 byte · 線上約 45.2 ms
K 只能在 LCD 更新等工作都結束後送出;它的語義是「我已經準備好收下一塊」。
1 個 start bit + 8 個 data bit + 1 個 stop bit。115200 baud 的有效上限是 11,520 byte/s,不是 115,200 byte/s。
它能高機率抓到傳輸途中改變的 bit;不能證明檔案可信、程式正確,也不是密碼學簽章。
多 byte 整數先送最低有效 byte。位址 0x00000200 在線上依序是 00 02 00 00。
05 / VALIDATION LADDER
06 / FAILURE ATLAS
舊版 kp_scan() 一次阻塞 7–8 ms;新版 kp_poll() 每次只取樣一列、靠時間戳等下次再做,單次數十 µs。
CPU 站在迴圈裡等時間過去,期間主迴圈不能處理 UART。功能正確,不代表系統能同時做兩件事。
把「等待」改成記住目前狀態,立即返回;下一輪到時間再繼續。總時間沒消失,但 CPU 不再被綁住。
掃描已非阻塞;按鍵觸發的重連 SWD、重畫 LCD 仍很慢,所以動作只在 UART 靜置約 50 ms 後執行。
07 / NO SINGLE POINT OF FAILURE
CLICK A BOARD
四種組合已實測:C3→C1、C1→C3、C1→C2、C2→C3。Nu-Link 從桌上拔掉後,鏈路仍成立。
讀目標前 1 KB 與已知 .bin 比對,確認接線方向與板子身份;燒完再用可見行為驗收。
security lock 晶片的救援方式。工具刻意不提供 CONFIG 寫入或 chip erase,不能宣稱已解決。
08 / BENCH CARD
# 1. 先認板並備份
.\isp_send.ps1 -Port COMx `
-Dump backup.bin
# 2. 未解保險,跑 dry run
.\isp_send.ps1 -Port COMx `
-File build\blink\blink.bin
# 3. 按 0 → ARMED;清空舊尾巴再燒
.\isp_send.ps1 -Port COMx `
-EraseAll -File build\blink\blink.bin
# 4. 從向量表重新開機
.\isp_send.ps1 -Port COMx -Reset0 / 7 項已確認 尚未可寫
FINAL CHECK
選擇一個答案。