新的 psoc-edge 移植、alif 和 mimxrt 上的 CAN、mem_backup、manifest c_module此版本的 MicroPython 为英飞凌 psoc edge 微控制器添加了一个新的 "psoc edge"移植。这是一个使用 CMSIS 6 和英飞凌 Modus 工具箱中的一组低级HAL子模块的裸机移植。它使用标准的 ARM 工具链,并使用 make 构建。它目前支持 UART REPL、文件系统(使用QSPI闪存)、machine Pin、UART 和 RTC 类,包括 Pin 和 UART 的 IRQ。目前有一个支持的开发板:KIT_PSE84_AI。
之前的 v1.28.0 版本为 stm32 引入了一个新的 machine.CAN API。此版本在 alif 和 mimxrt 上都实现了此 API。为了确保这三个硬件上在使用 CAN 时具有相同的一致性,付出了大量努力,以便可以在该 API 的基础上构建可靠的应用程序。
此版本中还有一个新的 machine.mem_backup() 接口,它可以一致地访问 alif、esp32、mimxrt、nrf、rp2、samd 和 stm32 上的备份内存。调用此函数会返回一个可写的 memoryview,在大多数情况下硬复位后能够保留下来。可用区域可以通过 machine.mem_backup(-1) 发现。有关更多详细信息和示例,请参阅文档:https://docs.micropython.org/en/latest/library/machine.html。
由于在 manifest API 中添加了 C_module() 函数,使用用户C模块配置自定义构建现在要简单得多。此函数允许清单文件声明哪些用户C模块应包含在构建中。它们与冻结模块的声明一起声明,使配置具有扩展的固件变得更加容易。例如,manifest.py文件包含:
require("bundle-networking")freeze("/path/to/custom/modules")c_module("/path/to/micropython-ulab/code")
将冻结 micropython 库中的网络包,冻结自定义Python代码,并在构建中包含 micropython ulab C 库。此 c_module() 功能旨在替换现有的 USER_C_MODULES 选项(目前与该选项一起工作)。
此版本改进了Unicode支持:
bytes.decode() 和三参数 str()现在支持错误参数的 "strict"、"ignore" 和 "replace";- 在 str 和 bytes 之间转换时,编码/解码模式现在被验证,只接受 "utf-8"、"utf8" 和 "ascii";
str.center() 已修复,它可以正确处理 Unicode 字符;- 所有可打印的 Unicode 字符现在都是逐字打印的(不是作为转义序列)。
添加了 USB 网络(网络控制模型,NCM)驱动程序,提供由 lwIP 堆栈支持的 USB 以太网,可以通过新的 network.USBD_NCM 类使用。启用此功能后,主机将 MicroPython 设备视为 USB 以太网适配器,并通过 DHCP(由MicroPython设备提供服务)为主机分配 IP 地址。然后,设备上的 Python 代码可以使用所有常用的网络设施与主机通信。默认情况下,它是禁用的,需要在自定义构建中启用 MICROPY_PY_NETWORK_USBD_NCM。
解析器现在可以通过类型提示识别 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,因此不再需要手动提供。原生模块现在也可以用 Clang 构建。
mbedTLS 组件更新到v3.6.6,并在 SSLContext 类中添加了对 TLS-PSK(预共享密钥)的支持。还为使用 mbedTLS 的所有移植启用了 PEM 证书解析。LittleFS 更新到 v2.11.3,TinyUSB 更新到 0.21.0,CMSIS v6.3.0 现在用于 mimxrt、nrf、psoc edge、samd 和 stm32。
Mpremote 为代码库添加了一个别名,并修复了 Windows 上的 Unicode 错误以及其他一些小错误。它还实现了 ROMFS 部署的增量准备,允许大尺寸分区而不会超时。
alif 移植实现 machine.CAN、machine.WDT,以及 machine.lightsleep() 的超时参数。它还实现了machine.reset_cause() 的五种状态。
esp32 移植将 IDF 更新到 v5.5.2,并增加了对 esp32-H2 芯片的支持以及两个新的开发板定义。ESP-NOW 更新到v2.0,添加了一个新的 machine.wake_pins() 函数,在以太网接口上启用了 mDNS,可以从 SDCard 构造函数配置 LDO,通过 machine.Timer(-1) 支持虚拟定时器。新的 CSI(信道状态信息)API 通过 WLAN 对象上的新方法公开,允许访问每个分组的物理层信道数据。请参阅以下文档和一些示例:https://docs.micropython.org/en/latest/library/network.WLAN.html。
mimxrt 移植实现了 machine.CAN,并为所有突发 CAN 外设的板子进行配置。它改进了事件处理和 time.sleep(0),修复了 Hyperflash 板上的闪存擦除操作,并修复了 SDCard 缓存问题。
nrf 移植将 nrfx 库更新到 v3.14.0(从v2.0.0升级),对 Pin.irq 进行现代化升级,添加 I2C 超时参数,并将所有板的 sys.platform 更改为 "nrf" 以保持一致性。
rp2 移植将 pico-sdk 更新为 2.3.0,重构了链接脚本,通过 rp2.DMATimer 类添加对 DMA 起搏定时器的支持,在所有启用网络的开发板上启用 network.PPP,并修复看门狗与 machine.lightsleep() 的交互。
samd 移植添加了 adc.read_timed() 和 dac.write_timed() 方法,并修复了一些 UART IRQ 事件的处理。
stm32 上将 pulse_width_us() 和 pulse_width_ns()方法添加到 TimerChannel 类中,添加 machine.SDCard 类(现有 pyb.SDCard 的别名),并在 STM32H7 上实现了 WWDG 看门狗外围设备(除了IWDG),最多有四个看门狗。STM32N6 现在支持 FDCAN,并对network.LAN 激活、链路检测和热插拔支持进行了重大改进。还修复了 SDCard 缓存问题。
unix 移植添加 sendall() 方法到 socket 类中,并且对 FreeBSD 有更好的支持。
zephyr 移植将 zephyr 更新到 v4.4.0,增加了对用户 C 模块的支持,并且对 I2C 驱动程序进行了重新设计,以进行连续事务处理(而不是单独的写入和读取)。
此版本中添加了13个新开发板:
- esp32:esp32_GENERIC_H2、M5STACK_NANOH2、LILYGO_T3_S3、SEEED_XIAO_ESP32C3、SEED_XIAO_EPS32C5、SEEED_XiaOO_ESP32S3 和 WAVESHARE_esp32_S3_PICO;
- rp2:SOLDERED_NULA_MAX_RP2350 和 ADAFRUIT_FEATHER_RP2350;
- stm32:STM32H747I_DISCO、WEACTSTUDIO_MINI_STM32H723 和 GARATRONIC_PYMATE_CORE8ADI8DOSC。
突破性变化
MicroPython 现在验证 str.encode() 和 bytes.decode() 的编码参数(以及相应的构造函数),并且只接受 "utf-8"、"utf8" 和 "ascii"。特别是,不支持 "latin-1",也不支持大写变体,如 "UTF8"。对于不受支持的编码,之前的行为是使用 "utf8" 编码静默传递数据,但 MicroPython 现在将引发 LookupError 异常。应更改受影响的代码以使用支持的编码。
MICROPY_FORCE_32BIT 标志已从 unix 移植中删除。相反,32位x86现在被视为交叉编译目标。有关更多详细信息,请参阅 unix 的 README 文件。
对于 esp32 和 stm32 移植,machine.SDCard.readblocks() 和 .writeblocks() 方法现在返回 0 表示成功,返回负整数表示失败。他们之前返回了 True 表示成功,因此逻辑基本上是颠倒的,受影响的代码应该被更新。
对于 nrf 移植,所有开发板都已合并为使用 "nrf" 作为其 sys.platform 值。一些开发板以前在这里使用自定义名称,如 "nrf51-DK" 和 "nrf52",但现在它们都只是 "nrf"。nrf 板上使用 sys.platform 的代码都需要更新。
powerpc 移植被删除,其功能被合并到 qemu 中。
对于配备 Cortex-M33/M55 MCU 的 stm32,stm 模块中的外围寄存器命名已更改,因此常量不再以 _S 或 _NS 结尾。例如,之前都是 stm.RTC_S 和 stm.RTC_NS 已提供,但现在已被删除并替换为单一的 stm.RTC。常数(例如 stm.RTC)的值被选择为 _S 或 _NS 外围地址,具体取决于固件是以安全模式还是非安全模式构建的。
同样在stm32端口上,rng_get() 的 PRNG 实现已被删除,此函数重命名为 mp_hal_get_hw_random_u32(),以使其功能更清晰。
固件大小
自上一版本以来,各种移植版本的代码大小变化为(文本部分中的绝对值和百分比变化):
bare-arm: +20 +0.04%minimal x86: +92 +0.05% unix x64: +13673 +1.62% (standard variant) alif: +9696 +1.23% (ALIF_ENSEMBLE board) esp32: +28328 +1.62% (ESP32_GENERIC board) mimxrt: +8120 +2.11% (TEENSY40 board) renesas-ra: +932 +0.15% (EK_RA6M2 board) nrf: +7072 +3.72% (PCA10040 board) rp2: +5136 +1.50% (RPI_PICO board) rp2: +30416 +3.33% (RPI_PICO2_W board) samd: +3112 +1.13% (ADAFRUIT_ITSYBITSY_M4_EXPRESS board) stm32: +2200 +0.55% (PYBV10 board)
这些大小变化很好地总结了固件本身的更改和添加。造成这些变化的一些原因是:
- 支持
int.to_bytes(signed=True); - 实现
bytes.decode() 的 "ignore" 和 "replace",并验证编码模式; - 将
machine.mem_backup() 添加到大多数硬件; machine.CAN 支持 alif 和 mimxrt;requests 模块现在支持 HTTP/1.1;- 在 mbedTLS 3.6.6中添加 TLS-PSK、PEM 解析和更新;
- 更新到 nrfx v3 并在 nrf 上启用 asyncio;
- 在 samd 上添加
adc.read_timed() 和 dac.writetimed(); - 在 stm32 上添加
pulse_width_us() 和 pulse_width_ns()。
致谢
感谢所有为本次发布做出贡献的人:Alessandro Gatti、Amirreza Hamzavi、Andrew Leech、Andrii Anoshyn、Angus Gratton、Anson Mansfield、Antonio Galea、Calin Faja、Carl Pottle、Charalampos Stratakis、Chris Mason、Cristian Dinca、Damien George、Dan Halbert、Daniël van de Giessen、David(Pololu)、Denis Dowling、Drew Wade、Duncan Lowther、EngineerWill、Finn Maaße、Finn Glas、Francesco Pace、Frédéric Pierson、Harris、Howard Lovatt、Hugo Frisk、iabdalkader、Ihor Nehruth sa、Jacob Peck、jaenrig ifx、Jeff Epler、Jeongseop Lim、jetpax、Jim Lipsey、Jim Mussared、Joel Stanley、Jon Nordby、Jos Verlinde、JosipŠimun Kuči、Julia Vassiliki、Keenan Johnson、Kwabena W.Agyeman、Luca Burelli、MarcelloTheArcane、massimosala、Matt Trentini、Meir Armon、Mikhail Zakharov、Mo Nazemi、Mrpli、Ned Konz、Nicko van Someren、npt-1707、o-murphy、Owen、Pavel Revak、Phil Howard、phuzzyday、Pierre Gaufille、radio球迷、拉法尔、拉法尔·瓦多夫斯基、里克·索伦森、rmuro_QCOM、罗伯特·hh、罗曼·泽德、桑德尔·阿提拉·格雷迪,Tomasz Cwik、Vdragon、vlad.maglasu、崔伟协、William Vinnicombe、刘延峰、NAGAO。
感谢微Python库的其他贡献者:Daniel Houck、Greg Darke、Hagb Green、John Moser、kolten、Mark A.Ziesemer、Max Holliday、Michael Bentley、Mike Cifelli、Keuz先生、Naidile、Pablo Ventura、PermissionDenied7335、puuu、scivision、Stefan、tharuka pavith、trevor。
MicroPython是一个全球性的开源项目,其贡献来自以下时区:-0800、-0700、-0600、-0500、-0400、-0300、+0000、+0100、+0200、+0300、+0330、+0530、+0700、+0800、+0900、+0930、+1000、+1100。