TR TRACE LABSTM32 / SWD / CMSIS-DAP
TARGET LINK0 / 7

FIELD NOTES · 2026.09.14

不要相信寫入值。
相信讀回來的證據。

一片 F446RE,三條 SWD 線,再加一條剪開的 USB 線。這門課不把彎路擦掉:你會看到錯誤假設如何誤導判斷,也會親手用量測把它推翻。

CH1 / SWCLKCH2 / SWDIOARMED
MASTERF446RE
TARGETL476VG
LINKSWD · 3 WIRES
STANDARD TOOLpyOCD PASS

01 / EVIDENCE FIRST

先看結論,也先看證據等級。

EVD

同一句「板子通了」,可能只是編譯通過,也可能是標準工具真的控制到另一顆 CPU。把證據強度攤開,才知道自己站在哪一層。

實測

板對板 SWD 已通

讀回 L476 專屬的裝置識別、flash 容量與初始 SP;不是只看到兩顆 M4 都相同的 CPUID。

實測

CPU 控制已通

halt、step、register dump、run 均由讀回的 DHCSR 與 PC 分布驗證。

實測

CMSIS-DAP 已通

pyOCD 能列出 probe,並透過它讀 target、halt 與 resume。

手冊+實測

CN3 腳位定案

手冊提供拓撲,四支腳的指紋電壓一次完成實體標定。

推論

約 1 V 是浮接

量到的是電壓;「高阻抗與漏電造成分壓」是能解釋觀察的推論。

實測

pyOCD 寫 flash 已通

先做 1 MB 全備份,再只寫 bank2 最後一頁;簽章讀回相符,bank1 哨兵與原廠 demo 未受影響。

02 / UNKNOWN PINS

四支腳,一次量完它們的「指紋」。

CN3

情境:CN3 的兩個跳線帽已拔、訊號線全拔、DISCO 通電。先猜哪兩支是 MCU 側,再逐支點擊量測。

STM32L476G-DISCO CN3 / JUMPERS OFF
V DC—.— V點一支腳開始量測

03 / READ IT BACK

同一行 C,看起來合理,硬體卻安靜地忽略。

DHCSR

選一種 step 寫法,觀察真正讀回的 bit 3 與 halt 落點。規則:改變 C_MASKINTS 時,那次寫入必須同時維持 C_HALT=1。

DHCSR READBACK0x01030007

HALT SAMPLES / PC

04 / SILENT FAILURES

六個不報錯的 bug,該先量哪裡?

USB

選擇你眼前的症狀。故障台不直接告訴你「是哪個 bug」,而是先給能最大幅縮小嫌疑範圍的下一筆觀察。

DIAGNOSTIC ROUTERREAD ONLY
SELECT A SYMPTOM
> waiting for observation_

05 / KEEP THE WRONG TURNS

錯誤推導不是雜訊,是下一次的護欄。

ERR
WRONG / 01

「接對時 SWDIO 應該是 3.3 V」

錯。傳輸失敗後 master 把 SWDIO 維持輸出低;線有通時反而會接近 0 V。用這個錯誤規則會把好線判成壞線。

WRONG / 02

「手邊是兩片 F446RE」

錯。實物是 F446RE master 加 L476G-DISCO target。正因為兩顆 M4 的 DPIDR/CPUID 相同,才需要讀 ST 的 DBGMCU_IDCODE。

WRONG / 03

「CN4 看起來像 SWD,就接 CN4」

方向相反。CN4 是板載 ST-LINK 對外輸出;我們要的是 CN3 跳線拔除後的 MCU 側。

WRONG / 04

「自製測試全過,就符合標準」

錯。dap.ps1 在主機端補了 RDBUFF,剛好掩蓋韌體未處理 posted AP read。真正驗收要交給獨立實作 pyOCD。

06 / CHECKPOINT

你是在背答案,還是在判讀證據?

CHK