一、
LVGL(轻巧而多功能的图形库)是一个免费的开放源代码图形库,它提供创建具有易于使用的图形元素,精美的视觉效果和低内存占用的嵌入式GUI所需的一切。
主要特性
丰富且强大的模块化图形组件:按钮 (buttons)、图表 (charts)、列表 (lists)、滑动条 (sliders)、图片 (images) 等
高级的图形引擎:动画、抗锯齿、透明度、平滑滚动、图层混合等效果
支持多种输入设备:触摸屏、 键盘、编码器、按键等
支持多显示设备
不依赖特定的硬件平台,可以在任何显示屏上运行
配置可裁剪(最低资源占用:64 kB Flash,16 kB RAM)
基于UTF-8的多语种支持,例如中文、日文、韩文、阿拉伯文等
可以通过类CSS的方式来设计、布局图形界面(例如:Flexbox、Grid)
支持操作系统、外置内存、以及硬件加速(LVGL已内建支持STM32 DMA2D、NXP PXP和VGLite)
即便仅有单缓冲区(frame buffer)的情况下,也可保证渲染如丝般顺滑
全部由C编写完成,并支持C++调用

配合GUI Guider使用可以设计出精美图形界面
二、移植步骤
从LVGL开源****下载lvgl图形库源码
https://github.com/lvgl/lvgl/tree/release/v8.3
这里演示 lvgl v8.3版本的移植步骤
![1732118237717510.png 7TFD(]Y]2$9{5XMM1%ACPU7.png](http://uphotos.eepw.com.cn/1709346044/pics/1732118237717510.png)
解压文件一览
图形库源码非常庞大,所以按应用需求来删去不需要使用的库文件
本次移植的文件主要有:
源码库根目录的demos、examples、src这三个文件夹,lv_conf_template.h、lvgl.h两个头文件
![1732118663527298.png 6LM0I~]0X2)ALSHE7C)[NMK.png](http://uphotos.eepw.com.cn/1709346044/pics/1732118663527298.png)
在examples目录删去除porting外的所有文件夹,这是显示相关的驱动库
为了便于工程管理,需要将文件的名称后缀_template删除,包括examples/porting目录下的文件
LVGL根目录文件结构

porting文件结构

以上移植文件统一放置在LVGL文件夹内
将该文件夹复制到CubeIDE的APP工程目录下

为工程添加LVGL的头文件路径

源文件导入
![1732119402907254.png 1XV@}N9817]HV[])M54@3Q9.png](http://uphotos.eepw.com.cn/1709346044/pics/1732119402907254.png)
三、程序修改
在main.c包含头文件
#include "lvgl.h" #include "lv_port_disp.h" #include "lv_demo_stress.h"

添加LVGL运行所需的心跳包
![1732119560402401.png SITG]RXE2E)CUKP@2C6HK(F.png](http://uphotos.eepw.com.cn/1709346044/pics/1732119560402401.png)
main函数处执行代码
//LCD初始化
bsp_lcd_test();
//LVGL Demo演示
lv_init();
lv_port_disp_init();
lv_demo_stress();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
lv_timer_handler();
}
/* USER CODE END 3 */
}其他文件修改,examples/porting/lv_port_disp.c

增加宏定义屏幕尺寸宽为800,高度480
搜索disp_flush函数,这个函数用于屏幕像素数据刷新
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
if(disp_flush_enabled) {
/*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/
int32_t x;
int32_t y;
for(y = area->y1; y <= area->y2; y++) {
for(x = area->x1; x <= area->x2; x++) {
/*Put a pixel to the display. For example:*/
/*put_px(x, y, *color_p)*/
LCD_DrawPixel(x,y,color_p->full);//添加该行代码,为LCD驱动的绘点函数
color_p++;
}
}
}
/*IMPORTANT!!!
*Inform the graphics library that you are ready with the flushing*/
lv_disp_flush_ready(disp_drv);
}只需添加LCD_DrawPixel(x,y,color_p->full);
搜索disp_init函数,这个函数用于执行LCD屏幕的初始化
由于我在main.c文件已经执行过LCD屏幕初始化,所以disp_init函数没有修改,保持默认

编译无误后烧录固件至开发板
四、实验结果
LVGL的stress测试例程可以运行

我要赚赏金
