About this bench
A lab bench for one board: the BBC micro:bit v2.2 and its nRF52833. It boots real firmware built for flash zero and shows what the silicon would do — matrix, buttons, sensors, serial — with nothing simulated beyond the chip and its parts.
matrix preset: loader, strobing slab, MATRIX:OK on the console.What it is
The bench is two layers. The chip core is Rust compiled to WASM: Cortex-M4F plus every nRF52833 peripheral, timed off one instruction-count clock. The virtual board is JavaScript: the LED matrix, the LSM303 motion sensor, the OLED add-on, and the serial line. Firmware stages a transfer, the bench moves the bytes, then completes it — the same take/complete round trip for UARTE, TWIM, SAADC, PDM, USBD, NVMC, radio, I2S, NFCT, the crypto engines, and the BLE SVC jobs (GAP/GATTC/L2CAP staged, resolved over the Bumble air bridge or loopback, GATTS answered synchronously).
It boots MicroPython v2.1.2 to a banner and a live REPL prompt (P116+P117: banner wall time is machine-paced, print(1+2) → 3 in-browser, zero faults — the pre-P116 0x200021B8 park was pump starvation in ad-hoc probes, not a model gap) plus the stock radio API over bare metal (import radio, on(), send('ping') stages a real RADIO TX job — P144 test:mpy-radio; receive() RX leg parked, see STATUS), runs MakeCode arrow/smiley/heart/plot presets lit on the matrix (P158–P160: user programs run and render; scroll/rotation run then take post-render firmware unwind faults — see STATUS), and passes twenty-one GCC-built firmware proofs (C + C++ BLE faces + matrix sweep included) plus the parts smoke test, the handshake run (18/18), the MPY/JS/PY-idiom + TypeScript BLE/RADIO faces, and live BLE-over-air checks (42/42). Suite reads 274 green.
What it is not
- No DAPLink or interface MCU. This page is the loader and the USB serial line.
- No SoftDevice binary, timing, or crypto math. BLE exists as an SVC face — all 67 S132 BLE SVC numbers answer, with full pairing legs and a per-peer bond store — over a virtual Bumble air bridge (two peers, not RF). Crypto runs driver-side by design; the CODAL-BLE-shaped pairing-fw image proves the flow end to end natively; see the BLE section on the docs page.
- No STM32, no UNO R4, no speaker, mic, touch, or NFC RF physics. Pins are mapped (UICR.NFCPINS reserves P0.09/P0.10); the ST7789 edge-SPI display part is wired on SPIM2.
- No second clock and no silent faults: unimplemented instructions halt loudly by design.
How to read a run
- Stage firmware and press Run; the status line names the vector table it booted.
- Watch the matrix and the console together — a toggling latch on an input pin stays dark, exactly as on silicon.
- Press A or B, tilt or shake the sensor, type into the console; each answers through the same peripheral path real firmware uses.
- If the core faults, the status line names the program counter and opcode. Nothing fails quietly here.
Docs and method
The docs page holds the run recipes and both support matrices — board hardware and chip peripherals, each with what works, what is left, and why. Firmware proofs rebuild with the GCC flags in docs/README.md; the C recipe is verified bit-identical. The JS driver contract is frozen as v1 in demo/API.md.