1. LVGL开发环境搭建与第一个窗口

LVGL开发环境搭建与第一个窗口 学习卡片

任务说明

本案例目标是在PC上搭建LVGL模拟器开发环境,创建一个最小可运行的LVGL项目,在窗口中央显示"Hello World"文本。通过SDL2模拟器运行,无需真实嵌入式硬件即可验证LVGL基本渲染流程。

环境准备

需要以下依赖:gcc、make、SDL2开发库(Ubuntu/Debian下安装libsdl2-dev)。LVGL源码使用v8.3版本,从官方仓库获取lvgl和lv_drivers两个目录,放置于项目根目录。

项目结构


lvgl_hello/
├── lvgl/          # LVGL核心库
├── lv_drivers/    # SDL2驱动
├── main.c         # 主程序
├── lv_conf.h      # LVGL配置
├── lv_drv_conf.h  # 驱动配置
└── Makefile

核心代码实现

主程序main.c完成以下任务:初始化SDL2与LVGL,注册显示和输入驱动,创建标签控件显示文本,进入LVGL事件循环。


// main.c
#include "lvgl/lvgl.h"
#include "lv_drivers/display/monitor.h"
#include "lv_drivers/indev/mouse.h"
#include <stdbool.h>
#include <unistd.h>

int main(void)
{
    /* 1. 初始化LVGL */
    lv_init();

    /* 2. 初始化SDL2显示驱动(窗口大小320x240) */
    monitor_init();
    lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);
    disp_drv.flush_cb = monitor_flush;
    lv_disp_drv_register(&disp_drv);

    /* 3. 初始化鼠标输入驱动 */
    mouse_init();
    lv_indev_drv_t indev_drv;
    lv_indev_drv_init(&indev_drv);
    indev_drv.type = LV_INDEV_TYPE_POINTER;
    indev_drv.read_cb = mouse_read;
    lv_indev_drv_register(&indev_drv);

    /* 4. 创建标签显示Hello World */
    lv_obj_t *label = lv_label_create(lv_scr_act());
    lv_label_set_text(label, "Hello World");
    lv_obj_center(label);

    /* 5. LVGL事件循环 */
    while (1) {
        lv_timer_handler();
        usleep(5000);  /* 5ms周期 */
    }

    return 0;
}

LVGL配置lv_conf.h中关键宏定义:


#define LV_COLOR_DEPTH 32
#define LV_TICK_CUSTOM 1
#define LV_TICK_CUSTOM_INCLUDE "lv_drivers/sdl/sdl.h"
#define LV_TICK_CUSTOM_SYS_TIME_EXPR (SDL_GetTicks())

驱动配置lv_drv_conf.h中启用SDL支持:


#define USE_MONITOR 1
#define USE_MOUSE 1
#define MONITOR_HOR_RES 320
#define MONITOR_VER_RES 240

Makefile编译链接所有源文件:


CC = gcc
CFLAGS = -O2 -Wall -I. -Ilvgl -Ilv_drivers
LDFLAGS = -lSDL2 -lm
SRCS = main.c \
       lvgl/src/lv_core/*.c lvgl/src/lv_draw/*.c \
       lvgl/src/lv_font/*.c lvgl/src/lv_hal/*.c \
       lvgl/src/lv_misc/*.c lvgl/src/lv_objx/*.c \
       lvgl/src/lv_themes/*.c \
       lv_drivers/display/monitor.c lv_drivers/indev/mouse.c \
       lv_drivers/sdl/sdl.c
OBJS = $(SRCS:.c=.o)

hello: $(OBJS)
	$(CC) -o $@ $^ $(LDFLAGS)

%.o: %.c
	$(CC) $(CFLAGS) -c -o $@ $<

clean:
	rm -f $(OBJS) hello

运行与验证

在项目根目录执行make编译,然后运行./hello。预期出现一个320x240的SDL窗口,窗口中央显示黑色背景上的白色"Hello World"文本。验证判定标准:窗口正常打开且文本清晰可见,关闭窗口后程序退出无报错。

LVGL Hello World 运行流程 main() lv_init() monitor_init() mouse_init() label_create() 事件循环 lv_timer_handler() usleep(5000) 每5ms刷新一次 SDL窗口 320x240 Hello World

验证方法

编译并运行程序后,观察SDL窗口是否正常创建并显示文本。若窗口显示"Hello World"且无编译错误、无运行时崩溃,则案例验证通过。可通过修改lv_label_set_text中的字符串内容来确认文本渲染功能正常。