-
有一块显示屏,FMC接口或者SPI接口均可,SPI接口建议使用DMA方式加速
-
STM32F4及以上的开发板,不建议F1
-
能够完整驱动显示屏的一个项目,要求要有画点函数
- 获取lvgl 8.3 的源码,这里要注意各个版本不同,需要修改branch
- 裁剪lvgl 8.3 只需要
demos,examples/porting,src,lv_conf_template.h,lvgl.h几个文件(夹),这里注意要将porting文件夹提取出来
- 重命名,将
lv_conf_template.h改为lv_conf.h,examples/porting下的几个.c/.h文件也照此做
- 在Keil的
Manage Project Items里加入lvgl,需要新建lvgl/src,lvgl/porting,lvgl/demos三个文件夹
- 在
lvgl/src文件夹里加入BSP/lvgl/src文件夹里的所有.c文件,及其子文件夹内的.c文件,这一步相当繁琐,但是操作比较简单。可以不添加lvgl/src/draw/nxp_pxp,lvgl/src/draw/nxp_vglite,两个文件夹里的.c文件。这里大概光加文件有个五分钟工作量。
- 在
lvgl/porting文件夹内加入BSP/lvgl/porting内的所有.c文件,和上一目录的lv_conf.h文件
- 在
lvgl/demos文件夹内加入BSP/lvgl/demos内所需要演示例程的.c文件,这里只加入第一个例程benchmark,所以只添加benchmark文件夹(及其所有子文件夹)内所有.c文件即可
- 修改
lv_conf.h文件内容,首先启用编译#if 1
- 修改
lv_port_disp.c首先打开#if 1,接下来修改.h文件名称为lv_port_disp.h,并且修改垂直和水平分辨率,这里要与实际硬件对应
- 接下来打开
lv_port_disp.h,首先启用编译,接下来修改lvgl的相对路径为../lvgl.h
- 接下来打开
lv_port_disp.c,在void lv_port_disp_init(void)函数中选择三种缓存方式的一种,将其余两种注释掉,切换缓存方式时要注意可能这两个变量需要修改(方式一不用修改),若是SPI+DMA通讯,建议选择方式2,方式1对所有通讯都能用,但是最慢
- 在
static void disp_init(void)函数中,将LCD初始化的函数放进去。这里考虑到索引到函数的问题,建议把包含所有头文件的.h文件给放在lvgl.h中,相应,在需要调用lvgl函数时,也需要调用lvgl.h
- 在
static void disp_flush函数中实现画点函数(按官方注释来即可),如果有区域填充函数,也可以直接使用,不过要去掉官方的遍历功能,这里直接用了区域填充,这里的画点或者区域填充需要支持选择颜色,颜色为RGB565格式,使用color_p->full指向输出颜色。
- 之后调用
lv_tick_inc(1);来赋予LVGL心跳,若有RTOS操作系统,这里操作法不同,这里启动一个周期为1ms的定时器来给心跳。也有说使用uwTick去给心跳的,未测试。定时器给心跳记得开中断,NVIC小勾,Start_IT等细节。
- 周期性调用
lv_task_handler,确保LVGL能及时响应。这里放在主While循环中
- 如果需要使用demo去做测试,需要在
lv_conf.h文件中启用相应的demo宏定义
- 最后在main.c中添加代码进行测试,此下两个可任选其一,enjoy it!
HAL_TIM_Base_Start_IT(&htim6);
lv_init();
lv_port_disp_init();
lv_demo_benchmark(); HAL_TIM_Base_Start_IT(&htim6);
lv_init();
lv_port_disp_init();
lv_obj_t* checkbox_obj=lv_checkbox_create(lv_scr_act());
lv_obj_set_size(checkbox_obj,160,30);
lv_obj_align(checkbox_obj,LV_ALIGN_CENTER,0,0);示例程序-benchmark
- 如果benchmark不能顺利运行完,需要在启动文件.s中加大stack的容量
- 如果想监视系统的刷新率和CPU占用,需要在
lv_conf.h中将LV_USE_PERF_MONITOR置1
参考文献:


















