查看: 8386|回复: 9

想要移植LVGL吗?想用GUIguider来设计GUI界面吗?进来学习吧

[复制链接]
  • TA的每日心情
    奋斗
    昨天 10:31
  • 签到天数: 2433 天

    连续签到: 10 天

    [LV.Master]伴坛终老

    84

    主题

    2万

    帖子

    3

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    22626
    最后登录
    2025-9-21
    发表于 2023-7-5 12:08:30 | 显示全部楼层 |阅读模式
    本帖最后由 流水源 于 2023-12-6 17:16 编辑


    下面开始一步步教你怎么移植LVGL,用GUIguider来设计GUI界面。
    以下是通用的移植设计步骤。

    首先安装GUI guider,本次使用的是1.5.1版本GUI guider。打开软件,选择创建新工程。
    1.jpg

    选择V8.3.2版本的LVGL。
    2.jpg

    选择模拟的。
    3.jpg

    选择一个模板,这里选了空模板。
    4.jpg

    设置工程路径,名称。设置lcd屏幕大小和颜色位数,要和你实际需要移植的lcd屏对应。
    5.jpg

    下面就是新建的工程了,后面就饿可以设置面板控制的。
    6.jpg
    记得点右上角先生成更新代码。

    GUIguider工程先这样了,下面开始基本移植工程。
    移植之前你需要已经移植好LCD驱动,LCD能正常显示图片。工程的堆栈要大一些,RAM容量要大。否则会资源不足。

    首先将你LCD显示的模板工程复制到GUIguider工程目录中。

    这里使用的LPC55S69。
    7.jpg
    打开keil工程先添加所有LVGL文件内源码。
    8.jpg

    然后添加lvgl的头文件路径。
    9.jpg

    然后从GUIguider工程目录lvgl-simulator文件夹下复制lv_conf.h文件到我们要移植的lpc55s69工程内。并添加到keil工程中,到时需要修改配置LVGL功能。
    10.jpg
    11.jpg

    下面就移植对接LCD显示。这时就需要lcd绘图API驱动了。
    下面就是参考lvgl-simulator内驱动写法。
    1. void ili9341_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_p)
    2. {
    3.     if(area->x2 < 0 || area->y2 < 0 || area->x1 > (GLCD_WIDTH - 1) || area->y1 > (GLCD_HEIGHT - 1)) {
    4.         lv_disp_flush_ready(drv);
    5.         return;
    6.     }

    7.     /* Truncate the area to the screen */
    8.     int32_t act_x1 = area->x1 < 0 ? 0 : area->x1;
    9.     int32_t act_y1 = area->y1 < 0 ? 0 : area->y1;
    10.     int32_t act_x2 = area->x2 > GLCD_WIDTH - 1  ? GLCD_WIDTH - 1  : area->x2;
    11.     int32_t act_y2 = area->y2 > GLCD_HEIGHT - 1 ? GLCD_HEIGHT - 1 : area->y2;
    12.    
    13.     lcd_draw_bitmap(act_x1,act_y1,1+act_x2-act_x1,1+act_y2-act_y1,(uint8_t *)color_p);
    14.    
    15.     lv_disp_flush_ready(drv);
    16. }

    17. /**
    18. * Initialize the Hardware Abstraction Layer (HAL) for the Littlev graphics library
    19. */
    20. static void lv_hal_init(void)
    21. {
    22.     /*Create a display buffer*/
    23.     static lv_disp_draw_buf_t disp_buf1;
    24.     static lv_color_t buf1_1[LV_HOR_RES_MAX * 10];
    25.     lv_disp_draw_buf_init(&disp_buf1, buf1_1, NULL, LV_HOR_RES_MAX * 10);

    26.     /*Create a display*/
    27.     lv_disp_drv_t disp_drv;
    28.     lv_disp_drv_init(&disp_drv);            /*Basic initialization*/
    29.     disp_drv.draw_buf = &disp_buf1;
    30.     disp_drv.flush_cb = ili9341_flush;
    31.     disp_drv.hor_res = LV_HOR_RES_MAX;
    32.     disp_drv.ver_res = LV_VER_RES_MAX;
    33.     lv_disp_drv_register(&disp_drv);

    34.     /* Add the mouse as input device
    35.      * Use the 'mouse' driver which reads the PC's mouse*/
    36. //    mouse_init();
    37. //    lv_indev_drv_t indev_drv;
    38. //    lv_indev_drv_init(&indev_drv);          /*Basic initialization*/
    39. //    indev_drv.type = LV_INDEV_TYPE_POINTER;
    40. //    indev_drv.read_cb = mouse_read;         /*This function will be called periodically (by the library) to get the mouse position and state*/
    41. //    lv_indev_t * mouse_indev = lv_indev_drv_register(&indev_drv);
    42. //   
    43. }
    复制代码


    下面就是main初始化lvgl了。
    main.c添加头文件:
        #include "lvgl.h"

    先初始化lcd,再初始化lvgl-》lv_init()。再就是lcd对接到lvgl初始化lv_hal_init();
    1.     lcd_init();
    2.     lcd_fill(0,0,GLCD_WIDTH-1,GLCD_HEIGHT-1,GLCD_COLOR_RED);
    3.     Delay_ms(500);
    4.     lcd_fill(0,0,GLCD_WIDTH-1,GLCD_HEIGHT-1,GLCD_COLOR_GREEN);
    5.     Delay_ms(500);
    6.     lcd_fill(0,0,GLCD_WIDTH-1,GLCD_HEIGHT-1,GLCD_COLOR_BLUE);
    7.     Delay_ms(500);
    8.    
    9.     printf("hello world.\r\n");
    10.    
    11.     lv_init();
    12.     lv_hal_init();
    复制代码
    main主循环调用
    1.     while (1)
    2.     {
    3.         lv_task_handler();
    4.     }
    复制代码


    下面定时1ms调用lv_tick_inc(1);
    1. volatile uint32_t time_tick_cnt;
    2. void SysTick_Handler(void)
    3. {
    4.     extern void lv_tick_inc(uint32_t tick_period);
    5.     lv_tick_inc(1);
    6.     time_tick_cnt++;
    7. }
    复制代码
    好了,到这里lvgl基本移植好了。

    下面就是移植GUI guider设计的界面了。
    我们先用GUI guider添加几个控件到LCD画面上。类是如下,然后点击右上角GenerateCode,更新代码。
    15.jpg

    更新代码主要在下面2个文件夹内。
    把下面2个文件夹内容代码加到keil工程中,并添加头文件包含路径。
    12.jpg
    13.jpg
    14.jpg


    添加头文件:

    #include "gui_guider.h"
    #include "events_init.h"
    #include "custom.h"

    在就是在main内定义变量:

    lv_ui guider_ui;

    初始化:

        setup_ui(&guider_ui);
        events_init(&guider_ui);
        custom_init(&guider_ui);



    16.jpg

    最后编译keil工程,正常就可以编译通过了。
    需要配置lvgl功能,请在lv_conf.h内配置以下。主要内存占用。





    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 14:26
  • 签到天数: 1753 天

    连续签到: 46 天

    [LV.Master]伴坛终老

    23

    主题

    1万

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    16101
    最后登录
    2025-9-21
    发表于 2023-7-5 12:20:31 | 显示全部楼层
    大佬666666!
    跟着日天混,三天饱九顿!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3954

    主题

    7579

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    40407
    最后登录
    2025-9-21
    发表于 2023-7-5 12:36:07 | 显示全部楼层
    这不就一步到位了么
    qiandao qiandao
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2016-12-2 08:40
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    103

    主题

    869

    帖子

    7

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    4354
    最后登录
    2025-8-21
    发表于 2023-7-5 12:54:23 | 显示全部楼层
    大佬 666666
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:38
  • 签到天数: 1528 天

    连续签到: 6 天

    [LV.Master]伴坛终老

    152

    主题

    3213

    帖子

    31

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    8817
    最后登录
    2025-9-21
    发表于 2023-7-5 16:46:16 | 显示全部楼层
    大佬666666
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 09:36
  • 签到天数: 1653 天

    连续签到: 4 天

    [LV.Master]伴坛终老

    25

    主题

    2万

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    11111

    活跃会员

    最后登录
    2025-9-21
    发表于 2023-7-5 21:13:03 | 显示全部楼层
    666啊,我又可以抄了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    10

    帖子

    0

    注册会员

    Rank: 2

    积分
    114
    最后登录
    2025-6-26
    发表于 2023-8-21 16:35:29 | 显示全部楼层
    大佬,我想问下,这个guider是否可以用来设计单色oled屏呢?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 10:31
  • 签到天数: 2433 天

    连续签到: 10 天

    [LV.Master]伴坛终老

    84

    主题

    2万

    帖子

    3

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    22626
    最后登录
    2025-9-21
     楼主| 发表于 2023-8-22 08:45:43 | 显示全部楼层
    eefocus_3937441 发表于 2023-8-21 16:35
    大佬,我想问下,这个guider是否可以用来设计单色oled屏呢?

    用还是可以的,只是没那么方便。在底层移植绘图函数上将颜色转化一下
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    0

    新手上路

    Rank: 1

    积分
    18
    最后登录
    2024-2-22
    发表于 2024-1-29 09:26:33 | 显示全部楼层
    大佬,这个guider代码移植到杰里的话是怎么弄啊?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 877 天

    连续签到: 4 天

    [LV.10]以坛为家III

    69

    主题

    3291

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    10441
    最后登录
    2025-9-18
    发表于 2024-1-29 09:36:09 | 显示全部楼层
    收藏一波有时间也搞下玩玩
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-22 07:15 , Processed in 0.104036 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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