编程 MicroPython v1.29.0 发布:新增 psoc-edge 端口,编码参数开始抛 LookupError,SDCard 读写返回值反转

2026-10-05 00:04:11

MicroPython v1.29.0 发布:新增 psoc-edge 端口,编码参数开始抛 LookupError,SDCard 读写返回值反转

项目信息

  • 官网:
  • GitHub:
  • 下载页:
  • 文档:

发布日期:2026-08-24。


新端口与新 API

psoc-edge:Infineon PSOC Edge

新增 psoc-edge 端口,面向 Infineon PSOC Edge 系列 MCU。这是个裸机(bare-metal)端口,基于 CMSIS 6,并使用了 Infineon Modus Toolbox 的一组低层 HAL 子模块。使用标准 ARM 工具链,make 构建。

当前支持的功能:

  • UART REPL
  • 文件系统(基于 QSPI flash)
  • machine.Pin、machine.UART、machine.RTC,其中 Pin 和 UART 支持 IRQ

目前只有一块受支持的板子:KIT_PSE84_AI。

machine.CAN 扩展到 alif 和 mimxrt

v1.28.0 引入了 machine.CAN API,当时只有 stm32 实现。本版在 alif 和 mimxrt 两个端口上补上了实现。这三个端口在 CAN 行为上做了对齐,以便在其之上构建可靠应用。

machine.mem_backup()

新增 machine.mem_backup(),在 alif、esp32、mimxrt、nrf、rp2、samd、stm32 上提供一致的备份内存访问方式。调用后返回一个可写 memoryview,在多数情况下可以扛过硬复位(hard reset)。

可用区域通过 machine.mem_backup(-1) 枚举。文档见:

manifest 的 c_module()

用户 C 模块的配置变简单了:manifest API 新增 c_module() 函数,可以在 manifest 文件里声明本次构建要包含哪些用户 C 模块,写法与 frozen 模块声明并列。示例 manifest.py:

require("bundle-networking")
freeze("/path/to/custom/modules")
c_module("/path/to/micropython-ulab/code")

c_module() 的目标是取代现有的 USER_C_MODULES 选项(目前两者仍可同时使用)。

Unicode 与语言层改进

  • bytes.decode() 和三参数 str() 支持 errors 取 "strict"、"ignore"、"replace"
  • str/bytes 互转时校验 encoding,只接受 "utf-8"、"utf8"、"ascii"
  • 修复 str.center(),现在能正确处理 Unicode 字符
  • 所有可打印 Unicode 字符按原样输出,不再转义
  • 解析器识别带类型注解的 const 赋值,例如 _X: int = const(123)
  • 支持 bytes.find(int),以及带 signed=True 的 int.to_bytes()
  • RISC-V 内联汇编支持 Zcmp 操作码,寄存器分配改进
  • LoongArch64 架构纳入支持并进入 CI

构建工具与组件版本

  • 通过 mpy_ld.py 构建的 native .mpy 模块,链接阶段自动包含 memset、memmove、memcpy
  • native 模块现在也可以用 Clang 构建
  • mbedTLS 更新到 v3.6.6,并在 SSLContext 类中加入 TLS-PSK(预共享密钥)支持;所有使用 mbedTLS 的端口都启用了 PEM 证书解析
  • LittleFS 更新到 v2.11.3,TinyUSB 更新到 0.21.0
  • mimxrt、nrf、psoc-edge、samd、stm32 端口改用 CMSIS v6.3.0
  • mpremote:新增 codeberg 仓库别名,修复 Windows 上的 Unicode 错误;ROMFS 部署改为增量准备,大分区也不会超时

USB 网卡:network.USBD_NCM

新增 USB NCM(Network Control Model)驱动实现,由 lwIP 提供 Ethernet-over-USB,Python 侧通过 network.USBD_NCM 类访问。启用后,主机把 MicroPython 设备识别为 USB 以太网适配器,并通过 DHCP 获取 IP(DHCP 服务由 MicroPython 设备提供)。

该功能默认关闭,需要在自定义构建中打开 MICROPY_PY_NETWORK_USBD_NCM。


各 port 变化

alif:实现 machine.CAN、machine.WDT,以及 machine.lightsleep() 的 timeout 参数;machine.reset_cause() 的 5 种状态全部实现。

esp32:ESP-IDF 更新到 v5.5.2,新增 ESP32-H2 芯片支持及两块板子定义。ESP-NOW 更新到 v2.0;新增 machine.wake_pins();以太网接口启用 mDNS;SDCard 构造函数可配置 LDO;虚拟定时器通过 machine.Timer(-1) 支持。新增 CSI(Channel State Information)API,通过 WLAN 对象上的新方法暴露,见 。

mimxrt:实现 machine.CAN,并为所有引出 CAN 外设的板子做了配置;改进事件处理和 time.sleep(0);修复 Hyperflash 板子的 flash 擦除操作;修复 SDCard 缓存问题。

nrf:nrfx 库从 v2.0.0 更新到 v3.14.0;Pin.irq 现代化改造;I2C 增加 timeout 参数;所有板子的 sys.platform 统一为 "nrf"。

rp2:pico-sdk 更新到 2.3.0;重构链接脚本;新增 rp2.DMATimer 类支持 DMA pacing timer;所有启用了网络的板子上启用 network.PPP;修复 watchdog 与 machine.lightsleep() 的交互问题。

samd:新增 adc.read_timed() 和 dac.write_timed();修复部分 UART IRQ 事件的处理。

stm32:TimerChannel 类新增 pulse_width_us() 和 pulse_width_ns();新增 machine.SDCard 类(即 pyb.SDCard 的别名);实现 WWDG 看门狗外设(此前只有 IWDG),STM32H7 上最多可同时使用 4 个看门狗;STM32N6 支持 FDCAN;network.LAN 的激活、链路检测和热插拔支持有较大改进;修复 SDCard 缓存问题。

unix:socket 类新增 sendall() 方法;对 FreeBSD 的支持改善。

zephyr:Zephyr 更新到 v4.4.0;支持用户 C 模块;I2C 驱动重写以支持连续事务。

本版共新增 13 块板子定义:

  • esp32:ESP32_GENERIC_H2、M5STACK_NANOH2、LILYGO_T3_S3、SEEED_XIAO_ESP32C3、SEEED_XIAO_ESP32C5、SEEED_XIAO_ESP32S3、WAVESHARE_ESP32_S3_PICO
  • psoc-edge:KIT_PSE84_AI
  • rp2:SOLDERED_NULA_MAX_RP2350、ADAFRUIT_FEATHER_RP2350
  • stm32:STM32H747I_DISCO、WEACTSTUDIO_MINI_STM32H723、GARATRONIC_PYMATE_CORE8ADI8DOSC

Breaking changes

1. encoding 参数开始校验,latin-1 与 UTF8 这类大写写法会抛 LookupError

MicroPython 现在会校验 str.encode()、bytes.decode() 以及对应构造函数的 encoding 参数,只接受 "utf-8"、"utf8"、"ascii"。"latin-1" 不受支持,"UTF8" 这类大写变体也不行。之前遇到不支持的 encoding 会静默按 "utf8" 处理,现在直接抛 LookupError。受影响的代码需要改成受支持的 encoding。

2. esp32 / stm32 的 machine.SDCard.readblocks() / writeblocks() 返回值语义反转

这两个方法现在返回 0 表示成功,返回负整数表示失败。此前返回 bool,True 表示成功。判定逻辑实际上是反过来的,用到返回值的代码必须跟着改——以前写 if sd.readblocks(...): 的地方,现在恒为真。

3. nrf 的 sys.platform 统一为 "nrf"

nrf 端口所有板子的 sys.platform 值统一为 "nrf"。部分板子此前用的是自定义名字,例如 "nrf51-DK"、"nrf52"。

4. powerpc 端口移除,功能并入 qemu

powerpc 端口被删除,其功能合并进了 qemu 端口。

5. stm32 Cortex-M33/M55 的外设寄存器常量去掉 _S / _NS 后缀

在采用 Cortex-M33/M55 的板子上,stm 模块中的外设寄存器命名有变:常量不再以 _S 或 _NS 结尾。例如之前同时提供 stm.RTC_S 和 stm.RTC_NS,现在两者都被移除,换成单个 stm.RTC。该常量的取值根据固件是以安全模式还是非安全模式构建,决定采用 _S 还是 _NS 的外设地址。

6. stm32 的 rng_get() 被移除

rng_get() 的 PRNG 实现被删除,函数改名为 mp_hal_get_hw_random_u32()。

7. unix 端口的 MICROPY_FORCE_32BIT 移除

该标志已从 unix 端口移除,32 位 x86 现在作为交叉编译目标处理。


固件体积变化

text 段的绝对与百分比变化:

端口 / 板子变化量百分比
bare-arm+20+0.04%
minimal x86+92+0.05%
unix x64(standard 变体)+13673+1.62%
alif(ALIF_ENSEMBLE)+9696+1.23%
esp32(ESP32_GENERIC)+28328+1.62%
mimxrt(TEENSY40)+8120+2.11%
renesas-ra(EK_RA6M2)+932+0.15%
nrf(PCA10040)+7072+3.72%
rp2(RPI_PICO)+5136+1.50%
rp2(RPI_PICO2_W)+30416+3.33%
samd(ADAFRUIT_ITSYBITSY_M4_EXPRESS)+3112+1.13%
stm32(PYBV10)+2200+0.55%

体积增长主要来自这些改动:int.to_bytes(signed=True);bytes.find(int);实现 bytes.decode() 的 "ignore" / "replace" 以及 encoding 模式校验;在多数端口加入 machine.mem_backup();alif 和 mimxrt 上的 machine.CAN;requests 模块在网络板子上支持 HTTP/1.1;加入 TLS-PSK、PEM 解析并更新到 mbedTLS 3.6.6;更新到 nrfx v3 并在 nrf 上启用 asyncio;samd 上加入 adc.read_timed() 和 dac.write_timed();stm32 上加入 pulse_width_us() 和 pulse_width_ns()。


如何升级

固件从下载页获取:,按板子选择对应版本刷入。移植前先自查这几处:

  • 全文搜索 encode( / decode( 的 encoding 实参,把 latin-1、UTF8 之类换成 utf-8 / utf8 / ascii。
  • esp32 / stm32 上用了 machine.SDCard.readblocks() / writeblocks() 返回值的代码,把成功判定改成 == 0。
  • nrf 上依赖 sys.platform 具体字符串的平台判断分支,改成 "nrf"。
  • stm32 Cortex-M33/M55 上引用了 stm.RTC_S / stm.RTC_NS 一类常量的代码,改用无后缀常量。
  • 使用 USER_C_MODULES 构建的用户 C 模块,可以迁移到 manifest 的 c_module()。
  • 自定义构建若需要 USB 网卡,打开 MICROPY_PY_NETWORK_USBD_NCM。
复制全文 生成海报 micropython 嵌入式 单片机 ESP32 STM32 固件

推荐文章

程序员茄子在线接单