MicroPython v1.29
A new PSOC Edge port, machine.CAN comes to MIMXRT, and a major Unicode overhaul.
Expected any day now — milestone due August 3, 2026, has passed with only clean-up items left open
PSOC Edge — Infineon Joins the Fold
The first new port since alif debuted in v1.25: Infineon's PSOC™ Edge
(PSE84) family, contributed by Infineon's own jaenrig-ifx.
The toolchain is entirely vendor-SDK-free — just arm-none-eabi-gcc,
Infineon's edgeprotecttools, and Infineon OpenOCD.
Source: PR #18910
A minimal secure-boot application starts the non-secure MicroPython image — the same pattern used across Infineon's PSOC Edge security model.
Modules available at launch
from machine import Pin, RTC led = Pin(0, Pin.OUT) led.value(1) rtc = RTC() print(rtc.datetime())
machine.CAN — MIMXRT Joins the Bus
v1.28 introduced the standardized machine.CAN
API with stm32 as the only implementation, and an explicit "Node C — Coming Soon" placeholder
in its bus diagram. v1.29 fills that gap: MIMXRT is now a real, tested second
implementation, verified across MIMXRT1021, 1052, 1062 and 1176 at bit rates from 50 kbit/s to
1 Mbit/s in NORMAL, LOOPBACK and SILENT modes.
Source: PR #19095
from machine import CAN # Now available on MIMXRT too can = CAN(1, CAN.NORMAL, baudrate=500_000) # Send a message can.send(b'\x01\x02\x03', id=0x123) # Receive a message msg = can.recv() print(f"ID: {msg[0]:#x}, Data: {msg[1]}")
Unicode Support Overhaul
A cross-cutting fix to how MicroPython handles Unicode, contributed by Josverl,
who built a 127-language test corpus to find and verify the fixes. Framed around PEP 3131 and
CPython compatibility, for roughly 0.05% extra memory cost (progressively enabled via
MICROPY_CONFIG_ROM_LEVEL).
This isn't a mockup — it's two real MicroPython interpreters, each compiled to
WebAssembly and running independently in your browser right now: the official
v1.28.0 release, and a v1.29 preview built from commit
06bcfd5b7
(2026-07-28, the milestone's current state). Edit the code and hit Run to see both outputs.
v1.28.0 (released)
v1.29 preview (06bcfd5b7)
Also includes a companion mpremote
fix: Unicode-safe Windows console output, safer path quoting for filenames with Unicode/quotes/backslashes,
and UTF-8-safe transport writes.
USB Networking — NCM Network Driver
A new USB network driver that turns the board's existing USB connection into a real network
interface, wired straight into MicroPython's existing lwIP stack. The regular USB serial port
stays available for mpremote
alongside it, and the board hands out an IP address to the host via its own DHCP server —
no Wi-Fi required. Any TinyUSB-based port with lwIP enabled can use it, provided the chip has
enough RAM to spare (lwIP needs roughly 20 KB).
# rp2, e.g. RPI_PICO2_W make -j -C ports/rp2 BOARD=RPI_PICO2_W \ MICROPY_PY_LWIP=1 \ CFLAGS_EXTRA="-DMICROPY_PY_NETWORK_NCM=1"
Disabled by default — opt in with MICROPY_PY_NETWORK_NCM=1
at build time. Once enabled, plugging the board in gives the host a normal network interface, so
existing servers and services (HTTP, MQTT, WebREPL) work over the same USB cable used for the
REPL.
machine.mem_backup() — Persistent Memory, Almost Everywhere
A small feature with an outsized payoff: machine.mem_backup()
returns a writable memoryview
onto whatever persistent hardware memory a port has — backup RAM, RTC registers, watchdog
scratch registers — with zero copying. Data survives at least a
soft_reset()
everywhere it's available; on battery-backed ports it survives power-off too. It's already
available on 7 of MicroPython's ports — about as close to universal as a
hardware-dependent feature gets. Closes a 2+ year old feature request
(#18960).
Source: PR #19084
| Port | Backing storage | Size | Battery-backed |
|---|---|---|---|
| alif | Backup SRAM | 4096 bytes | Yes |
| esp32 | RTC slow memory | 2048 bytes | No |
| mimxrt | SNVS LPGPR registers | 12–16 bytes | Yes |
| nrf | POWER GPREGRET registers | 1–2 bytes | No |
| rp2 | Watchdog scratch registers | 28–60 bytes | No |
| samd | Backup RAM (SAMD51 only) | 8192 bytes | Yes |
| stm32 | Backup SRAM + BKP registers | 20–8192 bytes | Yes |
import machine, uctypes mem = machine.mem_backup() layout = {"boot_count": (0, uctypes.UINT32)} regs = uctypes.struct(uctypes.addressof(mem), layout) regs.boot_count += 1 print("Boots since power-on:", regs.boot_count) # survives soft_reset() and deepsleep() on every port above; # survives power-off too on alif, mimxrt, samd, stm32
RTC.memory() API. It shares
the same underlying buffer as machine.mem_backup() but tracks
its length independently — mixing the two in the same application can produce surprising
results. Pick one and stick with it.
ESP32-H2 — A Wi-Fi-less ESP32
Two new boards (PR #19317)
bring up Espressif's ESP32-H2: a low-cost, single-core RISC-V chip built specifically for
Bluetooth LE and 802.15.4 mesh networking (Zigbee/Thread/Matter) — and notably, the first
ESP32 variant in the port with no Wi-Fi radio at all. MICROPY_PY_NETWORK_WLAN
and MICROPY_PY_ESPNOW
are both compiled out for this board, since the hardware simply isn't there.
CONFIG_IEEE802154_ENABLED=n)
since MicroPython doesn't have 802.15.4 support yet — it's a deliberate binary-size trade-off,
not a hardware limitation. BLE works today; treat Zigbee/Thread as a "maybe later."
Boards
M5STACK_NANOH2 adds an RGB LED, USB-C and a JST-PH connector
on top of the generic board — both were tested on hardware (GPIO, ADC, I2C, SPI, and a live
BLE packet scan).
import bluetooth ble = bluetooth.BLE() ble.active(True) print("BLE active on ESP32-H2:", ble.active()) # no machine.WLAN() here -- this chip doesn't have Wi-Fi
Highlights
Other notable improvements already merged into the milestone.
machine.wake_pins
New cross-port API returning which pin(s) triggered a deep-sleep wake-up, when multiple wake pins are configured.
PR #17542Wi-Fi CSI Module
network.WLAN gains csi_enable()/csi_read() for Channel State Information — motion detection, indoor localization, gesture recognition.
espnow v2.0
Max message size jumps from 250 to 1490 bytes on ESP-IDF v5.4+, while keeping v1.0 support for older IDF builds.
High-Speed USB
TinyUSB gains proper HS RHPORT support for PYBD_SF6, STM32F429DISC, OLIMEX_H407 and ULPI-based boards, plus CDC/VBUS fixes.
Ethernet Improvements
Background PHY link/hot-plug detection, static IP configuration before active(True), and non-blocking DHCP restart on cable replug.
TLS PSK Support
Pre-shared-key authentication added to the ssl module, for use cases that don't want full certificate-based TLS.
RP2 DMA Timers
New DMATimer class paces DMA channel transfers by ratio or target frequency.
machine.Timer Rework
Moved to ESP-IDF's higher-level GPTimer abstraction, and adds virtual timers backed by ESP Timer.
SDK 2.3.0 + Upstream PSRAM
Include-based linker scripts, a silent ROMFS-overflow fix, and PSRAM bring-up now fully deferred to the Pico SDK itself.
int.to_bytes(signed=...)
Closes a long-standing CPython incompatibility, plus common overflow checks for buffer conversions — ported from CircuitPython.
PR #16311bytes.find(int)
CPython-compatible single-byte search — no more manually wrapping a byte value in bytes([n]) first.
c_module() Manifest Function
User C modules no longer need to live inside one flat USER_C_MODULES directory — declare them directly in manifest.py, wherever they live.
Security: mbedtls 3.6.6
Resolves 10 CVEs in the bundled mbedtls (CVE-2025-49087, -52496, -52497, -54764, -59438, -66442, CVE-2026-25833, -25834, -25835, -34871). Recommended update for anything TLS-facing.
PR #19083Block Device errno Returns
Python-level block-device read/write now returns an integer errno instead of a bool, fixing real SD-card failure handling on PYBV11 and ESP32-P4.
PR #16223help('modules') Formatting
Column count and width are now configurable via mpconfigport.h, for boards with small displays.
New Boards
8 new board definitions across 2 ports — confirmed from closed milestone items only.
esp32 (7 boards)
psoc-edge (1 board — new port)
By the Numbers
Based on the 56 closed milestone items only — final numbers will shift slightly once the release is tagged.
Code-size deltas aren't available yet — there's no tagged v1.29 build to diff against v1.28. We'll add a chart once the release build lands.