正点原子ESP32例程有LVGL例程,版本是8.3的,但我复制LVGL到自己的工程里始终无法正确编译,应该还是文件依赖没有搞对。
然后在乐鑫的组件库里找到了LVGL9.1版本的库,尝试着移植使用一下。
本帖分享最基本的文本显示,未对显示接口做任何优化,仅使用画点接口,但这也是最简单的。
进入正题:
1.使用任何可正常编译的ESP32的vscode工程。
----------------------------------------------------------------------------------------------------------------------
2.使用vscode打开ESP32工程,按下ctrl+shift+p调出控制台,输入“show component registry”
----------------------------------------------------------------------------------------------------------------------
3.搜索LVGL,选择"lvgl/lvgl v9.1.0"
----------------------------------------------------------------------------------------------------------------------
4.点击"install"安装lvgl
然后在其工程目录下会多出这两个东西
----------------------------------------------------------------------------------------------------------------------
5.进入工程配置,搜索lvgl
我只修改了Operating System (OS)一项,选择FreeRTOS即可
-----------------------------------------------------------开始进入编码环节-----------------------------------------------------------
6.添加头文件
#include "../managed_components/lvgl__lvgl/src/lvgl.h"
----------------------------------------------------------------------------------------------------------------------
7.初始化LVGL
[C] 纯文本查看 复制代码 static void my_flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map)
{
uint16_t * buf16 = (uint16_t *)px_map;
int32_t x, y;
for(y = area->y1; y <= area->y2; y++)
{
for(x = area->x1; x <= area->x2; x++)
{
SPILCD_DrawPoint(x, y, *buf16);
buf16++;
}
}
/* IMPORTANT!!!
* Inform LVGL that you are ready with the flushing and buf is not used anymore*/
lv_display_flush_ready(disp);
}
void GUI_Task(void *pvParameters)
{
uint16_t *lv_disp_buf = NULL;
lv_disp_buf = heap_caps_malloc(SPILCD_BUFFER_SIZE, MALLOC_CAP_SPIRAM);
lv_init();
lv_display_t *lv_display = lv_display_create(spilcd_x_size, spilcd_y_size);
lv_display_set_flush_cb(lv_display, my_flush_cb);
lv_display_set_buffers(lv_display, lv_disp_buf, NULL, SPILCD_BUFFER_SIZE, LV_DISPLAY_RENDER_MODE_PARTIAL);
lv_tick_set_cb(xTaskGetTickCount);
lv_delay_set_cb(vTaskDelay);
lv_obj_t *label = lv_label_create(lv_scr_act());
lv_label_set_text(label, "LVGL - ESP32");
lv_obj_center(label);
for(;;)
{
vTaskDelay(10);
lv_timer_handler();
}
}
lv_display_set_flush_cb - 就是设置屏幕显示
我看了正点原子lvgl-8.3的例程,很多接口在v9版本中改了,那么我是参考百问网的移植教程来移植的,还是比较简单:https://lvgl.100ask.net/9.1/index.html#
另外关于lvgl的时钟部分,设置lv_tick_set_cb和lv_delay_set_cb即可,并在任务中周期调用lv_timer_handler即可
至于lv_tick_inc这个函数,可以再设置了lv_tick_set_cb后可以不需要再调用了
|