嵌入式图形库-LVGL v9.6-基础概念

文章目录

  • 一、LVGL
  • [二、LVGL 版本选择](#二、LVGL 版本选择)
    • [   1、V8.3(经典稳定版)](#   1、V8.3(经典稳定版))
    • [   2、V9.x(新版主推)](#   2、V9.x(新版主推))
  • [三、LVGL 核心运行机制(四大必懂核心)](#三、LVGL 核心运行机制(四大必懂核心))
    • [   1、lv_init() 库初始化](#   1、lv_init() 库初始化)
    • [   2、lv_tick_inc(ms)系统节拍](#   2、lv_tick_inc(ms)系统节拍)
    • [   3、lv_timer_handler() UI 任务内核](#   3、lv_timer_handler() UI 任务内核)
    • [   4、lv_display_flush_ready() 刷新完成通知](#   4、lv_display_flush_ready() 刷新完成通知)
  • [四、LVGL 三大硬件驱动层](#四、LVGL 三大硬件驱动层)
    • [   1、显示驱动 Display](#   1、显示驱动 Display)
    • [   2、输入驱动 INDEV](#   2、输入驱动 INDEV)
    • [   3、时间驱动 Tick](#   3、时间驱动 Tick)
  • 五、开发平台
    • [   1、PC平台](#   1、PC平台)
    • [   2、MCU平台](#   2、MCU平台)
    • [   3、MPU Linux 平台](#   3、MPU Linux 平台)
  • 六、核心概念
    • [   1、Object 对象(lv_obj_t)](#   1、Object 对象(lv_obj_t))
    • [   2、Screen 屏幕](#   2、Screen 屏幕)
    • [   3、Style 样式(lv_style_t)](#   3、Style 样式(lv_style_t))
    • [   4、Event 事件系统(lv_event_t)](#   4、Event 事件系统(lv_event_t))
    • [   5、Timer 软件定时器(lv_timer_t)](#   5、Timer 软件定时器(lv_timer_t))
    • [   6、Memory 内存管理](#   6、Memory 内存管理)
    • [   7、Tick 节拍](#   7、Tick 节拍)
  • 七、渲染概念
    • [   1、Dirty area 脏区(核心机制)](#   1、Dirty area 脏区(核心机制))
    • [   2、Display 显示设备 lv_disp_t](#   2、Display 显示设备 lv_disp_t)
    • [   3、Input device 输入设备 lv_indev_t](#   3、Input device 输入设备 lv_indev_t)
    • [   4、Draw 绘制管线](#   4、Draw 绘制管线)
  • [八、布局 Layout概念](#八、布局 Layout概念)
    • [   1、Flex(弹性布局,最常用):](#   1、Flex(弹性布局,最常用):)
    • [   2、Grid(网格布局):](#   2、Grid(网格布局):)
  • [九、Widgets 控件](#九、Widgets 控件)
  • [十、Extra 扩展模块(lv_conf.h 开关控制)](#十、Extra 扩展模块(lv_conf.h 开关控制))

一、LVGL

   LVGL(Light and Versatile Graphics Library)是一款开源、轻量级、跨平台的嵌入式 GUI 图形库。

   核心定位:纯软件绘图、与硬件无关、适配所有MCU/RTOS。

   特点总结:

     纯 C 语言、无依赖、MIT 开源(商用免费)。

     资源占用极低:最小 RAM 8KB、Flash 64KB 即可运行。

     自带控件、样式、动画、布局、事件系统。

     只负责生成像素数据,不操作屏幕硬件。

     支持裸机 / FreeRTOS / RT-Thread / ESP-IDF / Linux。

二、LVGL 版本选择

   1、V8.3(经典稳定版)

     兼容性最好,旧项目主流版本。

     IDF4.x 全系推荐使用。

     驱动结构体:lv_disp_drv_t / lv_indev_drv_t。

   2、V9.x(新版主推)

     API 更简洁、性能优化、内存管理升级。

     IDF5.x 官方默认适配版本。

     驱动结构体更名:lv_display_t / lv_indev_t。

     硬性规则:项目中 不能混用 V8/V9 代码,否则编译报错、运行崩溃。

三、LVGL 核心运行机制(四大必懂核心)

   LVGL 能跑起来,只依赖四个核心机制,是所有开发的基础。

   1、lv_init() 库初始化

     初始化 LVGL 内核、内存池、控件、样式系统,程序启动执行一次。

   2、lv_tick_inc(ms)系统节拍

     为 LVGL 提供时间基准,用于动画、倒计时、长按判定。

     必须放在定时器中精准调用(一般 1ms 中断)。

     不调用:所有动画、长按、定时器全部失效。

   3、lv_timer_handler() UI 任务内核

     处理:界面刷新、事件检测、动画运算、控件状态更新。

     裸机:while(1) 循环调用。

     RTOS:单独低优先级任务循环调用。

     铁律:所有 LVGL 控件操作,必须和该函数同任务。

   4、lv_display_flush_ready() 刷新完成通知

     放在屏幕刷新回调函数末尾。

     告知 LVGL:像素数据已经写完,可以刷新下一帧。

     不调用:界面卡死、花屏、停止刷新。

四、LVGL 三大硬件驱动层

   LVGL 本身不碰硬件,需要用户/官方端口对接三个驱动:

   1、显示驱动 Display

     作用:定义屏幕分辨率、颜色格式、绘制缓冲区、刷屏回调。

     核心:draw_buf 绘制缓冲区。

       单缓冲:省内存、轻微闪烁。

       双缓冲:流畅无撕裂、占用双倍 RAM。

       ESP32-S3 必须将缓冲区放在 PSRAM,否则内存溢出崩溃。

   2、输入驱动 INDEV

     对接:触摸屏、按键、编码器、鼠标。

     作用:上报坐标、按下/松开状态给 LVGL。

   3、时间驱动 Tick

     即 lv_tick_inc,提供系统毫秒时钟。

五、开发平台

   1、PC平台

    

   2、MCU平台

    

   3、MPU Linux 平台

    

六、核心概念

   1、Object 对象(lv_obj_t)

     LVGL 万物皆对象。按钮、标签、图片、窗口,全部继承 lv_obj_t。

     对象树:父子层级,父对象裁剪子对象(子超出父区域自动截断)

     属性:坐标、大小、样式、事件、可见性

     API:lv_obj_create(parent) 创建;lv_obj_set_pos/size() 设置位置大小

     示例:lv_obj_t *label = lv_label_create(lv_screen_active()); lv_screen_active():获取当前激活屏幕(顶层父对象)

   2、Screen 屏幕

     特殊对象,GUI 的根。

     可以多屏幕切换 lv_screen_load(),一次只显示一个 screen。

   3、Style 样式(lv_style_t)

     解耦 UI 数据和控件,类似 CSS。颜色、圆角、边框、阴影、padding、文字大小透明度。

     支持状态:默认、按下、聚焦、禁用等(LV_STATE_PRESSED)

     可多个样式叠加;可全局 / 局部样式

     写法:lv_style_set_bg_color(&style, lv_color_hex(0x3366ff));

     绑定:lv_obj_add_style(obj, &style, LV_STATE_DEFAULT);

   4、Event 事件系统(lv_event_t)

     控件交互核心,回调驱动。

     常见事件:LV_EVENT_CLICKED点击、LV_EVENT_PRESSING按下、LV_EVENT_VALUE_CHANGED值变化(滑块 / 开关)、LV_EVENT_DRAW_PART_BEGIN绘制回调

     注册:lv_obj_add_event_cb(obj, event_handler, LV_EVENT_CLICKED, user_data);

     在回调内:lv_event_get_target(e) 获取触发对象;lv_event_get_user_data(e)拿到自定义参数

   5、Timer 软件定时器(lv_timer_t)

     LVGL 内部软件定时器,不是硬件定时器,由 lv_timer_handler() 轮询驱动。

     用途:动画、周期刷新 UI、轮询传感器。

     注意:lv_timer_handler()必须周期性调用(10~20ms 一次),V9 必调用。

   6、Memory 内存管理

     LVGL 自带内存池,LV_MEM_SIZE 在lv_conf.h配置。

     所有对象、样式、图片 buffer 从这个池分配

     内存碎片风险:频繁创建删除对象会产生碎片;产品尽量预分配对象

     可替换成 malloc/free(配置项)

   7、Tick 节拍

     lv_tick_inc(uint32_t tick_period) 给 LVGL 提供系统时间基准。裸机 / RTOS 都要提供,单位 ms。

     模拟器:SDL 提供;ESP32:用 ESP-IDF 系统节拍。

七、渲染概念

   1、Dirty area 脏区(核心机制)

     对象修改后(改文字、移动、样式变化)标记脏区,只重绘脏的区域,不是全屏刷新,节省 CPU。

     流程:修改 obj → 标记脏区 → lv_timer_handler触发绘制 → 渲染脏区到 buffer → flush 回调推送屏幕。

   2、Display 显示设备 lv_disp_t

     移植重点,对接屏幕。

     Display buffer:渲染缓冲区(单 buffer / 双 buffer / 部分 buffer)

     lv_disp_flush_cb():刷屏回调。LVGL 画好像素,调用这个函数,由底层驱动把 buffer 送到屏幕(SDL/ST7789)

     双 buffer 优势:渲染下一帧的同时屏幕传输上一帧,减少撕裂

   3、Input device 输入设备 lv_indev_t

     输入抽象层:触摸、鼠标、编码器、按键。

     类型:LV_INDEV_TYPE_POINTER触摸 / 鼠标;LV_INDEV_TYPE_ENCODER旋转编码器;LV_INDEV_TYPE_KEYPAD按键

     回调:周期性上报坐标 / 按键状态给 LVGL

     PC 模拟器:鼠标作为 pointer;ESP32:XPT2046 触摸芯片

   4、Draw 绘制管线

     Draw unit:绘制单元,分软件渲染 / GPU 加速(DMA2D、PPA、VG-Lite)

     图元绘制:矩形、文字、圆弧、图片、蒙版、透明度混合

     V9 新架构:draw unit 解耦,很容易接入硬件 GPU 加速(ESP32-S3 PPA)

八、布局 Layout概念

   1、Flex(弹性布局,最常用):

     类似前端 flex。自动排列子控件,自动换行、对齐。

     lv_obj_set_flex_flow()、lv_obj_set_flex_align()

   2、Grid(网格布局):

     表格式,按行和列分配单元格。适合仪表盘、矩阵按钮。

     推荐:简单排列用 Flex;规整矩阵界面用 Grid,尽量少手动写坐标lv_obj_set_pos。

九、Widgets 控件

     全部在 src/widgets,是预封装好的对象。

     基础:label 文字、btn 按钮、img 图片、slider 滑块、switch 开关、checkbox 复选框。

     复杂:tabview 分页、list 列表、textarea 文本输入、roller 滚轮选择、chart 图表、msgbox 弹窗。

     每个控件都有专属属性,同时继承 obj 的通用属性(位置、样式、事件)。

十、Extra 扩展模块(lv_conf.h 开关控制)

     Font 字体:内置点阵字体;工具生成自定义字体(中文必须自己生成)。

     Image decoder 图片解码器:PNG/JPG/GIF/SVG/Lottie 矢量动画。

     File system FS:对接文件系统,读取 SD 卡 /flash 里图片字体。

     Themes 主题:预设整套样式,一键切换 UI 风格。

相关推荐
新晨单片机设计1 小时前
S025F-STM32蓝牙智能手环(心率、血氧、体温、计步)【Proteus仿真+Keil程序+原理图】
stm32·嵌入式硬件·proteus·蓝牙智能手环
coward911 小时前
全志和瑞芯微平台反编译设备树
linux·嵌入式硬件
潜创微科技2 小时前
CH591:成本优化的青稞 RISC-V 无线 MCU
c语言·单片机·risc-v·低延迟·沁恒·青稞
深圳海导科技2 小时前
深圳海导科技navynav|小型RTK数传电台:高精度定位场景下的枢纽
单片机·嵌入式硬件
番茄灭世神3 小时前
PN学堂GD32课程第15篇——HardFault异常
c语言·单片机·嵌入式
创界工坊工作室3 小时前
49-基于单片机的火警报警器设计
stm32·单片机·嵌入式硬件·51单片机·proteus
笨笨饿3 小时前
144_Codex变慢的解决办法
stm32·单片机·嵌入式硬件·mcu·物联网·51单片机·proteus
学linux的QQ蛋3 小时前
IMX6 嵌入式多传感器系统整体架构梳理
linux·嵌入式硬件·架构
zhaoshuzhaoshu3 小时前
什么是信号量?信号量的种类、使用方法与 STM32 案例
嵌入式硬件