MicroPython 的 Zephyr 移植版指南:在资源受限设备上运行 MicroPython RTOS 端口的构建、硬件控制与存储
嵌入式语言运行时编程语言解释器编译器物联网系统编程【免费下载链接】micropythonMicroPython - a lean and efficient Python implementation for microcontrollers and constrained systems项目地址https://gitcode.com/gh_mirrors/mi/micropython点击查看免费下载MicroPython 的 Zephyr 移植版Zephyr port是一个将 MicroPython 解释器运行于 Zephyr RTOS 之上的官方移植实现。本指南以 docs/zephyr/general.rst 为主线结合 ports/zephyr/README.md 与 ports/zephyr/ 目录下的源码、板级配置系统讲解该移植版的背景定位、环境搭建、构建运行流程、REPL 交互、GPIO 等硬件外设编程、文件系统与存储以及最小化构建与源码级实现细节。读完本文你将能够基于任意受 Zephyr 支持的开发板独立完成 MicroPython 固件的编译、烧录与硬件控制程序的编写。一、Zephyr 移植版概述面向多架构 RTOS 的 MicroPythonZephyr 项目 是由 Linux 基金会主办的协作项目是一个开源、可扩展、面向资源受限设备的实时操作系统RTOS支持多种架构。MicroPython 的 Zephyr 移植版正是将 MicroPython 运行时作为 Zephyr 应用程序运行从而让开发者用 Python 直接驱动 Zephyr 的设备树devicetree、GPIO、I2C/SPI 总线、传感器、网络与文件系统。从 ports/zephyr/README.md 可知该移植版目前支持 Zephyr 上游支持的所有版本即当前 v3.7LTS、v4.4 及开发分支CI 使用最新版本v4.4进行验证。其当前已支持的功能包括通过 Zephyr UART 控制台提供 REPL 交互提示符time模块用于时间测量与延时machine.Pin类用于 GPIO 控制支持中断IRQmachine.I2C、machine.SPI、machine.PWM、machine.ADC等外设控制类socket模块用于网络通信IPv4/IPv6zsensor模块用于读取传感器数据冻结模块Frozen modules支持可将 Python 模块包括完整应用随固件打包并支持开机自启基于 DiskAccess 或 FlashAreaflash map的虚拟文件系统支持 FAT 与 littlefs 两种格式。板级支持情况Zephyr OS 支持来自不同来源的大量模块与开发板。所有具备标准功能支持如 UART 控制台的 Zephyr 板卡理论上都应能运行 MicroPython但并非全部经过测试。官方文档以FRDM-K64F作为参考板因此 ports/zephyr/boards/ 目录下以frdm_k64f.conf等板级配置与各manifest.py冻结清单代表了经过实际测试并启用了额外选项如文件系统支持的板卡集合。若使用其他板卡建议准备好该板的数据手册datasheet、原理图等参考资料以便查询引脚编号、外设实例等细节。同时docs/zephyr/tutorial/pins.rst 也明确指出引脚编号需参照板卡数据手册或 Zephyr 文档进行换算。二、构建环境准备安装 Zephyr SDK 与源码构建 Zephyr 移植版首先需要安装 Zephyr 开发环境。官方步骤详见 ports/zephyr/README.md包括安装 Zephyr SDK、获取 Zephyr 源码并配置开发环境。建议先编译 Zephyr 自带的示例应用验证环境正确无误。若已有 Zephyr 环境但构建 MicroPython 移植版出现问题可以按指定版本重新初始化$ west init zephyrproject -m https://github.com/zephyrproject-rtos/zephyr --mr v4.4.0如果不想重做整个安装仅在 master 与标签版本之间切换可以进入 Zephyr 源码目录执行$ cd zephyrproject/zephyr $ git checkout v4.4.0 $ west updateZephyr 安装完成后可能需要先配置环境例如 source 环境脚本$ source zephyrproject/zephyr/zephyr-env.sh源码级视角从 Zephyr 工程到 MicroPython 应用Zephyr 移植版在构建层面是一个标准的 Zephyr 应用程序。从 ports/zephyr/CMakeLists.txt、ports/zephyr/Kconfig、ports/zephyr/prj.conf 等文件可以看出MicroPython 核心py/目录以库的形式链接进 Zephyr 应用并通过 Kconfig 选项如CONFIG_MICROPY_HEAP_SIZE、CONFIG_MICROPY_CONFIG_ROM_LEVEL_FULL_FEATURES等配置堆大小与功能裁剪。主入口位于 ports/zephyr/main.c负责在 Zephyr 线程上下文中启动 MicroPython 运行时。三、构建与烧录固件构建 MicroPython Zephyr 移植版与构建其他 Zephyr 应用完全相同且不要求在ports/zephyr目录内进行——你可以在文件系统的任意位置执行west build。假设已将 MicroPython 仓库克隆到主目录下为frdm_k64f板构建$ west build -b frdm_k64f ~/micropython/ports/zephyr为 QEMUx86 模拟器构建$ west build -b qemu_x86 ~/micropython/ports/zephyr若需要启用_thread线程模块可追加thread.conf覆盖配置$ west build -b frdm_k64f ~/micropython/ports/zephyr -DOVERLAY_CONFIGthread.confports/zephyr/thread.conf 即为该移植版提供的线程模块配置样例。烧录与运行固件构建完成后烧录到开发板$ west flash如需在烧录后启动 gdb 调试会话$ west debug对于 QEMU 类板卡如qemu_x86、qemu_cortex_m3直接运行$ west build -t run网络注意事项默认配置启用了网络功能。在 QEMU 中运行时需要按照 Zephyr 文档的指引配置宿主机端的 TAP/SLIP 网络。若出现如下报错could not connect serial device to character backend unix:/tmp/slip.sock即表示宿主机网络后端未正确配置。如果不希望做额外网络设置而快速运行可以使用下面介绍的最小化构建minimal build。四、最小化构建Minimal Build控制在 128KB 以内MicroPython 承诺将 Zephir 移植版的二进制体积维持在128KB 以下前提是 Zephyr 自身内核体积保持稳定。在此体积下除了 UART 上的 REPL 之外不支持任何 Zephyr 高级特性仅包含极简的内置 Python 模块集合。因此该构建适合代码体积控制、小型系统上的快速演示以及按需逐个启用功能以达到所需功能与体积平衡的场景——这与默认构建会随时间逐步增加功能形成对比。执行最小化构建$ west build -b qemu_x86 ~/micropython/ports/zephyr -- -DCONF_FILEprj_minimal.conf其中 ports/zephyr/prj_minimal.conf 是极简配置文件与 ports/zephyr/mpconfigport_minimal.h 相配合裁剪掉大量模块与功能。构建完成后无需 TAP 网络设置即可在 QEMU 中运行$ west build -t run五、REPL进入交互式 Python 环境REPLRead-Eval-Print Loop是 MicroPython 的交互式提示符。在 Zephyr 移植版中REPL 通过由zephyr,console设备树节点指定的 UART 串口外设提供波特率为115200详见 docs/zephyr/tutorial/repl.rst。若板卡带有 USB 转串口芯片可直接在 PC 上访问。Linux/macOS 下使用screen连接screen /dev/ttyACM0 115200也可尝试picocom或minicom。若提示设备不存在可改用/dev/ttyACM1或更高编号必要时可能需要加入uucp或dialout用户组或使用 sudo。Windows 用户可使用 puTTY 等终端软件通过相应 COM 口建立串行会话。首次启动输出打开串口后按回车或复位板卡将看到类似如下提示*** Booting Zephyr OS build v4.4.0 *** MicroPython v1.29.0-preview.69.g8a56be6660 on 2026-04-27; zephyr-frdm_k64f with mk64f12 Type help() for more information. 此时即可在提示符后输入 MicroPython 代码。先用print验证环境 print(hello world!) hello world!再尝试基本运算与字符串操作 1 2 3 1 / 2 0.5 3 * Zephyr ZephyrZephyrZephyrREPL 下方的 UART 字节流由 ports/zephyr/zephyr_getchar.c 与 ports/zephyr/zephyr_getchar.h 提供底层支撑将 Zephyr 控制台输入输出与 MicroPython 运行时对接起来。六、GPIO 引脚编程端口号与引脚号的 Tuple 约定在 Zephyr 移植版中machine.Pin的初始化使用(端口, 引脚号)元组作为id值详见 docs/zephyr/tutorial/pins.rst。例如初始化 FRDM-K64F 板上的红色 LEDPTB22LED Pin((GPIO_1, 22), Pin.OUT)不同板卡的端口命名与编号不同常见格式对照如下板卡引脚元组格式frdm_k64f红色 LED PTB22(GPIO_1, 22)96b_carbonLED1 PD2(GPIOD, 2)mimxrt685_evk_cm33绿色 LED PIO0_14(GPIO0, 14)在源码层面ports/zephyr/machine_pin.c 的mp_pin_make_new第 117 行附近会解析该元组若格式不符会抛出Pin id must be tuple of (GPIO_x, pin#)的ValueError。Zephyr 的GPIO_*常量被直接映射为 MicroPython 的Pin模式常量例如Pin.IN对应GPIO_INPUT、Pin.OUT对应GPIO_OUTPUT | GPIO_INPUT、Pin.OPEN_DRAIN对应GPIO_OPEN_DRAIN上拉/下拉Pin.PULL_UP/Pin.PULL_DOWN与中断触发IRQ_RISING/IRQ_FALLING同样一一对应。引脚初始化与读写完整示例来自 docs/zephyr/quickref.rstfrom machine import Pin pin Pin((gpiob, 21), Pin.IN) # 在 GPIO B 端口创建输入引脚 print(pin) # 打印引脚端口与编号 pin.init(Pin.OUT, Pin.PULL_UP, value1) # 重新初始化引脚 pin.value(1) # 置高 pin.value(0) # 置低 pin.on() # 置高 pin.off() # 置低 pin Pin((gpiob, 21), Pin.IN) pin Pin((gpiob, 21), Pin.OUT, value1) # 创建时即置高 pin Pin((gpiob, 21), Pin.IN, Pin.PULL_UP) # 使能内部上拉 switch Pin((gpioc, 6), Pin.IN) # 为开关创建输入引脚 switch.irq(lambda t: print(SW2 changed)) # 状态变化时触发中断注意源码中machine_pin_obj_init_helper第 77 行附近会尝试按GPIO_OUTPUT | GPIO_INPUT配置引脚对于不支持该组合的目标如 frdm_k64f会回退为仅GPIO_OUTPUT第 105-107 行这一兼容性处理保证了两类板卡都能正常工作。LED 闪烁示例FRDM-K64Fimport time from machine import Pin LED Pin((gpiob, 21), Pin.OUT) while True: LED.value(1) time.sleep(0.5) LED.value(0) time.sleep(0.5)上面代码使用 FRDM-K64F 的端口 B、引脚 21。Zephyr 约定中端口通过设备树节点标签标识其他板卡需依据其参考资料调整。在 REPL 中执行时可先按CtrlE进入粘贴模式粘贴代码后按CtrlD结束粘贴并开始执行。引脚中断IRQZephyr 移植版通过machine.Pin.irq()支持引脚中断。以 FRDM-K64F 的 SW2/SW3 按键为例from machine import Pin SW2 Pin((gpioc, 6), Pin.IN) SW3 Pin((gpioa, 4), Pin.IN) SW2.irq(lambda t: print(SW2 changed)) SW3.irq(lambda t: print(SW3 changed)) while True: passpins.rst 中给出的写法为(GPIO_2, 6)/(GPIO_0, 4)两种命名均符合 Zephyr 端口设备树节点标签的约定。底层由 machine_pin.c 的machine_pin_irq第 191 行附近调用 Zephyrgpio_pin_interrupt_configure()实现中断使能/禁用默认触发方式为GPIO_INT_EDGE_BOTH即双边沿。七、时间、PWM、I2C、SPI 与 ADC 外设时间与延时使用time模块docs/zephyr/quickref.rstimport time time.sleep(1) # 睡眠 1 秒 time.sleep_ms(500) # 睡眠 500 毫秒 time.sleep_us(10) # 睡眠 10 微秒 start time.ticks_ms() # 获取毫秒计数器 delta time.ticks_diff(time.ticks_ms(), start) # 计算时间差该模块在 ports/zephyr/modtime.c 中实现底层基于 Zephyr 内核时钟。PWMPWM 通过machine.PWM类访问from machine import PWM pwm PWM((pwm0, 0), freq3921568, duty_ns200, invertTrue) # 在 PWM0 上创建 PWM print(pwm) # 打印 PWM 对象 print(pwm.duty_ns()) # 打印以纳秒为单位的占空比 pwm.duty_ns(255) # 设置新的占空比纳秒 pwm.deinit()对应实现位于 ports/zephyr/machine_pwm.c。注意duty_ns的语义读取时返回当前占空比纳秒值写入时设置新占空比。硬件 I2Cfrom machine import I2C i2c I2C(i2c0) # 构造 I2C 总线设备树节点标签 print(i2c) # 打印设备名 i2c.scan() # 扫描总线上可用的 I2C 从设备 i2c.readfrom(0x1D, 4) # 从地址 0x1D 读 4 字节 i2c.readfrom_mem(0x1D, 0x0D, 1) # 从 0x1D 的寄存器 0x0D 读 1 字节 i2c.writeto(0x1D, babcd) # 向 0x1D 写数据 i2c.writeto_mem(0x1D, 0x0D, bab) # 向 0x1D 的寄存器 0x0D 写数据 buf bytearray(8) # 创建 8 字节缓冲区 i2c.writeto(0x1D, babcd) # 向 0x1D 写数据实现见 ports/zephyr/machine_i2c.c。例如在 FRDM-K64F 上扫描 I2C 从设备from machine import I2C i2c I2C(i2c0) i2c.scan()硬件 SPIfrom machine import SPI spi SPI(spi0) # 默认配置构造 SPI 总线 spi.init(baudrate100000, polarity0, phase0, bits8, firstbitSPI.MSB) # 设置配置 # 等价写法构造时同时设置配置 spi SPI(spi0, baudrate100000, polarity0, phase0, bits8, firstbitSPI.MSB) print(spi) # 打印设备名与总线配置 spi.read(4) # 在 MISO 上读 4 字节 spi.read(4, write0xF) # 读 4 字节同时在 MOSI 上写 0xF buf bytearray(8) spi.readinto(buf) # 读入缓冲区读取字节数等于缓冲区大小 spi.readinto(buf, 0xF) # 读入缓冲区同时在 MOSI 上写 0xF spi.write(babcd) # 在 MOSI 上写 4 字节 buf bytearray(4) spi.write_readinto(babcd, buf) # MOSI 写、MISO 读入缓冲区 spi.write_readinto(buf, buf) # 写 buf 并读回 buf实现见 ports/zephyr/machine_spi.c。例如向 MOSI 写缓冲区from machine import SPI spi SPI(spi0) spi.init(baudrate500000, polarity1, phase1, bits8, firstbitSPI.MSB) spi.write(babcd)ADC使用machine.ADC读取引脚模拟值前提是zephyr,user设备树节点包含包含所有 ADC 通道的io-channels属性from machine import ADC adc ADC((adc, 0)) adc.read_uv()read_uv()返回以微伏µV为单位的电压值实现见 ports/zephyr/machine_adc.c。八、传感器zsensor与显示Displayzsensor 传感器模块zsensor.Sensor类用于读取传感器数据docs/zephyr/quickref.rstimport zsensor from zsensor import Sensor accel Sensor(fxos8700) # 为加速度计创建传感器对象设备树节点名 accel.measure() # 获取一次测量读数 accel.get_float(zsensor.ACCEL_X) # 以浮点数获取 X 轴测量值 accel.get_millis(zsensor.ACCEL_Y) # 以百万分之一为单位获取 Y 轴测量值 accel.get_micro(zsensor.ACCEL_Z) # 以千分之一为单位获取 Z 轴测量值 accel.get_int(zsensor.ACCEL_X) # 仅获取 X 轴整数测量值get_int/get_float/get_millis/get_micros的参数是zsensor模块中的通道 ID 常量如ACCEL_X、ACCEL_Y、ACCEL_Z。通过attr_set可设置传感器属性如量程与采样率以 XIAO BLE NRF52840 SENSE 板上的lsm6ds3tr_c为例from zsensor import * accel Sensor(lsm6ds3tr_c) # 设备树中的名称 # 设置满量程为 2g19.613300 m/s^2单位微米/秒^2以浮点数给出 accel.attr_set(ACCEL_XYZ, ATTR_FULL_SCALE, 19.613300) # 设置采样频率为 104 Hz以整数对给出 accel.attr_set(ACCEL_XYZ, ATTR_SAMPLING_FREQUENCY, 104, 0) accel.measure() accel.get_float(ACCEL_X) # -0.508 (m/s^2) accel.get_float(ACCEL_Y) # -3.62 (m/s^2) accel.get_float(ACCEL_Z) # 9.504889 (m/s^2)attr_set/attr_get_*使用的属性 ID 是zsensor模块中命名为ATTR_*的常量例如ATTR_FULL_SCALE、ATTR_SAMPLING_FREQUENCY。另有attr_get_float、attr_get_int、attr_get_millis、attr_get_micros等读取方法但许多传感器不支持读取属性full_scale accel.attr_get_float(ATTR_FULL_SCALE)实现见 ports/zephyr/modzsensor.c其内部通过 Zephyr 的 Sensor 子系统 API 与设备树传感器节点交互。Display 显示模块zephyr.Display类控制 Zephyr 提供的显示设备可与framebuf模块配合绘制内容import zephyr, framebuf # 通过节点标识符创建 Display 实例 display zephyr.Display(ssd13063c) # 创建与显示器格式匹配的 FrameBuffer128x64单色 fb framebuf.FrameBuffer(bytearray(int(64*128/8)), 128, 64, framebuf.MVLSB) # 关闭消隐 display.blanking(False) # 向 framebuf 写文本 fb.text(Hello World, 0, 0, 1) # 将 framebuf 缓冲区写入显示器 display.write(fb)也可以让Display对象直接生成与当前配置匹配的 FrameBufferimport zephyr, framebuf # 为配置的第一个显示器创建 Display 实例 display zephyr.Display(0) display.blanking(False) # 获取与当前配置匹配的 FrameBuffer fb display.as_framebuf() fb.text(Hello World, 0, 0, 1) fb.show()底层实现见 ports/zephyr/zephyr_display.c它包装了 Zephyr 的 Display API。九、文件系统与存储DiskAccess 与 FlashAreaZephyr 移植版的存储子系统支持基于 FAT 与 littlefs 的虚拟文件系统VFS底层由 Zephyr 的DiskAccess磁盘访问 API或FlashAreaflash map 闪存分区 API支撑具体取决于板卡支持哪种详见 docs/zephyr/tutorial/storage.rst。核心实现位于 ports/zephyr/zephyr_storage.c、ports/zephyr/zephyr_filesystem.c 与 ports/zephyr/zephyr_device.c。启动时自动挂载MicroPython 在 Zephyr 上启动时会自动尝试挂载可用存储闪存存储若可用自动以 littlefs2 文件系统挂载到/flash。若文件系统不存在则自动创建。磁盘存储如 SD 卡自动检测并挂载到/磁盘名如/sd。工作目录若有挂载的磁盘则设为磁盘目录否则若闪存可用则设为/flash。模块搜索路径sys.path会自动加入每个已挂载磁盘的/磁盘/lib以及闪存的/flash/lib。该自动挂载由启动时的_boot.py模块执行见 ports/zephyr/modules/_boot.py。对大多数使用场景而言无需手动挂载文件系统。使用 DiskAccess 访问 SD 卡zephyr.DiskAccess类基于 Zephyr Disk Access API 实现vfs.AbstractBlockDev协议用于访问 SD 卡等存储设备。SD 卡在启动时即须存在且不能拔除启动时会被自动检测并由文件系统初始化。可用磁盘名通过DiskAccess.disks属性获取例如(SDHC,)或(SD,)。以 mimxrt1050_evk 板上 FatFS SD 卡为例import vfs from zephyr import DiskAccess # 列出可用磁盘 print(DiskAccess.disks) # 例如 (SDHC,) bdev DiskAccess(SDHC) # 用 DiskAccess 创建块设备对象 vfs.VfsFat.mkfs(bdev) # 用磁盘块创建 FAT 文件系统 vfs.mount(bdev, /sd) # 挂载到 /sd 目录 with open(/sd/hello.txt,w) as f: # 新建文件 f.write(Hello world) # 写入内容 print(open(/sd/hello.txt).read()) # 读取并打印文件内容使用 FlashArea 访问闪存分区zephyr.FlashArea类基于 Zephyr Flash map API 实现vfs.AbstractBlockDev协议适合实现底层存储系统或定制文件系统配置。可用分区名通过FlashArea.areas字典获取将分区标签映射到分区 ID例如{storage: 1, scratch: 4}。以 reel_board 或 rv32m1_vega_ri5cy 板的内置闪存为例import vfs from zephyr import FlashArea # 列出可用闪存分区 print(FlashArea.areas) # 例如 {storage: 1, scratch: 4} bdev FlashArea(FlashArea.areas[storage], 4096) # 用 FlashArea 创建块设备对象 vfs.VfsLfs2.mkfs(bdev) # 创建 littlefs 文件系统 vfs.mount(bdev, /flash) # 挂载到 /flash with open(/flash/hello.txt,w) as f: # 新建文件 f.write(Hello world) # 写入内容 print(open(/flash/hello.txt).read()) # 读取并打印文件内容注意事项FlashArea.areas字典中的分区信息来自 Zephyr 设备树擦除块大小取自闪存控制器的erase-block-size属性未指定该属性的设备如 QSPI NOR 闪存默认取 4096 字节见 ports/zephyr/README.md。大多数情况下闪存分区已在启动时自动挂载到/flash并自动创建文件系统无需手动挂载。对于 MicroPython 应用占用了默认 flash storage 分区的板卡如 frdm_k64f应将storage替换为scratch分区使用。使用 Zephyr 原生文件系统除 MicroPython 自带的 VFS 外移植版还提供第二种方案直接使用 Zephyr 的文件系统管理从而在 Zephyr 与 MicroPython 代码之间共享文件访问。需要启用以下 Kconfig 选项CONFIG_FLASH_MAPy # 文件系统子系统的前置要求 CONFIG_FILE_SYSTEMy # 启用文件系统子系统 CONFIG_FILE_SYSTEM_LITTLEFSy # 在 Zephyr 中启用 littlefs 支持 CONFIG_FILE_SYSTEM_MKFSy # 允许创建新文件系统随后在设备树 overlay 中增加 fstab 节点例如fstab { compatible zephyr,fstab; lfs2: lfs2 { compatible zephyr,fstab,littlefs; mount-point /flash; partition storage_partition; read-size16; prog-size4096; cache-size4096; lookahead-size32; block-cycles4; }; };之后即可像普通 MicroPython 文件系统一样使用import vfs, zephyr zfs zephyr.FileSystem(zephyr.FileSystem.fstab()[0]) vfs.mount(zfs, /zephyr)若想节省空间可禁用 MicroPython 自带的文件系统代码CONFIG_MICROPY_VFS_FATn CONFIG_MICROPY_VFS_LFS1n CONFIG_MICROPY_VFS_LFS2n十、源码结构速览与自定义配置Zephyr 移植版的源码组织如下便于进一步深入ports/zephyr/main.c启动入口在 Zephyr 线程中初始化并运行 MicroPython。ports/zephyr/modmachine.c、ports/zephyr/modmachine.hmachine模块注册。ports/zephyr/machine_*.cPin、machine_adc.c、machine_i2c.c、machine_spi.c、machine_pwm.c、machine_timer.c、machine_uart.c、machine_wdt.c各类硬件外设绑定。ports/zephyr/modzephyr.c、ports/zephyr/modzephyr.hzephyr模块含FlashArea、DiskAccess、Display、FileSystem等。ports/zephyr/modzsensor.czsensor传感器模块。ports/zephyr/modsocket.csocket网络模块。ports/zephyr/mpthreadport.c_thread线程支持。ports/zephyr/boards/各测试板卡的.conf覆盖配置与冻结清单manifest.py。ports/zephyr/prj.conf 与 ports/zephyr/prj_minimal.conf默认与最小化配置。板级.conf文件展示了 MicroPython 移植版的可裁剪性。例如 ports/zephyr/boards/frdm_k64f.conf 启用了网络CONFIG_NET_L2_ETHERNETy、I2C/PWM/SPI、FXOS8700 传感器驱动、闪存支持CONFIG_FLASHy、CONFIG_FLASH_MAPy、CONFIG_MPU_ALLOW_FLASH_WRITEy并设置堆大小CONFIG_MICROPY_HEAP_SIZE114688而 ports/zephyr/boards/ai_m61_32s_kit.conf 等 bflb 系列板卡则通过CONFIG_MICROPY_FROZEN_MANIFESTboards/bflb/manifest.py冻结模块并按需裁剪 VFS 组件CONFIG_MICROPY_VFS_FATy、CONFIG_MICROPY_VFS_LFS1n、CONFIG_MICROPY_VFS_LFS2n。CONFIG_MICROPY_HEAP_SIZE直接控制 MicroPython GC 堆大小是平衡内存占用与可用功能的关键旋钮。十一、快速示例汇总将以下片段复制到剪贴板在 REPL 中按CtrlE进入粘贴模式执行CtrlD结束并运行闪烁 LEDimport time from machine import Pin LED Pin((gpiob, 21), Pin.OUT) while True: LED.value(1) time.sleep(0.5) LED.value(0) time.sleep(0.5)按键中断from machine import Pin SW2 Pin((gpioc, 6), Pin.IN) SW3 Pin((gpioa, 4), Pin.IN) SW2.irq(lambda t: print(SW2 changed)) SW3.irq(lambda t: print(SW3 changed)) while True: passI2C 扫描from machine import I2C i2c I2C(i2c0) i2c.scan()SPI 写缓冲区from machine import SPI spi SPI(spi0) spi.init(baudrate500000, polarity1, phase1, bits8, firstbitSPI.MSB) spi.write(babcd)ADC 读取微伏值from machine import ADC adc ADC((adc, 0)) adc.read_uv()十二、相关文档导航围绕 Zephir 移植版仓库还提供了以下配套资料可进一步阅读docs/zephyr/quickref.rst快速参考引脚、PWM、I2C/SPI、ADC、存储、传感器、显示。docs/zephyr/tutorial/index.rst入门教程索引。docs/zephyr/tutorial/intro.rst环境要求与固件获取、部署概述。docs/zephyr/tutorial/repl.rstREPL 使用详解。docs/zephyr/tutorial/pins.rstGPIO 引脚与中断。docs/zephyr/tutorial/storage.rst文件系统与存储。ports/zephyr/README.md构建、烧录、运行与最小化构建指南。总体而言Zephyr 移植版把 Zephyr 的板级抽象设备树、驱动子系统与 MicroPython 的易用性结合在一起对开发者而言选择一块 Zephyr 官方支持的开发板遵循本文构建流程即可获得一个可通过 UART REPL 交互、可编程 GPIO/总线外设、可挂载文件系统的 Python 环境对产品原型与教学演示而言最小化构建与冻结模块机制则为体积敏感场景提供了精准裁剪的途径。赞分享嵌入式语言运行时编程语言解释器编译器物联网系统编程【免费下载链接】micropythonMicroPython - a lean and efficient Python implementation for microcontrollers and constrained systems项目地址https://gitcode.com/gh_mirrors/mi/micropython点击查看免费下载相关推荐oh-my-pi pi-nativesN-API 绑定层与 24 个原生模块逐一解读oh my pi pi nativesN API 绑定层与 24 个原生模块逐一解读 oh my pi 是一个「把 IDE 能力直接接进去」的编码代理Cod嵌入式语言运行时编程语言解释器编译器物联网系统编程MicroPython on Zephyr 端口入门环境准备、固件构建与快速上手实践MicroPython on Zephyr 端口入门环境准备、固件构建与快速上手实践 本文以 MicroPython 仓库中 Zephyr 端口入门教程 ht嵌入式语言运行时编程语言解释器编译器物联网系统编程Zephyr 移植指南在 NXP i.MX91 QSB 开发板上构建与启动 Zephyr RTOSZephyr 移植指南在 NXP i.MX91 QSB 开发板上构建与启动 Zephyr RTOS 本文以 Zephyr 仓库中 boards/nxp/imx操作系统嵌入式RTOS物联网上一篇ngx_brotli性能监控如何实时追踪压缩比率和效果下一篇不装证书也能抓HTTPSeCapture函数钩子拦截SSL流量原理深度解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Argo Workflows 使用 Azure AD(Entra ID)令牌认证 Azure Database for PostgreSQL 实战指南

Argo Workflows 使用 Azure AD(Entra ID)令牌认证 Azure Database for PostgreSQL 实战指南

Argo Workflows 使用 Azure AD(Entra ID)令牌认证 Azure Database for PostgreSQL 实战指南 【免费下载链接】argo-workflows Workflow Engine for Kubernetes 项目地址: https://gitcode.com/gh_mirrors/ar/argo-workflows Argo Workflows 自 v4…

2026/9/21 15:37:43 阅读更多 →
sentence-transformers 多向量编码器评估指南:MultiVectorEncoder 的 MaxSim 评测体系与 NanoBEIR 实战

sentence-transformers 多向量编码器评估指南:MultiVectorEncoder 的 MaxSim 评测体系与 NanoBEIR 实战

sentence-transformers 多向量编码器评估指南:MultiVectorEncoder 的 MaxSim 评测体系与 NanoBEIR 实战 【免费下载链接】sentence-transformers State-of-the-Art Embeddings, Retrieval, and Reranking 项目地址: https://gitcode.com/gh_mirrors/se/sentence-t…

2026/9/21 15:37:43 阅读更多 →
rrweb 录制存储优化实战:DOM 屏蔽、sampling 抽样、压缩与去冗全指南

rrweb 录制存储优化实战:DOM 屏蔽、sampling 抽样、压缩与去冗全指南

前端可观测性开发工具 【免费下载链接】rrweb record and replay the web 项目地址: https://gitcode.com/gh_mirrors/rr/rrweb 点击查看 免费下载 rrweb 以"录制即事件流"的方式工作,录制数据量与页面复杂度和用户交互频率成正比&#xff0c…

2026/9/21 15:36:42 阅读更多 →

最新新闻

C++类型系统与IO优化实战指南

C++类型系统与IO优化实战指南

1. 从C到C的类型系统演进在C语言中,类型系统相对简单直接,主要依赖基本数据类型和指针操作。这种设计虽然高效,但也带来了不少潜在风险。记得我刚接触C语言时,经常因为类型不匹配导致难以调试的内存错误。比如下面这个典型例子&am…

2026/9/21 16:13:16 阅读更多 →
PeerTube 多语言翻译指南:基于 Weblate 的协作流程、翻译文件体系与规范要点

PeerTube 多语言翻译指南:基于 Weblate 的协作流程、翻译文件体系与规范要点

音视频视频后端前端 【免费下载链接】PeerTube ActivityPub-federated video streaming platform using P2P directly in your web browser 项目地址: https://gitcode.com/gh_mirrors/pe/PeerTube 点击查看 免费下载 PeerTube 是一个基于 ActivityPub 联邦协议的分…

2026/9/21 16:13:16 阅读更多 →
Apache MXNet 贡献者 Git 实战指南:Fork 同步、冲突解决、提交整理与历史恢复全流程

Apache MXNet 贡献者 Git 实战指南:Fork 同步、冲突解决、提交整理与历史恢复全流程

Apache MXNet 贡献者 Git 实战指南:Fork 同步、冲突解决、提交整理与历史恢复全流程 【免费下载链接】mxnet Lightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep Scheduler; for Python, R, Julia, Scal…

2026/9/21 16:13:16 阅读更多 →
Task 环境变量完全指南:使用 TASK_ 前缀配置 Taskfile 构建工具

Task 环境变量完全指南:使用 TASK_ 前缀配置 Taskfile 构建工具

Task 环境变量完全指南:使用 TASK_ 前缀配置 Taskfile 构建工具 【免费下载链接】task A fast, cross-platform build tool inspired by Make, designed for modern workflows. 项目地址: https://gitcode.com/gh_mirrors/ta/task 导读 Task 是一个跨平台的…

2026/9/21 16:13:16 阅读更多 →
PouchDB 6.0.0 升级指南:移除旧 API、收紧依赖与视图沙箱化的全面解读

PouchDB 6.0.0 升级指南:移除旧 API、收紧依赖与视图沙箱化的全面解读

数据库数据同步 【免费下载链接】pouchdb :kangaroo: - PouchDB is a pocket-sized database. 项目地址: https://gitcode.com/gh_mirrors/po/pouchdb 点击查看 免费下载 本文基于仓库文档 docs/posts/2016-09-05-pouchdb-6.0.0.md 撰写,围绕 PouchDB 6…

2026/9/21 16:13:16 阅读更多 →
SkillOpt 完全指南:像训练神经网络一样训练 Agent 技能文档

SkillOpt 完全指南:像训练神经网络一样训练 Agent 技能文档

SkillOpt 完全指南:像训练神经网络一样训练 Agent 技能文档 【免费下载链接】SkillOpt SkillOpt is a text-space optimizer that trains reusable natural-language skills for frozen LLM agents through trajectory-driven edits, validation-gated updates, and…

2026/9/21 16:12:15 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →