【2022得捷电子创新设计大赛】四、ESP32-S2-Kaluga-1运行LVGL
[复制链接]
近两周时间都比较忙,只是抽空测试了Kaluga官方仓库“esp-dev-kits”中的几个案例,目前除了触摸板的案例有问题,其它都正常可用。但是,通过对其中lcd组件和对应案例的分析,本人发现官方案例只提供了lcd的驱动,并没有提供GUI,案例也只是整屏显示画面的功能,于是决定尝试引入lvgl。
1、lv_port_esp仓库获取
这里使用的是GitHub上lvgl主页的一个移植完整的仓库“lv_port_esp32”——链接: 。
图4-1 GitHub主页截图
按照经验,使用递归克隆参数“--recursive”果然又出现了错误,所以本人选择先不带参数直接克隆:“git clone https://github.com/lvgl/lv_port_esp32.git”。这样会有三个链接的仓库没有下载,之后单独下载并放置到同名目录中即可。
关联的仓库1是lvgl,本人直接点击网页链接转过去,想着保证项目的版本兼容,不过后面编译时还是报了一个错误,好在注释掉无用语句即可。
仓库1: 。本人在克隆这个仓库时也报错了,直接在页面选择下载zip成功了,之后自然是解压到“../components/lvgl”目录。
仓库2: 。这个仓库只有若干显示屏驱动源文件,直接克隆成功,位于“../components/lvgl_esp32_drivers”。
仓库3: 。这个仓库的名字为“lv_demo”,为了怕出错(后续分析CMakeLists也判断必须改名),克隆后本人修改目录名为:“lv_examples”,最终位于“../components/lv_examples/lv_examplees”。
图4-2 直接克隆(非递归)缺失的三个子目录(第三个在lv_examples下一级)
图4-3 链接的三个仓库l的路径位置
2、项目配置(基于VS Code)
直接使用VS Code打开根目录“lv_port_esp32”,先在状态栏选择MCU类型“esp32s2”,然后点击状态栏的“齿轮”按钮——相当于执行“idf.py menuconfig”,最后执行build。
具体的menuconfig配置,本人进行了以下修改:
图4-4 esp-idf插件的状态栏工具按钮
图4-5 lvgl configuration
图4-6 LVGL ESP Drivers
图4-7 LVGL ESP Drivers——Display Pin Assignments和Kaluga原理图
从管脚分布来看,Kaluga板子的LCD Touch脚和Camera脚是复用的,所以这里没有开启触摸屏。
3、编译项目
build会报两个错误,都是位于“../components/lv_examples/lv_examples/lv_demo.h”。
一是头文件“../lv_demo_conf.h”找不到,修改方法有两个:将同目录下lv_demo_conf_template.h重命名为lv_demo_conf.h(实际没有启用这个头文件),或者干脆注释掉这一句头文件连接。
二是版本检查的条件编译,不知道是不是下载阶段的选择问题,这里版本检查不符合8.0.0,所以会输出报错信息“#error”,索性也注释掉。
图4-8 lv_demo.h中的报错和修改方法
link阶段时还会报一个错误,就是lv_demo_widgets()函数(位于../lv_examples/src/lv_demo_widgets/lv_demo_widgets.c)未定义,这是因为没有启用lv_demo_conf.h头文件,进而缺少宏定义“LV_USE_DEMO_WIDGETS”的结果。不过当本人尝试添加这个宏后,lv_demo_widgets.c源文件中会报大量类型不匹配错误(主要是各种lvgl的结构体),猜测是版本不匹配8.0.0的原因。
所以,这里修改了main.c,不使用demo,只显示两个label,具体如下:
static void create_demo_application(void)
{
/* When using a monochrome display we only show "Hello World" centered on the
* screen */
/* use a pretty small demo for monochrome displays */
/* Get the current screen */
lv_obj_t * scr = lv_disp_get_scr_act(NULL);
/*Create a Label on the currently active screen*/
lv_obj_t * label1 = lv_label_create(scr, NULL);
lv_obj_t * label2 = lv_label_create(scr, NULL); //added by author
/*Modify the Label's text*/
lv_label_set_text(label1, "Hello\nworld");
lv_label_set_text(label2, "Nihao Shijie! Wonderful Tianjin!");
/* Align the Label to the center
* NULL means align on parent (which is the screen now)
* 0, 0 at the end means an x, y offset after alignment*/
lv_obj_align(label1, NULL, LV_ALIGN_CENTER, 0, 0);
lv_obj_align(label2, NULL, LV_ALIGN_CENTER, 0, 50);//added by author
#if defined CONFIG_LV_TFT_DISPLAY_MONOCHROME || \ //moved by author
defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7735S
/* Otherwise we show the selected demo */
#if defined CONFIG_LV_USE_DEMO_WIDGETS
lv_demo_widgets();
#elif defined CONFIG_LV_USE_DEMO_KEYPAD_AND_ENCODER
lv_demo_keypad_encoder();
#elif defined CONFIG_LV_USE_DEMO_BENCHMARK
lv_demo_benchmark();
#elif defined CONFIG_LV_USE_DEMO_STRESS
lv_demo_stress();
#else
#error "No demo application selected."
#endif
#endif
}
图4-9 lvgl测试案例效果
|