news 2026/7/5 13:05:30

LVGL学习第一章:认识并且移植LVGL

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LVGL学习第一章:认识并且移植LVGL

一、什么是lvgl?

LVGL(Light and Versatile Graphics Library)是一个开源的嵌入式图形界面库,用来在 MCU、MPU、RTOS 或裸机系统上做 GUI 界面。

在 STM32 项目里,LVGL 通常负责“画界面”,它本身不直接去控制屏幕硬件。

二、如何移植LVGL?

1、放入 LVGL 源码和配置文件

Github链接:github.com

下载对应的lvgl源码。创建一个lvgl文件夹,然后文件结构目录如下:

2、写一个显示驱动

LVGL在需要刷新的时候,把一块区域的像素数据交给你。所以说需要写一个显示回调

我使用的是2.4寸的TFT屏幕。在我使用的这个原来的LCD驱动中,原驱动提供了如下几个函数:

LCD_Init();//初始化LCD屏幕

LCD_SetCursor(Xpos, Ypos);//设置LCD要写入的显存位置

LCD_WriteRAM_Prepare();//准备往显存RAM中写入数据

LCD_WriteRAM(color);//往显存RAM中写入颜色

  • 把一块区域的像素数据交给你:

如上面所说,LVGL只会把一块区域的像素交给你,具体来说就类似:

从 (x1, y1) 到 (x2, y2) 这一块矩形区域需要刷新。同时LVGL也会给你一个颜色数组让你进行写入。

所以说我们要实现的函数的功能就是:把颜色数组写入到LCD对应的位置中去。

这里实现一个函数:

void LCD_FlushRect(u16 x1, u16 y1, u16 x2, u16 y2, const u16 *color_p)

也就是把color_p这个数组,写入到(x1,y1)和(x2,y2)包围起来的矩形区域中。

for (y = y1; y <= y2; y++)

{

LCD_SetCursor(...);

LCD_WriteRAM_Prepare();

for (x = x1; x <= x2; x++)

{

LCD_WriteRAM(*color_p++);

}

}

具体的x和y坐标需要根据个人的LCD屏幕的方向来决定,这里只是一个参考。

  • 显示回调:

static void lv_port_disp_flush(lv_disp_drv_t *disp_drv,

const lv_area_t *area,

lv_color_t *color_p)

这个回调函数需要完成如下几个任务:

①取出 LVGL 要刷新的区域:

因为area被封装到了一个结构体里(LVGL提供)

typedef struct {

lv_coord_t x1;

lv_coord_t y1;

lv_coord_t x2;

lv_coord_t y2;

} lv_area_t;

所以说我们要把区域给取出来

int32_t x1 = area->x1;

int32_t y1 = area->y1;

int32_t x2 = area->x2;

int32_t y2 = area->y2;

②判断区域有没有超出屏幕范围:

如果区域有一部分超出屏幕,就把超出的部分裁剪;

③调用刚刚完成的 LCD在一块空间内写入颜色数组的函数LCD_FlushRect;

④刷新完后告诉 LVGL:

lv_disp_flush_ready(disp_drv);(LVGL自带)

这样LVGL就可以继续进行刷新了。

具体函数如下:

3、提供时基,也就是LVGL运行的节拍

LVGL需要一个1ms的节拍

也就是在一个1ms在中断中,调用一次lv_tick_inc(1);(LVGL提供)

一般我们放在:SysTick 中断;定时器中断或者RTOS 的tick钩子。

4、准备显示缓冲区并注册显示设备

LVGL 不是每画一个点就立刻写 LCD,它通常会先画到 buffer 里,再通过 flush_cb 发出去。

初始化函数如下:

这个函数实际上就是在告诉 LVGL:我的屏幕多大、缓存在哪、刷屏函数是谁。

其中:

disp_drv.hor_res = LCD_HOR_RES;//屏幕多大

disp_drv.ver_res = LCD_VER_RES; //屏幕多大

disp_drv.flush_cb = lv_port_disp_flush;// 刷屏函数是谁

disp_drv.draw_buf = &disp_buf;// 缓存在哪(disp_buf是管理buf_1的结构体,buf_1是真正存像素颜色的数组。

这几个都是基于自己显示屏的参数进行配置的。

5、初始化相关函数

lv_init();//初始化LVGL 框架内部

lv_port_disp_init();//初始化我的LCD显示层

6、主循环里持续调用 lv_timer_handler()

这个lv_timer_handler()的调用间隔一般设为5ms。

7、进行显示的测试

lv_obj_t * label = lv_label_create(lv_scr_act());

lv_label_set_text(label, "Hello LVGL");

lv_obj_center(label);

如果说屏幕中心显示Hello LVGL字样就说明移植成功了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/5 13:05:12

Java开发中十个常见的性能陷阱及解决办法

你的代码可能并没有你想象中那么快。哪怕你用着最新的JDK 21&#xff0c;写着漂亮的Stream API&#xff0c;做着优雅的Lambda&#xff0c;只要踩中一个常见的性能陷阱&#xff0c;几十毫秒的延迟、几M的内存泄漏&#xff0c;就会像温水煮青蛙一样一点一点吞噬你的系统吞吐量。别…

作者头像 李华
网站建设 2026/7/5 13:05:08

主动推理-记忆块构建

记忆块构建_原文 2026年07月04日 00:21 发言人 00:00 记忆的概念对我们来说似乎相当直观&#xff0c;这是指能够存储关于特定经历的信息&#xff0c;并在以后通过回忆重构他们的能力。但这些信息在大脑内部的物理层面上究竟存储在何处&#xff1f;又是如何存储的呢&#xff1…

作者头像 李华
网站建设 2026/7/5 13:03:15

5分钟快速上手:AsrTools智能语音识别工具终极指南

5分钟快速上手&#xff1a;AsrTools智能语音识别工具终极指南 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio into accurate text…

作者头像 李华
网站建设 2026/7/5 13:03:08

最好的VibeCoding宣讲材料

先建立认知&#xff1a;AI 编程为什么从“对话”走向“行动”&#xff1b; 再讲清底层&#xff1a;Function Call、MCP、Skill、Agent 如何协作&#xff1b; 然后落地实践&#xff1a;Claude Code 怎么装、怎么用、适合哪些场景&#xff1b; 最后收束到工程化&#xff1a;Code …

作者头像 李华
网站建设 2026/7/5 13:01:03

量子多参数传感协议:原理、实现与应用

1. 量子多参数传感协议概述量子多参数传感协议是一种基于全局Clifford酉变换的量子测量技术&#xff0c;它通过优化测量策略实现了高效的参数估计。这项技术的核心在于利用量子系统的并行性&#xff0c;在一次测量中同时获取多个参数信息&#xff0c;从而显著提升测量效率。在量…

作者头像 李华
网站建设 2026/7/5 13:00:54

PIC18F4550单片机控制RGB灯带实现智能灯光效果

1. 项目概述&#xff1a;用RGB灯带打造沉浸式空间体验最近在电子爱好者圈子里&#xff0c;利用可编程RGB灯带打造氛围灯效的项目越来越火。这次我们要用IN-PC55TBTRGB灯带搭配PIC18F4550单片机&#xff0c;把普通房间变成会呼吸的光影空间。这种组合特别适合想入门嵌入式灯光控…

作者头像 李华