硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2462|回复: 6
收起左侧

[LVGL] ESP32-IDF5.1.2-LVGL9.1移植

[复制链接]

8

主题

29

回帖

53

积分

初级会员

积分
53
发表于 2024-6-20 16:30:40 | 显示全部楼层 |阅读模式
正点原子ESP32例程有LVGL例程,版本是8.3的,但我复制LVGL到自己的工程里始终无法正确编译,应该还是文件依赖没有搞对。
然后在乐鑫的组件库里找到了LVGL9.1版本的库,尝试着移植使用一下。
本帖分享最基本的文本显示,未对显示接口做任何优化,仅使用画点接口,但这也是最简单的。
1.jpg


进入正题:
1.使用任何可正常编译的ESP32的vscode工程。
----------------------------------------------------------------------------------------------------------------------
2.使用vscode打开ESP32工程,按下ctrl+shift+p调出控制台,输入“show component registry”
2.jpg
----------------------------------------------------------------------------------------------------------------------
3.搜索LVGL,选择"lvgl/lvgl v9.1.0"
3.jpg
----------------------------------------------------------------------------------------------------------------------
4.点击"install"安装lvgl
4.jpg
然后在其工程目录下会多出这两个东西
5.jpg
----------------------------------------------------------------------------------------------------------------------
5.进入工程配置,搜索lvgl
6.jpg
我只修改了Operating System (OS)一项,选择FreeRTOS即可
7.jpg
-----------------------------------------------------------开始进入编码环节-----------------------------------------------------------
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_cblv_delay_set_cb即可,并在任务中周期调用lv_timer_handler即可
至于lv_tick_inc这个函数,可以再设置了lv_tick_set_cb后可以不需要再调用了

8.jpg
回复

使用道具 举报

3

主题

422

回帖

431

积分

高级会员

积分
431
发表于 2024-6-20 17:17:08 | 显示全部楼层
应该用图块传输接口,才是最终形式。
回复

使用道具 举报

8

主题

29

回帖

53

积分

初级会员

积分
53
 楼主| 发表于 2024-6-20 17:39:41 | 显示全部楼层
glory 发表于 2024-6-20 17:17
应该用图块传输接口,才是最终形式。

只是最简演示,绘图接口我已优化,如我上一篇帖子刷图一样,基本无刷屏感
回复

使用道具 举报

33

主题

188

回帖

287

积分

高级会员

积分
287
发表于 2024-6-20 17:39:55 | 显示全部楼层
感谢分享
回复

使用道具 举报

8

主题

29

回帖

53

积分

初级会员

积分
53
 楼主| 发表于 2024-6-21 09:35:03 | 显示全部楼层

感谢阅读                              
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2024-7-4 15:45:24 | 显示全部楼层
搞了好久, 没搞定. 看到里搞出来, 看到了希望了.
能否把点屏的项目文件夹, 分享一下.
回复

使用道具 举报

8

主题

29

回帖

53

积分

初级会员

积分
53
 楼主| 发表于 2024-8-21 13:53:29 | 显示全部楼层
YoungGu 发表于 2024-7-4 15:45
搞了好久, 没搞定. 看到里搞出来, 看到了希望了.
能否把点屏的项目文件夹, 分享一下.

抱歉才看到你的回复,现在还需要吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-28 20:38 , Processed in 0.433664 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表