想要在ESP32-C3使用Micropython开发GUI,所以需要编译lv_micropython,当前github上的版本是9.1.0。
一、开发环境
因为编译lv_micropython需要在linux系统下,但是我的电脑是windows系统,所以我在windows系统上安装了VMware虚拟机,在VMware虚拟机中安装了ubuntu18系统。
二、下载lv_micropython
github:GitHub - lvgl/lv_micropython: Micropython bindings to LVGL for Embedded devices, Unix and JavaScript
在ubuntu系统中其中命令终端,cd到存放源码的目录。
克隆lv_micropython:
git clone https://github.com/lvgl/lv_micropython.git
更新其子模块:
cd lv_micropython
git submodule update --init --recursive lib/lv_bindings
三、编译lv_micropython
1、编译mpy-cross:
make -C mpy-cross
mpy-cross 是一个用于将 Python 代码预编译为适用于 MicroPython 设备的 .mpy 文件的工具。
2、编译Unix (Linux) port(如果需要在PC上开发LVGL需要执行这一步)
更新软件包:
sudo apt-get update
安装build-essential libreadline-dev libffi-dev:
sudo apt-get install build-essential libreadline-dev libffi-dev
安装libsdl2-2.0-0
libsdl2-dev
:
sudo apt-get install libsdl2-2.0-0 libsdl2-dev
libsdl2-2.0-0
是 Simple DirectMedia Layer 2.0 库,用于提供低层次的访问音频、键盘、鼠标、半导体和显示硬件。libsdl2-dev
是开发 SDL 应用程序所需的开发文件。
安装parallel:
sudo apt-get install parallel
parallel
是 GNU 工具的一部分,用于并行执行多个任务。
安装Python3:
sudo apt-get install python3.8
也可安装python3的其它版本,如果系统已经安装了python3就不用再安装了,可通过命令:
python3 -V
查询是否已安装python3以及安装的版本。
初始化和更新ports/unix子模块:
make -C ports/unix submodules
编译 ports/unix:
make -C ports/unix
编译成功后ports/unix/build-standard/路径下会生成一个micropython文件,这个和github上展示的不一样,github展示的是在ports/unix/路径下生成一个micropython文件。
注意:如果编译出错,请看“遇到问题”章节。
四、运行demo
运行advanced_demo.py示例,在文件末尾添加以下代码,然后保存。
if __name__ == '__main__':
import time
while True:
time.sleep(1)
执行命令运行demo:
./ports/unix/build-standard/micropython lib/lv_bindings/examples/advanced_demo.py
UI效果:
五、遇到问题
../../lib/lv_bindings/lvgl/src/drivers/sdl/lv_sdl_window.c: In function ‘texture_resize’:
../../lib/lv_bindings/lvgl/src/drivers/sdl/lv_sdl_window.c:375:5: error: unknown type name ‘SDL_PixelFormatEnum’; did you mean ‘SDL_PixelFormat’?
SDL_PixelFormatEnum px_format = SDL_PIXELFORMAT_RGB565;
^~~~~~~~~~~~~~~~~~~
SDL_PixelFormat
See https://github.com/micropython/micropython/wiki/Build-Troubleshooting
../../py/mkrules.mk:83: recipe for target 'build-standard/lib/lv_bindings/lvgl/src/drivers/sdl/lv_sdl_window.o' failed
make: *** [build-standard/lib/lv_bindings/lvgl/src/drivers/sdl/lv_sdl_window.o] Error 1
make: Leaving directory '/home/caiyong/share/lv_micropython/ports/unix'
不知道的SDL_PixelFormatEnum类型,可能是SDL2版本不匹配,打开/usr/include/SDL2/下的一些.h文件,也没有找到SDL_PixelFormatEnum声明。
解决方法:
打开lv_micropython/lib/lv_bindings/lvgl/src/drivers/sdl/lv_sdl_window.c文件,修改代码。
将:
#if LV_COLOR_DEPTH == 32
SDL_PixelFormatEnum px_format = SDL_PIXELFORMAT_RGB888; /*same as SDL_PIXELFORMAT_RGB888, but it's not supported in older versions*/
#elif LV_COLOR_DEPTH == 24
SDL_PixelFormatEnum px_format = SDL_PIXELFORMAT_BGR24;
#elif LV_COLOR_DEPTH == 16
SDL_PixelFormatEnum px_format = SDL_PIXELFORMAT_RGB565;
改为:
#if LV_COLOR_DEPTH == 32
Uint32 px_format = SDL_PIXELFORMAT_RGB888; /*same as SDL_PIXELFORMAT_RGB888, but it's not supported in older versions*/
#elif LV_COLOR_DEPTH == 24
Uint32 px_format = SDL_PIXELFORMAT_BGR24;
#elif LV_COLOR_DEPTH == 16
Uint32 px_format = SDL_PIXELFORMAT_RGB565;
使用 Uint32代替SDL_PixelFormatEnum定义px_format 变量。