一、什么是 MicroPython?
MicroPython 是面向微控制器的 Python 语言。借助 MicroPython,你可以编写 Python3 代码,甚至在资源受限的裸机架构上运行它。
💡 基础知识补充:
- 裸机架构:指没有操作系统(OS)、直接在硬件上运行程序的环境,资源(RAM、Flash 存储)非常有限,比如 ESP32、STM32 等单片机。
- Python3 兼容性:MicroPython 语法高度兼容 Python 3,大幅降低了嵌入式开发的学习门槛,让熟悉 Python 的开发者能快速上手硬件开发。
二、MicroPython 的核心亮点
- 紧凑高效:仅需 256k 代码空间和 16k RAM 即可运行,无需依赖操作系统(也可搭配 OS 使用)。
- 高度兼容:力求与标准 Python(即 CPython)语法、库尽可能兼容。
- 跨架构支持:支持 x86、x86-64、ARM、ARM Thumb、Xtensa(ESP32 采用)等主流嵌入式 CPU 架构。
- 交互式开发 :无需「编译 - 烧录 - 重启」的繁琐流程,通过 REPL(交互式提示符) 可直接输入命令并立即执行,实时调试代码。
- 生态流行:支持众多硬件平台,用户群体持续扩大,知名分支包括 CircuitPython(教育向)、MicroPython_ESP32_psRAM_LoBo(ESP32 优化版)。
- 嵌入式导向 :内置专门面向硬件的模块,例如
machine模块,可直接操作 I/O 引脚、ADC、串口(UART)、SPI、I2C、RTC、定时器等底层硬件。
💡 基础知识补充:
- REPL:Read-Eval-Print Loop(读取 - 求值 - 输出循环),类似 Python 的交互式终端,能实时验证代码,是嵌入式快速调试的核心工具。
- machine 模块:MicroPython 的核心硬件操作模块,封装了所有底层硬件外设的操作接口,是嵌入式开发的基础入口。
三、为什么选择「MicroPython + LVGL」?
MicroPython 本身没有成熟的原生高级 GUI 库,而LVGL(轻量级多功能图形库 **)** 是一款面向对象、基于组件的高级 GUI 库,非常适合映射到 Python 这类高级语言中。LVGL 由 C 语言实现,其 API 也是 C 语言风格。
💡 基础知识补充:
- LVGL:嵌入式领域最流行的开源 GUI 库之一,专为资源受限的微控制器设计,提供按钮、标签、列表、图表等丰富 UI 组件,支持动画、触摸交互等现代 GUI 特性。
- 面向对象 + 组件化:LVGL 允许通过组合基础组件(如按钮 + 标签)创建复杂界面,代码复用性高,维护更便捷。
四、使用「LVGL in MicroPython」的优势
- Python 语言开发 GUI:利用 Python 的面向对象、语法简洁等特性,降低 GUI 开发复杂度。
- 极短迭代周期 :
- C 语言开发 GUI:每次修改需经历「改代码 → 编译 → 烧录 → 运行」,流程繁琐耗时。
- MicroPython 开发 GUI:仅需「改代码 → 运行」,还可通过 REPL 交互式调试,大幅提升迭代效率。
- 抽象建模 GUI:可利用 Python 的继承、闭包、列表推导式等语言特性,构建更灵活、可复用的界面逻辑。
- 降低入门门槛:无需掌握 C 语言即可开发嵌入式 GUI,与 CircuitPython「教育优先」的愿景高度契合,让新手更容易入门嵌入式开发。
- 工具生态拓展:可基于此开发更高层级的工具,例如拖拽式 GUI 设计器。
五、「MicroPython + LVGL」的应用场景
- GUI 快速原型开发:快速搭建界面原型,验证交互逻辑。
- 界面微调迭代:实时调整界面样式、交互逻辑,无需编译烧录。
- 模块化界面设计:通过定义可复用的组合对象,构建复杂 GUI。
- 教育与科普:让零基础开发者快速体验嵌入式 GUI 开发。
- 工具开发:开发 LVGL 的可视化设计工具、调试工具等。
六、代码示例:Hello World
Bash
import lvgl as lv
lv.init()
scr = lv.obj()
btn = lv.btn(scr)
btn.align(lv.ALIGN.CENTER, 0, 0)
label = lv.label(btn)
label.set_text("Hello World!")
lv.screen_load(scr)
import lvgl as lv:导入 LVGL 库,别名为lv(简化调用)。lv.init():初始化 LVGL 图形库(必须第一步执行)。scr = lv.obj():创建屏幕根对象(所有 UI 组件的父容器)。btn = lv.btn(scr):在屏幕上创建一个按钮组件。btn.align(lv.ALIGN.CENTER, 0, 0):将按钮居中对齐,后两个参数为 X、Y 方向偏移量(此处为 0,即完全居中)。label = lv.label(btn):在按钮上创建一个标签组件(作为按钮的子元素)。label.set_text("Hello World!"):设置标签显示文本。lv.screen_load(scr):加载并显示该屏幕。
💡 基础知识补充:
- LVGL 采用父子对象模型 :所有 UI 元素都是
lv.obj的子类,通过父子关系构建界面层级(屏幕 → 按钮 → 标签)。align()方法:用于精准控制组件位置,lv.ALIGN.CENTER是最常用的居中对齐方式。
七、如何使用「MicroPython + LVGL」?
7.1 在线模拟器
链接地址:https://sim.lvgl.io/v9.0/micropython/ports/webassembly/index.html
7.2 PC 模拟器
MicroPython 的「unix」移植版允许在 Linux 机器上构建并运行 LVGL + MicroPython;Windows 用户可通过 WSL、VirtualBox 等工具模拟 Linux 环境。
7.3 嵌入式平台
最终目标是在真实硬件上运行,lv_micropython(MicroPython+LVGL 的分支)已支持:
- 平台:Linux、ESP32、STM32、RP2(树莓派 Pico)
- 显示驱动:SDL(Linux)、X11(Linux)、ILI9341/ILI9488/GC9A01/ST7789/ST7735(ESP32 / 通用)
- 输入驱动:SDL(Linux)、X11(Linux)、XPT2046/FT6X36(触摸)、ESP32 ADC(电阻触摸)
💡 基础知识补充:
- 驱动 :嵌入式 GUI 需要「显示驱动」(控制屏幕显示)和「输入驱动」(处理触摸 / 按键),
lv_micropython已封装主流硬件驱动,降低移植难度。- RP2:树莓派 Pico 系列的 RP2040 芯片,是低成本、高性能的入门级微控制器。
八、高级特性:自动生成绑定
- LVGL 是
lv_micropython的git 子模块(方便分离维护核心库与绑定代码)。 - 构建
lv_micropython时,工具会自动扫描 LVGL C API,生成对应的 Python API。 - 优势:无需手动编写绑定代码,保证 API 与 LVGL 核心库同步更新,支持任意 LVGL 版本。
九、内存管理(关键注意事项)
当 LVGL 在 MicroPython 中运行时,所有动态内存分配(lv_malloc())由 MicroPython 的垃圾回收(GC) 管理器处理。
9.1 问题场景
GC 无法感知数据段(Data Segment) 中的指针:
- 全局变量指针
- 静态全局变量指针
- 静态局部变量指针
这类指针若仅存储 lv_malloc() 返回的地址,会被 GC 误认为「无引用」而提前回收,导致内存崩溃。
9.2 解决方法
- 将全局 / 静态局部变量替换为
(LV_GLOBAL_DEFAULT()->_var) - 在使用该变量的文件中包含
lv_global.h - 在
lv_global.h的lv_global_t结构体中添加_var成员
💡 基础知识补充:
- 垃圾回收(GC):自动回收不再被引用的内存,避免内存泄漏,但静态 / 全局指针不在 GC 追踪范围内。
- 数据段:存储全局变量、静态变量的内存区域,生命周期与程序一致。
十、回调机制(交互核心)
在 C 语言中,回调是函数指针;但在 MicroPython 中,需要为每个回调同时注册函数指针和 Python 可调用对象,因此定义了一套回调规范:
10.1 核心原理
利用 void * user_data 字段,由 MicroPython「胶水代码」自动保存回调对应的 Python 对象:
- 注册回调时,胶水代码将 Python 对象存入
user_data - 触发回调时,胶水代码从
user_data中取出 Python 对象并执行
10.2 三种回调定义方式
user_data 放在结构体中 :结构体包含user_data,作为注册函数和回调函数的第一个参数。user_data 作为函数参数 :user_data作为注册函数和回调函数的最后一个参数。- 回调与
user_data 同为结构体成员 :结构体同时包含函数指针和user_data,函数指针接收结构体自身作为参数。
💡 基础知识补充:
- 回调函数:GUI 交互的核心,比如「按钮点击」「动画结束」时触发的逻辑。
- 胶水代码:连接 C 和 Python 的中间代码,负责数据类型转换、函数调用映射,让 Python 能调用 C 实现的 LVGL API。
十一、lvgl-micropython 项目介绍
这是一个将 LVGL 嵌入式 GUI 库绑定到 MicroPython 的开源项目,是 lv_micropython 和 lv_binding_micropython 的衍生版本,核心目标是让开发者能用 Python 语言在微控制器上开发图形界面,同时简化编译流程、统一 API 并拓展硬件支持。
11.1 核心概念与定位
- 绑定(Binding) 可以理解为「语言翻译器」:LVGL 是用 C 语言编写的嵌入式 GUI 框架,而这个项目通过「胶水代码」将 C 语言的 LVGL API 封装成 Python 可调用的接口,让 MicroPython 开发者能直接用 Python 操作 LVGL 的所有功能,无需编写底层 C 代码。
- MicroPython:是 Python 语言的精简版,专为资源受限的微控制器(MCU)设计,内存占用极小,同时保留了 Python 简洁易用的语法和硬件访问能力。
- LVGL:是嵌入式领域最流行的开源 GUI 框架之一,用 C99 实现,专为低资源设备优化,提供按钮、标签、列表、动画等丰富的 UI 组件,支持触摸交互和复杂界面布局。
其项目目标在于:
- 简化 LVGL + MicroPython 的编译流程,降低入门门槛。
- 统一 API 规范,方便开发者添加新的显示 / 输入设备驱动。
- 支持更多硬件连接拓扑,适配不同的嵌入式产品形态。
- 优化性能:针对 RGB 总线等场景做了底层优化,提升 GUI 渲染帧率,同时减少内存占用。
11.2 关键架构与特性
项目重构了依赖逻辑:不再是 MicroPython 的附属组件,而是让 MicroPython 成为本项目的依赖。这一改动极大简化了 MicroPython 版本升级的适配工作,仅需少量修改即可支持新版 MicroPython,避免了过去频繁重构绑定代码的麻烦。
项目提供 make.py Python 脚本统一处理编译,支持主流嵌入式平台:
- 目标平台:ESP32、STM32、RP2(树莓派 Pico)、Renesas RA、nRF、i.MX RT、SAMD 等,同时支持 Unix/macOS 桌面端模拟(方便调试)。
- 构建依赖:需要 Python ≥ 3.10 和 C 编译器(gcc/clang/msvc),不同平台需安装对应工具链(如 ESP32 需
build-essential、cmake等)。 - 注意:Windows 平台暂未支持,macOS/Unix 版本需在本机编译后直接运行。
11.3 支持和特性
支持绝大多数主流 LCD 驱动芯片,包括:
- 常用型号:GC9A01、ILI9341、ILI9488、ST7789、ST7796 等。
- 兼容方案:未列出的 IC 可通过通用
rgb_display驱动适配。
覆盖主流电容 / 电阻触摸芯片:
- 电容触摸:CST816S、FT6x36、GT911 等。
- 电阻触摸:XPT2046、STMPE610 等。
特殊驱动:
- SDL2:仅用于 Unix/macOS 桌面端,可在电脑上模拟 LCD 显示和输入,无需烧录到硬件即可调试 GUI 代码。
针对 RGB 总线显示场景做了关键优化:
- 将全帧缓冲移至 C 层,用户只需分配部分缓冲,减少内存占用。
- 利用 ESP32 第二个核心异步处理缓冲复制和屏幕旋转,避免阻塞用户 Python 代码,提升渲染帧率。
- 代价是额外占用几百 KB 内存,适合有 PSRAM 的 ESP32 型号。
核心价值在于:
- 降低嵌入式 GUI 开发门槛:Python 开发者无需学习 C 语言,就能快速开发嵌入式界面,利用 Python 语法优势(面向对象、迭代调试)提升效率。
- 保持嵌入式性能:底层仍依赖 LVGL 的 C 语言实现,保证了资源受限设备上的运行效率,同时 Python 层的薄封装几乎无额外开销。
- 生态拓展:支持海量硬件平台和驱动,适配从消费电子到工业控制的多种嵌入式产品形态。
11.4 使用时注意
- 克隆仓库时不要手动初始化子模块,需按项目指定命令克隆。
- 更新代码时需删除本地副本并重新克隆,避免子模块冲突。
- 不可使用官方 LVGL-MicroPython 绑定的编译信息,否则会编译失败。
- 硬件变体(Variant)需在指定开发板(Board)后才能配置,否则会报错。