LVGL学习笔记|LVGL移植

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、硬件要求
  • 二、移植
    • 1、 准备工作
    • 2、 文件准备
    • 3、 加入工程


前言

LVGL(轻巧而多功能的图形库)是一个免费的开放源代码图形库,它提供创建具有易于使用的图形元素,是一款拥有精美的视觉效果和低内存占用的嵌入式GUI。本文主要介绍lvgl的详细移植过程。


一、硬件要求

LVGL的最低运行要求很低:

●16、32或64位微控制器或处理器

●最低 16 MHz 时钟频率

●Flash/ROM::对于非常重要的组件要求 >64 kB(建议 > 180 kB)

●RAM

静态 RAM 使用量:~2 kB,取决于所使用的功能和对象类型

堆栈: > 2kB(建议 > 8 kB)

动态数据(堆):> 2 KB(如果使用多个对象,则建议 > 16 kB)。由 lv_conf.h 中的 LV_MEM_SIZE 宏进行设置。

显示缓冲区:> “水平分辨率”像素(建议 > 10× “水平分辨率” )

MCU 或外部显示控制器中的一帧缓冲区

●C99或更高版本的编译器

●具备基本的C(或C ++)知识:指针,结构,回调…

二、移植

1、 准备工作

●一份带屏幕驱动的工程(这里以GD32F450为例,支持国产!)
●lvgl源码(在官网获取,我这里使用的是lvgl9.0。https://github.com/lvgl/)

2、 文件准备

下载lvgl源码并解压得到移植所需的所有文件,在自己的工程目录下新建一个GUI文件夹,将下图方框选中的文件复制到GUI文件夹中。

LVGL学习笔记|LVGL移植_第1张图片

将部分文件名进行修改(非必要,为了统一命名风格)
●lv_conf_template.h–>lv_conf.h
●\examples\porting此目录文件是GUI与工程的API接口文件,修改后如图

LVGL学习笔记|LVGL移植_第2张图片

3、 加入工程

打开工程,添加lvgl\examples\porting目录下的文件和lvgl\src目录下的所有文件到工程中。
添加demo。

LVGL学习笔记|LVGL移植_第3张图片
LVGL学习笔记|LVGL移植_第4张图片
LVGL学习笔记|LVGL移植_第5张图片
LVGL学习笔记|LVGL移植_第6张图片

添加头文件路径:
添加lvgl\src目录和所有子文件夹目录
添加lvgl\examples和lvgl\examples\porting目录
添加示例demo的目录
每层目录最好都添加

LVGL学习笔记|LVGL移植_第7张图片
LVGL学习笔记|LVGL移植_第8张图片

选择C99模式

LVGL学习笔记|LVGL移植_第9张图片

修改lv_conf.h文件:
●增加两个屏幕尺寸的宏定义,以实际屏幕像素点修改
●修改原有的屏幕像素格式宏定义,以实际屏幕像素点修改

#define LV_HOR_RES_MAX	800
#define LV_VER_RES_MAX	480
/*Color depth: 1 (1 byte per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/
#define LV_COLOR_DEPTH 16

修改lv_port_disp.c文件,修改disp_flush函数,加入自己的矩形填充函数,各参数来源参考下列代码

/*Flush the content of the internal buffer the specific area on the display
 *You can use DMA or any hardware acceleration to do this operation in the background but
 *'lv_disp_flush_ready()' has to be called when finished.*/
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
		/*Return if the area is out the screen*/
		if(area->x2 < 0) {
			return;
		}
		if(area->y2 < 0) {
			return;
		}
		if(area->x1 > LV_HOR_RES_MAX - 1) {
			return;
		}
		if(area->y1 > LV_VER_RES_MAX - 1) {
			return;
		}		
		
		/*将区域截断到屏幕上*/
		int32_t act_x1 = area->x1 < 0 ? 0 : area->x1;
		int32_t act_y1 = area->y1 < 0 ? 0 : area->y1;
		int32_t act_x2 = area->x2 > LV_HOR_RES_MAX - 1 ? LV_HOR_RES_MAX - 1 : area->x2;
		int32_t act_y2 = area->y2 > LV_VER_RES_MAX - 1 ? LV_VER_RES_MAX - 1 : area->y2;
		/* 屏幕图片显示 */		
		lcd.LCD_Color_Fill(act_x1,act_y1,act_x2,act_y2,(unsigned short *)color_p);
		
	    /*IMPORTANT!!!
	     *Inform the graphics library that you are ready with the flushing*/
	    lv_disp_flush_ready(disp_drv);
}

在定时器中为GUI提供心跳,定时器中断周期是几ms就填几

	lv_tick_inc(1);

初始化并运行任务中断

	lv_init(); //lvgl初始化
	lv_port_disp_init();//显示器显示初始化
	lv_demo_widgets();	//UI创建
	while (1){
	/* 执行UI任务 */
		lv_task_handler();
	}

至此,LVGL移植完成。
官方参考文档:https://docs.lvgl.io/latest/en/html/index.html

你可能感兴趣的:(笔记,lvgl,学习)