stm32移植LVGL(LVGL 8.2.0)

时间:2024-11-01 08:12:25

目录

1.下载LVGL源码

2.修改LVGL文件夹

(1)文件夹 examples 改动

(2)文件夹 demos 改动 

3.最终LVGL文件夹内容

4.软件Keil配置、添加头文件 

5.程序配置 

6.其它配置参考链接


1.下载LVGL源码

LVGL源码地址:https://github.com/lvgl/lvgl

2.修改LVGL文件夹

只需要这5个文件即可,把他们复制到一个新创建的 LVGL文件夹 里面。

(1)文件夹 examples 改动

        在 examples文件夹 里面,只需要保留 porting文件夹 下面的文件夹,其余删除。

        在 porting文件夹 里面,只需要保留下面 4个文件,其余删除。 

 

(2)文件夹 demos 改动 

        在 demos文件夹 里面,只需要保留 keypad_encoder文件夹 下面的文件夹,其余删除。 

 (3)移动 porting、keypad_encoder文件夹

        把 demos里面的porting 和 examples里面的keypad_encoder 移动到  LVGL 目录下。

3.最终LVGL文件夹内容

4.软件Keil配置、添加头文件 

(1)首先复制 LVGL 文件夹,粘贴到STM32工程目录下,然后在MDK中包括LVGL的头文件和设置c99模式。

(2)MDK里面创建4个新的文件

文件夹名称 (Groups) 用于存放什么文件
LVGL_myGui 用户自己的界面代码文件、官方demo等
LVGL_conf LVGL 的两个h文件
LVGL_porting LVGL 的接口文件, 如显示、触摸屏、键盘等
LVGL_src LVGL 的所有底层c文件

重要:

        每个文件夹(Group),需要添加的文件,如下表:

文件夹  需要添加的文件
LVGL_myGui 不用添加。
LVGL_conf 共3个文件:"LVGL"下的: lv_conf_template.h、lvgl.h、lv_version.h(要选择文件类型才能看到h文件)
LVGL_porting 共4个文件:"LVGL/ porting" 下的:lv_port_disp_template.c 、lv_port_disp_template.h、 lv_port_indev_template.c、lv_port_indev_template.h;(要选择文件类型才能看到 h 文件)
LVGL_src 近200+的c文件:"LVGL / src" 下的所有 c 文件(重点:包括src里所有子、子子文件夹的 c 文件. 不用添加h和mk文件)

5.程序配置 

1、启用 lv_conf_template.h

双击打开 lv_conf_template.h,对以下内容进行修改,以启用此文件。

  • 第15行,原:#if 0,修改为:#if 1 

完成后,是这个样子的:

2、启用 lv_port_disp_template.h

双击打开 lv_port_disp_template.h,修改以下内容,以启用此文件:

  • 第7行,原:#if 0, 修改为:#if 1 
  • 第22行,原:“lvgl/lvgl.h", 修改为:”lvgl.h"

完成后,是这个样子的:

3、启用  lv_port_disp_template.c 

双击打开 lv_port_disp_template.c,修改以下内容,以启用此文件:

  • 第7行,原:#if 0, 修改为:#if 1 

完成后,是这个样子的:

4、添加 LCD 驱动的头文件

在 lv_port_disp_template.c中:

  • 第14行,插入你的LCD驱动文件,如:#include "bsp_LCD_ILI341.h",写上你的h文件。
  • 第20行、第25行,是显示屏的宽、高度。查看你的显示屏参数,填写实际像素即可。

插入LCD的头文件,目的是为了让这个c文件,能调用LCD的: 画点函数;

注意一个:LVGL默认使用横屏的方式,这一点要注意,别写反了。

完成后,是这个样子的

5、选择创建缓存的方式,3选1

还是在 lv_port_disp_template.c 中,向下滚动,

(会出现很多错误提示,不用管。也可以先编译一次,让刚才启用的h文件生效,错误就会消失)

第86行到101行,LVGL 提供了创建显示缓冲区的3种方式,这里,必须3选1。

绝大多数情况下,使用第1种方法,即:只创建1个缓冲区;

  • 注释掉第90~101行,即:不使用第2和第3种方法;

完成后,是这个样子的:

6、关联 画点函数

还是在 lv_port_disp_template.c 中,向下滚动,找到disp_flush( )函数(我这里用的最新版本源文件,这个disp_flush( )函数的参数不一样,后面有更改方法)

  • 第173行,替换你的 LCD 的画点函数;  参数:x坐标、y坐标、16位颜色值。
  • 小编用的画点函数:LCD_DrawPoint( x, y, color_p->full) ;

你的画点函数,可能和小篇所用的不一样,照样画瓢即可。

完成后,是这个样子的:

这里给LVGL一个画点函数后, LVGL就能完成需要的显示操作了。

进阶技巧:提高刷屏效率

一般地,画点函数的底层操作:发送X坐标指令、X值、Y坐标指令、Y值、颜色值。

假如要刷320x240的整屏,至少传输14万次指令、14万次坐标值,7万次颜色值。

相当地耗时。

要是你的LCD驱动文件中,有区域填充颜色的函数,就能大量地减少指令、坐标值的发送次数。

下面是使用 魔女开发板 LCD驱动文件中所提供的 区域填充 函数,可以效仿参考。

  • LCD_DispFlush(area->x1, area->y1, area->x2, area->y2, (uint16_t*)color_p);

如果没有区域填充函数,不用强求,直接使用画点函数吧,先完成,再完善。

至此,显示部分的修改、注册,已完成。

点击编译:0 Erros。

7、disp_flush( )​​​​​​​函数不一样

6.其它配置 参考链接

https://blog.****.net/mucherry/article/details/126685909?spm=1001.2014.3001.5501

https://openatomworkshop.****.net/6645ae51b12a9d168eb6c98d.html