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噜(●’◡’●)