ALIF 和 STM32 上的 PWM,新的 machine.CAN API、t-strings 和 weakref 模块
在本次发布的 MicroPython 版本,终于为 stm32 和 alif 硬件添加了 machine.PWM 支持。这使得所有基于一级和二级微控制器的硬件都支持PWM,从而能够以一致的方式轻松创建和控制 PWM 输出。
一个已开发数年的新 machine.CAN 类在此版本中已最终确定下来,并增加了文档、一组通用的绑定、全面的测试以及 stm32 上移植的实现。这是朝着在所有硬件上以一致方式使用 CAN 迈出的一大步,其他硬件的实现也将很快跟进。
此版本还根据PEP 750标准 https://peps.python.org/pep-0750/ 新增了模板字符串。模板字符串(或简称t字符串)与f字符串类似,都允许在字符串字面量中嵌入表达式。但与f字符串不同的是,t字符串不会将字面量的各个部分连接起来,而是作为独立的组件保留在Template对象中。MicroPython的t字符串与CPython几乎完全匹配,只有少数细微差异(不支持a/ascii转换说明符以及转换说明符后的空格)。模板字符串在“全功能”级别启用,该级别包括alif、mimxrt、samd(仅限S AMD51)和 webassembly(pyscript变体)移植版。
t字符串解析代码是现有f字符串解析器的扩展,为了支持嵌套的t字符串,f字符串现在也支持嵌套的f字符串:即f字符串字面量中的表达式内可以包含f字符串。
本次发布中新增的另一个 Python 特性是 weakref 模块,该模块包含 weakref.ref 和 weakref.finalize 两个类。这些类允许注册一个回调函数,当垃圾回收器回收对象时,该函数会被调用。其语义与 CPython 中的 weakref 语义非常接近(除了MicroPython不使用引用计数这一点)。由于内存和垃圾回收器的开销,该模块目前仅在 webassembly pyscript 变体上启用,但如有需要,可以在任何硬件上手动启用。
主README文件中已添加了 MicroPython 设计价值观的概述。此举旨在用文字阐述该项目一些较为抽象的方面,希望有助于在未来加强和维护这些价值观。我们鼓励所有 MicroPython 用户和开发者阅读这些价值观,具体内容可访问 https://github.com/micropython/micropython/blob/master/README.md#micropython-design-values
在本机发射器组件中,RISC-V 32位发射器有一个新的架构标志“zcmp”,该标志可为支持压缩指令的 RV32 启用。启用此标志后,Zcmp 操作码将用于函数 prologues 和 epilogues。此外,还对生成的本机代码进行了一些优化,并增加了对窗口内核(如esp32)上内联 Xtensa 汇编器的支持。此外,现在可以在构建时配置MicroPython,使其能够在未启用本机发射器的情况下从.mpy文件加载本机代码。
与往常一样,测试套件的开发工作仍在继续,使其对目标故障更具鲁棒性,能够更好地跳过无法在目标上运行的测试,并在更广泛的目标范围内一致运行。所有这些都有助于保持MicroPython代码库的高质量。
ROM 文件系统和 VfsRom 类已在更多硬件上启用,具体包括:mimxrt、nrf、renesas-ra 以及 samd(包括SAMD21和SAMD51)。
alif 已将 alif_ensemble-cmsis-dfp 库更新至v1.3.4版本,支持将外部闪存置于休眠状态,并改进了对深度休眠省电模式的支持,可通过GPIO下降沿或RTC报警从深度休眠中唤醒(后者可通过machine.deepsleep()函数的standard timeout_ms参数实现)。如上所述,此移植现在可通过标准的machine.PWM接口支持PWM,并在PWM构造函数中提供了freq()、duty_u16()和duty_ns()方法以及invert关键字参数。它有11个独立定时器,支持22个PWM输出。
esp32移植版新增了一个LDO驱动,并启用了Zcmp操作码,这两项功能均适用于ESP32-P4 SoC。os.dupterm()的读取功能得到了改进(现在无需再调用os.dupterm_notify()),并且修复了各种错误。ESP-IDF从v5.3版本到v5.5.1版本的支持已得到巩固,而v5.3以下版本的IDF支持现已被移除。
mimxrt移植版现在实现了标准的machine.Counter和machine.Encoder类,并增加了一些新功能,如:最小/最大计数器值、索引、重置和匹配引脚、支持循环计数以及支持IRQ回调。通用文档和mimxrt快速参考已更新,以描述这些新增功能。此外还将nxp_driver SDK更新为MCUX_2.16.100,增加了对PSRAM的支持,以及对DP83867 PHY以太网的支持,并将RTC的分辨率从1秒提高到1/32768秒。
rp2移植版已将pico-sdk更新至2.2.0版本,并在此过程中将所有随机数生成器(RNG)源从ROSC切换至新的pico_rand组件。此外,该端口还为RV32模式下的RP2350启用了Zcmp操作码。
如上所述,stm32移植版现在提供了标准的machine.PWM类,该类适用于支持的所有14个MCU系列。freq()、duty_u16()和duty_ns()方法以及输出反转功能均可用。采用了一种启发式方法,为每个可支持PWM的引脚静态分配一个TIM和通道,并且选择该启发式方法以最大化独立PWM输出的数量。新的machine.CAN实现可用于具有bxCAN或FD-CAN外设的MCU,但尚不支持灵活的数据速率。
本次发布新增的开发板:
- esp32 port: SPARKFUN_THINGPLUS_ESP32C5 and SEEED_XIAO_ESP32C6;
- mimxrt port: PHYBOARD_RT1170;
- rp2 port: CYTRON_NANOXRP_CONTROLLER, CYTRON_MOTION_2350_PRO, WAVESHARE_RP2350B_CORE, WAVESHARE_RP2040_LCD_0_96, WAVESHARE_RP2040_PLUS, WAVESHARE_RP2040_ZERO and SEEED_XIAO_RP2040;
- stm32 port: NUCLEO_H753ZI and WEACTSTUDIO_MINI_STM32U585.
自上一版本以来,针对特定版本的代码大小变化为(文本部分的绝对和百分比变化):
bare-arm: -52 -0.092%minimal x86: -321 -0.173% unix x64: -104 -0.012% (standard variant) stm32: +7028 +1.782% (PYBV10 board) esp32: +844 +0.048% (ESP32_GENERIC board) mimxrt: +10072 +2.685% (TEENSY40 board) renesas-ra: +1816 +0.289% (EK_RA6M2 board) nrf: +1788 +0.947% (PCA10040 board) rp2: +356 +0.104% (RPI_PICO board) rp2: -1552 -0.172% (RPI_PICO2_W board) samd: +3492 +1.288% (ADAFRUIT_ITSYBITSY_M4_EXPRESS board)
代码大小变化的主要原因有:
- bare-arm、最小x86、unix x64:将一些元组和列表辅助函数内联
- stm32:添加新的
machine.PWM 和 machine.CAN 类 - esp32:为TLS套接字使用详细的错误字符串,并进行各种小的修复
- mimxrt:支持 VfsRom 文件系统,支持 t-strings,添加新的
machine.Counter 和 machine.Encoder 类 - renesas-ra:支持 VfsRom 文件系统
- rp2:将随机数生成器(RNG)源切换至 pico_rand,减少引脚结构的占用空间
- samd:支持 VfsRom 文件系统,支持 t-strings
感谢所有为此版本做出贡献的人:Alessandro Gatti、Algy Tynan、Alon Bar-Lev、Andrew Leech、Angus Gratton、Anson Mansfield、Antonio Galea、Artem Makarov、Chris Webb、Damien George、Daniël van de Giessen、Didier C、Dryw Wade、Elvis Pfutzenreuter、EngWill、FH、Fin Maaß、iabdalkader、Jack Whitham、Jacob Williams、Jeff Epler、jetpax、Jos Verlinde、Koudai Aono、Kwabena W. Agyeman、Matt Trentini、Matthias Urlichs、mdaeron、Michel Le Bihan、Ned Konz、Oliver Joos、Paul Grayson、Peter Harper、Phil Howard、robert-hh、stijn、sync-on-luma、Thomas Kiss、Thomas Propst、Yuuki NAGAO。
MicroPython 是一个全球开源项目,贡献者来自以下时区:-0800、-0700、-0600、-0500、-0400、-0300、+0000、+0100、+0200、+0300、+0800、+0900、+1000、+1100。
本次发布的工作部分由 GitHub 赞助商资助,部分资金来自 George Robotics、Espressif、Arduino、OpenMV 和 Planet Innovation。
完整说明:https://github.com/micropython/micropython/releases/tag/v1.28.0