1、添加lvgl库到mdk工程

①在工程中建立文件结构,如下:

 

 

②把lvgl_v8.2库中需要的文件copy到“LVGL_test\Middlewares\LVGL\GUI\lvgl”下

 

③“lv_conf.h”文件的条件编译指令 #if 0 修改成 #if 1

 

④打开mdk工程先编译,然后新建Groups,把前面copy的文件添加到工程中

然后添加相关的C文件,具体如下:

 

⑤添加头文件路径

 

⑥需要关注“C99 Mode”有没有勾上,必须勾上!

 

2、配置输出(屏幕)

①“lv_port_disp_templ.c”&“lv_port_disp_templ.h”将条件编译指令#if 0 改成 #if 1。然后把输出设备的头文件包含到lv_port_disp_templ.c中(就是把“lcd.h”include进去啦)

编译,发现会有宏没有进行define

把define补上:

(我这是竖屏)

 

②在void lv_port_disp_init(void)中设置屏幕的缓冲方式,选择单缓冲。(不需要的部分注释掉)

Tips:屏幕的缓冲方式有3种:单缓冲、双缓冲、双屏缓冲。单缓冲刷新最慢,双缓冲较快,双屏缓冲是最丝滑的,但是双屏缓冲占用的空间非常大。在lvgl_v8.2版本中,单缓冲和双缓冲的速度差别不大,为了节省空间,可以使用单缓冲。试验用的是单缓冲。

 

③设置屏幕分辨率(这个在void lv_port_disp_init(void)中)

 

④实现屏幕填充(本质就是一个个画点最终形成面)

LCD_Color_Fill()是原子哥实现的函数,正常是需要自己来实现的。

 

3、配置输入(触摸屏)

①“lv_port_indev_templ.c”&“lv_port_indev_template.h” 将条件编译指令#if 0 改成 #if 1。然后把输入设备的头文件包含到lv_port_indev_templ.c中(就是把touch.h包进去!)

 

②实现触摸检测

 

③实现坐标获取

    

4、为lvgl提供时基,功能测试

①在定时器驱动C文件包含:#include "lvgl.h",并在定时器回调函数中调用:#include "lvgl.h"

原子哥选择用timer来提供时基,我用systick。在中断C文件中“include lvgl.h”,在SysTick_Handler()函数中调用:lv_tick_inc(x);

Systick中断是1ms执行一次,所以lv_tick_inc(x)的x写1(进入中断的时间间隔 = x 毫秒)。lv_tick_inc的作用实际上就是告诉lvgl库现在距上一次时间过了多久。

 

②main.c文件中要添加的部分

         包含需要的头文件

   

         LVGL库、输入输出设备的初始化

  

③在while中每隔5ms调用一次lv_timer_handler();

 

隔多少ms调用一次都行,看你喜欢。

④编写测试代码(while循环前调用即可)

 

 

⑤烧录检验

 

烧录之后,发现屏幕上的显示不太对劲。横竖不太正确。

 

 

 

问题定位在:

 

 

让我们点进去看看LCD_Color_Fill这个函数干了什么:

 

 

我们追溯到LTDC_Color_Fill函数,可以看出这个函数主要是在向LCD屏幕传输数据。我选择的是竖屏,会执行else里的语句,进行了坐标系转换。但是DMA2D仍然是按照横屏的方向进行数据传输的。

 

我们抛弃LCD_Color_Fill的方式填充屏幕,使用最原始的画点方式:

 

 

烧录检测:

 

OK噜(●’◡’●)