这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【STM32H7S78-DK评测】轻量图形库LVGL移植

共3条 1/1 1 跳转至

【STM32H7S78-DK评测】轻量图形库LVGL移植

助工
2024-11-20 23:57:44     打赏

一、

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++调用

$YV(SD({MU}L_AGU9Q`7FH7.png

配合GUI Guider使用可以设计出精美图形界面

二、移植步骤

从LVGL开源****下载lvgl图形库源码

 https://github.com/lvgl/lvgl/tree/release/v8.3

这里演示 lvgl v8.3版本的移植步骤

7TFD(]Y]2$9{5XMM1%ACPU7.png

解压文件一览

图形库源码非常庞大,所以按应用需求来删去不需要使用的库文件

本次移植的文件主要有:

源码库根目录的demos、examples、src这三个文件夹,lv_conf_template.h、lvgl.h两个头文件

6LM0I~]0X2)ALSHE7C)[NMK.png

在examples目录删去除porting外的所有文件夹,这是显示相关的驱动库

为了便于工程管理,需要将文件的名称后缀_template删除,包括examples/porting目录下的文件

LVGL根目录文件结构

$X@TMSGL`I8F}QW9WI%KHT0.png

porting文件结构

 

T3U)XI~VV[(3DLC(2{IWAL5.png

                                                        以上移植文件统一放置在LVGL文件夹内

 将该文件夹复制到CubeIDE的APP工程目录下

image.png

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

~U_A[ETG6_$2Q(S(ANOL$L3.png

源文件导入

1XV@}N9817]HV[])M54@3Q9.png

三、程序修改

在main.c包含头文件

#include "lvgl.h"
#include "lv_port_disp.h"
#include "lv_demo_stress.h"

)L1G)8Z7R4B%3(UA~GLO__X.png

添加LVGL运行所需的心跳包

SITG]RXE2E)CUKP@2C6HK(F.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

9PSUXX3KFX6W4F83PF4%_[Y.png

增加宏定义屏幕尺寸宽为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函数没有修改,保持默认

P)J$DIMD%[BBLFC[~8G1NP0.png

编译无误后烧录固件至开发板

四、实验结果

LVGL的stress测试例程可以运行

screenshots.gif





关键词: 轻量图形库     LVGL    

专家
2024-11-21 01:22:21     打赏
2楼

感谢楼主分享


高工
2024-11-21 02:27:34     打赏
3楼

感谢楼主分享


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]