GitHub

Docs / Getting started / Flash the FRDM-MCXN947

Flash the FRDM-MCXN947v0.1.0

The FRDM-MCXN947 is flashed with NXP's blhost tool over the in-system programming (ISP) bootloader, exposed through the on-board MCU-LINK CDC bridge at /dev/ttyACM0. This page assumes you already built build/zephyr/zephyr.bin as described in Installation & workspace.

Warning · pyOCD is unreliable on the MCXN947

Flashing with pyOCD (Zephyr's default west flash runner for this board) frequently fails with flash init timed out, even with the mcxn947 target pack installed. Use the blhost ISP path documented here — it is the recommended and verified method.

Serial port permissions (Linux)

On Linux, /dev/ttyACM0 is owned by root:dialout. Either add your user to the dialout group (permanent, takes effect after re-login) or grant access to the device directly (resets every time the board is replugged):

shell
# Option A: permanent — add yourself to the dialout group, then log out and back in
sudo usermod -aG dialout $USER

# Option B: quick — open up the device (resets on replug)
sudo chmod a+rw /dev/ttyACM0

Enter ISP mode

The ROM bootloader is entered with a button sequence on the board:

  1. Hold SW3 (the ISP button).
  2. While holding SW3, press and release SW1 (reset).
  3. Release SW3.

The board re-enumerates as an NXP mboot device on the same /dev/ttyACM0 port.

Verify with nxpdevscan

Confirm the board is in ISP mode before flashing:

shell
nxpdevscan
# Expected: Port: /dev/ttyACM0  Type: mboot device

If nxpdevscan does not show an mboot device, repeat the SW3/SW1 sequence from the previous step.

Erase and flash

Erase the flash, then write the binary to the flash base address 0x10000000:

shell
blhost -p /dev/ttyACM0 flash-erase-all
blhost -p /dev/ttyACM0 write-memory 0x10000000 build/zephyr/zephyr.bin

Exit ISP and open the serial console

Press and release SW1 alone to reset out of ISP mode and boot the freshly flashed image. Then attach a serial terminal at 115200 baud:

shell
picocom -b 115200 /dev/ttyACM0
Note · Same port, two roles

The MCU-LINK CDC bridge serves both the ISP bootloader and the application's UART console on /dev/ttyACM0. Close picocom (Ctrl+A then Ctrl+X) before re-entering ISP mode to flash again.

Expected boot output

On a successful flash of the hello_inference sample, the console shows the runtime coming up (captured live on the FRDM-MCXN947 during the Phase 1 verification):

serial
*** Booting Zephyr OS build v3.7.0 ***
<inf> hello_inference: === SynapticOS 0.1.0 — Hello Inference ===
<inf> syn_init: Initializing SynapticOS runtime v0.1.0
<inf> syn_mem: Arena: 128 KB total, 112 KB tensor, 16 KB scratch
<inf> syn_hal_npu_neutron: Neutron NPU initialized (stub — SDK not yet integrated)
<inf> syn_hal_dsp_pq: DSP PowerQuad initialized (software fallback — PQ not yet integrated)
<inf> syn_prof: Profiling enabled
<inf> syn_init: Runtime ready (arena=131072 bytes, NPU=initialized)

The sample then registers a model, runs one inference, and drops into the syn shell. As of v0.2.0 the DSP lines change — the PowerQuad driver calibrates against the silicon at boot (from the 2026-07-12 board capture):

serial
<inf> syn_hal_dsp_pq: PQ FFT calibrated: gain 1024/16384 at N=16, model 1/N
<inf> syn_hal_dsp_pq: PQ matmul calibrated: Q15 known-answer + saturation pass
<inf> syn_hal_dsp_pq: DSP PowerQuad initialized (FFT: hardware, matmul: hardware)

The next page walks through exactly what the sample does.