STM32H563 (NUCLEO-H563ZI)
The STM32H563ZI (Cortex-M33 with TrustZone disabled, 2 MB flash, 640 KB
SRAM) is LabWired's flagship hardware-validated Cortex-M33 target. A
committed determinism report
(examples/nucleo-h563zi/golden-reference/determinism_report_h563.json)
records status: PASS over 50 compared steps of real silicon vs sim
running the same ELF — see
docs/golden_reference.md for the full
pipeline.
Foreign-firmware digital twin (2026-06-11): an unmodified-logic embassy async example (USART3 + embassy-time on TIM12, thumbv8m) produces a byte-identical UART stream on the board's VCP and in the simulator — hello + 20 timer-paced ticks + DONE. The bring-up exercises PWR VOS, FLASH ACR, RCC, GPIO AF, USART3, TIM12 compare interrupts and the M33 acquire/release atomics end to end.
ST-HAL twin (same day): the unmodified STM32CubeH5 DMA_DataHandling example (full HAL stack — PWR Scale0, HSE+PLL1 @ 250 MHz, ICACHE, GPDMA channel 7 interrupt-driven with all seven data-handling modes: zero-pad / sign-extend / both truncations / SBX / DBX / DHX) reaches its success loop in the simulator and on the board — same ELF, same verdict, observed live over SWD (LED1 toggling, error LED dark).
For build/run instructions, see
examples/nucleo-h563zi/README.md.
Status at a glance
Live status: the table below is a hand-maintained snapshot. For the authoritative, auto-generated view see the chip conformance scoreboard (level · modelled peripherals · register-match vs silicon) and the tier-1 matrix (per-peripheral pass/fail).
| Aspect | Status |
|---|---|
| Chip yaml | configs/chips/stm32h563.yaml |
| System yaml | configs/systems/nucleo-h563zi-demo.yaml |
| Reference firmware | crates/firmware-h563-demo/, crates/firmware-h563-fullchip-demo/, crates/firmware-h563-io-demo/ |
| Validation | UART byte-parity vs silicon — determinism_report_h563.json records PASS; reset-state conformance (crates/core/tests/h563_conformance.rs) pinned to the 2026-06-10 silicon capture; GPIO MMIO diff (crates/hw-oracle/tests/h563_mmio_diff.rs) byte-exact vs silicon |
| Tier | hardware-validated — full 13/13 tier1 class row (clock/gpio/uart/timer/dma/irq/i2c/spi/adc/pwm/wdt/rtc + can beachhead), every model silicon-diffed via h563_mmio_diff/h563_class_diff |
| HIL showcase | examples/hil-displacement-showcase/ |
| Silicon capture | scripts/hw-capture-stm32h563.sh (AP1 dapdirect recipe — OpenOCD 0.12 has no stm32h5x.cfg and hla cannot reach AP1) |
Peripherals (from chip yaml)
| Peripheral | Base | Status | Notes |
|---|---|---|---|
| Cortex-M33 | — | ✅ modeled | Thumb-2 + FPU (TrustZone disabled) |
| SysTick | 0xE000E010 | ✅ hardware-parity | Tick generation matches silicon byte-stream; CALIB silicon-pinned |
| RCC | 0x44020C00 | ✅ hardware-parity | h5 profile — reset state + write behavior silicon-probed (gated SW→SWS, CAL-tracks-TRIM, RMVF, LSI/LSE ready rules) |
| GPIOA | 0x42020000 | ✅ hardware-parity | stm32v2 MODER/AFR; reset values silicon-pinned (SWD pins) |
| GPIOB | 0x42020400 | ✅ hardware-parity | Board LED LD1 (PB0); ODR/BSRR/BRR data path byte-exact vs silicon (h563_mmio_diff) |
| GPIOC | 0x42020800 | ✅ hardware-parity | Reset values silicon-pinned |
| GPIOD | 0x42020C00 | ✅ hardware-parity | USART3 alt-function pins |
| GPIOE | 0x42021000 | ✅ hardware-parity | Full config surface parity-swept vs silicon |
| GPIOF | 0x42021400 | ✅ hardware-parity | Board LED LD2 (PF4); config surface parity-swept |
| GPIOG | 0x42021800 | ✅ hardware-parity | Board LED LD3 (PG4) |
| USART3 | 0x40004800 | ✅ hardware-parity | Virtual COM, IRQ 60 — byte-for-byte parity |
| USART1 | 0x40013800 | ✅ silicon-pinned | stm32v2 profile; ISR reset TXE|TC, BRR/CR1 round-trips bench-probed |
| USART2 | 0x40004400 | ✅ silicon-pinned | stm32v2 profile |
| LPUART1 | 0x44002400 | ✅ silicon-pinned | stm32v2 profile |
| TIM1 | 0x40012C00 | ✅ silicon-pinned | Advanced timer; PSC/ARR, UG→UIF, CNT run/freeze verified on silicon |
| TIM2 | 0x40000000 | ✅ silicon-pinned | 32-bit GP timer |
| TIM3 | 0x40000400 | ✅ silicon-pinned | GP timer |
| TIM6 | 0x40001000 | ✅ silicon-pinned | Basic timer (UG sets UIF only) |
| I2C1 | 0x40005400 | ✅ silicon-pinned | h5 profile (v2 IP layout); OAR1/TIMINGR/PE round-trips bench-probed |
| I2C2 | 0x40005800 | ✅ silicon-pinned | h5 profile |
| IWDG | 0x40003000 | ⚠ documented divergence | Silicon commits PR/RLR only after LSI-domain sync; sim commits instantly (yaml-documented) |
| WWDG | 0x40002C00 | ✅ silicon-pinned | CFR pinned; CR decrements live on silicon once clocked (not pinned) |
| CRC | 0x40023000 | ✅ hardware-parity | Behavioral oracle: 0x12345678 → 0xDF8A8A2B matches silicon |
| RNG | 0x420C0800 | ⚠ documented divergence | Sim assumes clocked, seeded RNG; silicon CR reset + kernel-clock errors documented in yaml |
| LPTIM1 | 0x44004400 | ✅ modeled | |
| GPDMA1 | 0x40020000 | ✅ hardware-parity | 8ch, software-request mem-to-mem silicon-verified (TCF/HTF, EN auto-clear, SAR/DAR advance); linked-list + peripheral-request modes not modeled |
| SPI1 | 0x40013000 | ✅ hardware-parity | stm32h5 v3 IP — CFG lock, mode-fault, CTSIZE/TXTF flags silicon-verified; data shift is sim-only (no spi_ker_ck on the bench, yaml-documented) |
| SPI2 | 0x40003800 | ✅ silicon-pinned | stm32h5 profile |
| SPI3 | 0x40003C00 | ✅ silicon-pinned | stm32h5 profile |
| ADC1 | 0x42028000 | ✅ hardware-parity | DEEPPWD/ADVREGEN/ADEN→ADRDY power-up silicon-verified; conversions sim-modeled; ADC2 not separately modeled |
| RTC | 0x44007800 | ✅ hardware-parity | v3 calendar — WPR/init/BYPSHAD/INITS + calendar tick silicon-verified |
| TIM1 ch5/6 | — | ✅ hardware-parity | CC5IF/CC6IF + compare-while-counting silicon-verified (PWM class) |
| NVIC | 0xE000E100 | ✅ hardware-parity | ISER/ICER enable machinery diffed on the M33 (irq class) |
| PWR | 0x44020800 | ✅ hardware-parity | H5 layout — VOSCR/VOSSR voltage scaling silicon-pinned (Scale3↔0↔2 transitions) |
| FLASH | 0x40022000 | ✅ silicon-pinned | Interface regs (ACR latency read-back); program/erase not modeled |
| TIM12 | 0x40001800 | ✅ silicon-pinned | 2ch GP timer (foreign time-driver pick); resets + round-trips + free-run probed |
| DBGMCU | 0x44024000 | ✅ silicon-pinned | IDCODE 0x10016484; CR plain R/W |
| FDCAN1 | 0x4000A400 | ✅ hardware-parity | M_CAN, fixed SRAMCAN layout — internal-loopback TX→RX FIFO0 silicon-verified (capture13, 22 diff cases); filtering/bit-timing/FDCAN2/IT1 not modeled (can class) |
Not yet modeled (commonly expected on H563)
The chip yaml does not declare: I²C3/4, SPI4/5/6, ADC2, USART6, UART4/5/7/8/9/10/11/12, TIM4/5/7/8/12–17, DAC, OPAMP, USB-FS, OTFDEC, ETH, FDCAN1/2, OCTOSPI1/2, SDMMC1/2, GPDMA2, FLASH registers, ICACHE/DCACHE, TrustZone (SAU / IDAU), PKA / HASH / SAES.
Firmware that touches any of these will hit MemoryAccessViolation or
stall in a polling loop. See
docs/getting_started_firmware.md.
Validation runbook
examples/nucleo-h563zi/VALIDATION.md— emulator + hardware blink-and-UART runbookdocs/golden_reference.md— full OpenOCD+GDB capture pipeline that produced the determinism reportcrates/core/tests/h563_conformance.rs— reset-state conformance vs the 2026-06-10 silicon capture (runs in CI)crates/hw-oracle/tests/h563_mmio_diff.rs— GPIO MMIO + parity diff vs silicon (--features hw-oracle-stm32, board connected); sim-only variants run in CIexamples/nucleo-h563zi/silicon-smoke— one ELF, byte-identical output on board (VCP) and sim