µ NANO130 FIELD NOTE

2026.09.15 · N2 / 已實測

LAB RESULT / N2 COMPLETE

一塊板,
燒另一塊板。

真實韌體從 PC 經 UART0 進入 master,沿 SWD 抹除、寫入、逐 word 驗證,再讓 target 重新開機。桌上不需要 Nuvoton 工具。

最終證據C2 的 LED2 綠燈真的開始閃
沿著證據走一遍
TRANSFER / VERIFIED115200 · 8N1
936 BYTE2 CHUNKS5.2 s
MASTER / C3NANO
130
SWCLKSWDIOGND
TARGET / C2NANO
130
123KB APROM
512BYTE / CHUNK
3塊皆可當燒錄器
0Nu-Link 在線

01 / MENTAL MODEL

先知道自己跨過了
哪四個世界。

01TRANSPORT

UART 搬 byte

只負責把 0 和 1 依時間送過線;它不知道這是不是韌體,也不知道要寫去哪。

02PROTOCOL

封包賦予意思

W、位址、長度、CRC 與 ACK 把 byte 變成「寫這一塊,而且知道有沒有收對」。

03DEBUG ACCESS

SWD 取得控制權

master 經 Debug Port / MEM-AP 停住核心,仍可讀寫 target 的記憶體與周邊暫存器。

04FLASH + BOOT

ISP 改變非揮發記憶體

抹頁、寫 word、回讀;最後 reset,CPU 才從新向量表建立一次乾淨的開機。

讀完這頁,你應該能回答:資料怎麼到 target?誰真正改了 flash?CRC、回讀、LED 各自證明到哪一層?為什麼燒完一定要 Reset?

02 / THE EVIDENCE CHAIN

不是「命令成功」,
而是每一段都留下證據。

方法:回讀一致只能證明位元組寫對;LED 在 reset 後閃爍,才同時驗證向量表、初始 SP、reset handler 與程式確實執行。

03 / WIRING MAP

兩條通道,四個不能接錯的點。

A
PC → MASTER

UART0 / USB–TTL

USB–TTL TXPB.0 / RXD0
USB–TTL RXPB.1 / TXD0
GNDGND
VCC不接;板子自己供電

板上沒有 USB–UART 橋接晶片。TX/RX 必須交叉,邏輯電平使用 3.3 V。

B
MASTER → TARGET

SWD / J17 → J4

J17 pin 3 / PA.8J4 pin 3 / SWCLK
J17 pin 4 / PA.9J4 pin 2 / SWDAT
J17 pin 8 / GNDJ4 pin 4 / GND
nRESETJ4 沒有這支腳

目標板若還接著 Nu-Link,先整組拔掉;兩個 master 不能同時驅動同一條 SWD 匯流排。

ERRATA

原描圖:TX=PB.2 / RX=PB.1 → 已否證。
實板 echo 定案為 TX=PB.1 / RX=PB.0;浮空 RX 會產生假位元組,計數增加不等於內容正確。

04 / PACKET WORKBENCH

512 byte 一塊,
ACK 是節拍器。

W1 BADDR4 B · LELEN2 B · LEDATA512 BCRC162 B

封包總長 521 byte · 線上約 45.2 ms

MASTER 回一個 byte

K 只能在 LCD 更新等工作都結束後送出;它的語義是「我已經準備好收下一塊」。

安全邊界在 master 韌體裡寫入只接受 APROM 0x00000000–0x0001EBFF永遠不設 CFGUENCONFIG 0x00300000 不可寫
8N1 為何要乘 10?

1 個 start bit + 8 個 data bit + 1 個 stop bit。115200 baud 的有效上限是 11,520 byte/s,不是 115,200 byte/s。

CRC 能證明什麼?

它能高機率抓到傳輸途中改變的 bit;不能證明檔案可信、程式正確,也不是密碼學簽章。

Little-endian 是什麼?

多 byte 整數先送最低有效 byte。位址 0x00000200 在線上依序是 00 02 00 00

05 / VALIDATION LADDER

先證明通道,再允許不可逆動作。

06 / FAILURE ATLAS

三個「都沒報錯」的坑。

TIMING DEMO

「等一下」為什麼會吞資料?

舊版 kp_scan() 一次阻塞 7–8 ms;新版 kp_poll() 每次只取樣一列、靠時間戳等下次再做,單次數十 µs。

UART · 45 msFIFO · 1.4 msKEYPAD · 8 ms

Busy-wait

CPU 站在迴圈裡等時間過去,期間主迴圈不能處理 UART。功能正確,不代表系統能同時做兩件事。

非阻塞狀態機

把「等待」改成記住目前狀態,立即返回;下一輪到時間再繼續。總時間沒消失,但 CPU 不再被綁住。

現在的邊界

掃描已非阻塞;按鍵觸發的重連 SWD、重畫 LCD 仍很慢,所以動作只在 UART 靜置約 50 ms 後執行。

07 / NO SINGLE POINT OF FAILURE

三塊板,任兩塊可以互救。

C1 C2 C3 互燒路線
4組方向
實測通過

CLICK A BOARD

三板都跑 flash_isp

四種組合已實測:C3→C1、C1→C3、C1→C2、C2→C3。Nu-Link 從桌上拔掉後,鏈路仍成立。

觀察

讀目標前 1 KB 與已知 .bin 比對,確認接線方向與板子身份;燒完再用可見行為驗收。

未驗證

security lock 晶片的救援方式。工具刻意不提供 CONFIG 寫入或 chip erase,不能宣稱已解決。

08 / BENCH CARD

真正動手時,只看這一張。

PowerShell 5.1
# 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 -Reset

0 / 7 項已確認 尚未可寫

FINAL CHECK

燒完後回讀完全一致,但 LED 沒閃。下一步最合理的是?

選擇一個答案。