🐛 fix: recover JTAG DAP after flash programming with system reset

- Add preemptive rst -system at Step 3 start to clean post-flash DAP state
- Replace ineffective SLCR write with targets 1 → rst -system recovery
- Exit with clear power-cycle instructions when DAP recovery fails
- Show prominent DAP error guidance in GUI for Step 3 and Run All mode

Verified: Step 1→2→3 now passes end-to-end (340s) without board power cycle.
This commit is contained in:
Jeremy Shen
2026-06-10 18:29:26 +08:00
parent 73b8225a27
commit 5ce544cd3c
2 changed files with 59 additions and 12 deletions
+24
View File
@@ -871,9 +871,22 @@ class MainWindow(ctk.CTk):
self._bitstream_callback,
)
dap_fail = False
for result in results:
status = "" if result.success else ""
self._log_message(f" {status} {result.step}: {result.message}")
if "DAP" in result.message and not result.success:
dap_fail = True
if dap_fail:
self._log_message("")
self._log_message(" ╔══════════════════════════════════════════╗")
self._log_message(" ║ DAP ERROR — JTAG debug port hung ║")
self._log_message(" ║ This is caused by prior flash programming║")
self._log_message(" ║ → Power-cycle the board (unplug/replug) ║")
self._log_message(" ║ → Then re-run Step 3 ║")
self._log_message(" ╚══════════════════════════════════════════╝")
self._log_message("")
return all(r.success for r in results)
except Exception as e:
@@ -1138,6 +1151,17 @@ class MainWindow(ctk.CTk):
# Stop on first failure when running all steps
if not single_step and not success:
# Special case: Step 2 pass → Step 3 DAP fail = board needs power cycle
if i == 2 and results[0] and not success:
self._log_message("")
self._log_message(" ┌─────────────────────────────────────────┐")
self._log_message(" │ Step 3 failed after flash programming. │")
self._log_message(" │ This is normal — program_flash leaves │")
self._log_message(" │ the JTAG DAP in error state. │")
self._log_message(" │ → Power-cycle the board, then re-run │")
self._log_message(" │ Step 3 (Load Bootloader) alone. │")
self._log_message(" └─────────────────────────────────────────┘")
self._log_message("")
break
# Inter-step delay (skip after last step)