LVGL移植关键点
LVGL移植整体流程
- 确定输入、输出设备
- 输入:触摸屏、鼠标、键盘以及编码器;输出:显示屏
- 准备LVGL库、例程
- 准备V8.2版本的LVGL库文件,还有支持所需功能的例程源码
- 添加LVGL库到工程
- 按需裁剪、修改LVGL库文件,并添加到MDK工程中
- 配置输入、输出设备
- 适配自己的输入和输出设备,添加所需功能(例如系统)
- 提供心跳、测试
- 为LVGL提供时基,写测试代码检测移植是否成功
LVGL移植准备
移植前需要确定的功能
LVGL移植课堂代码功能汇总
课堂代码下载
链接:https://pan.baidu.com/s/1F_-FytsIUXx35iHGNTdI7Q
提取码:qwer
LVGL移植演示
课堂代码1
课堂代码1:带触摸、裸机、内部SRAM、LVGL自带内存管理
- 《触摸屏实验》源码
- 《基本定时器中断实验》源码
- LVGL库文件
移植步骤1
- 裁剪LVGL库文件(保留官方demo)
- 把 lv_conf_template.h 文件名修改成 lv_conf.h
- 打开 lv_conf.h 文件,修改条件编译指令,把#if 0 修改成#if 1
- 重命名工程名称为《 LVGL移植课堂代码1 》,添加定时器文件
- 按以下结构新建文件夹:
移植步骤2
- 把裁剪后的LVGL库文件复制到 Middlewares/LVGL/GUI/lvgl 路径下
- 打开《 LVGL移植课堂代码1 》工程,编译 ,修改工程名称,再添加分组
移植步骤3
- 添加LVGL相关的.c文件到相应分组,如下:
移植步骤4
- 添加头文件路径:
-
开启C99模式
-
屏蔽MDK警告(慎用,非必须),在配置界面 C/C++的 Misc Controls 栏中填入(不要有空格):–diag_suppress=68,111,188,223,546,1295
移植步骤5
配置输出(屏幕)
- 把 lv_port_disp_template.c/h 的条件编译指令 #if 0 修改成 #if 1
- 包含输出设备驱动头文件
- 在 disp_init 函数中初始化屏幕设备,设置横屏
- 配置图形数据缓冲模式
- 设置屏幕尺寸(默认横屏)
- 在 disp_flush 函数中配置打点输出
移植步骤6
配置输入(触摸)
- 把 lv_port_indev_template.c/h 的条件编译指令 #if 0 修改成#if 1
- 按需裁剪输入设备
- 包含输入设备驱动头文件
- 在 touchpad_init 函数中初始化触摸屏
- 配置触摸检测函数
- 配置坐标获取函数
移植步骤7
提供时基
- 添加定时器驱动
- 在定时器驱动.c文件中包含:#include “lvgl.h”
- 在定时器中断函数(回调)中调用:lv_tick_inc(x);
- 初始化定时器时,需保证:进入中断的时间间隔 = x 毫秒
移植步骤8
main函数部分
- 在main.c文件中包含头文件:
- 初始化定时器、LVGL库、输入输出设备:
- 在while中每隔5ms调用一次lv_timer_handler();
- 编写测试代码:
移植压力测试示例
-
把 demos 文件夹复制到 Middlewares/LVGL/GUI_APP 路径下
-
添加头文件路径,如下:
-
打开 lv_conf.h 文件,找到宏定义 LV_USE_DEMO_STRESS 并设置为 1
-
新建Middlewares/LVGL/GUI_APP工程组,添加 demos/stress 文件夹下的lv_demo_stress.c 文件
-
main.c文件里包含头文件:#include “lv_demo_stress.h”
-
初始化官方demo:lv_demo_stress();
移植音乐播放器示例
-
把 demos 文件夹复制到 Middlewares/LVGL/GUI_APP 路径下
-
添加头文件路径,如下
-
打开 lv_conf.h 文件,找到宏定义 LV_USE_DEMO_MUSIC 并设置为 1
-
新建Middlewares/LVGL/GUI_APP工程组,添加 demos/music 文件夹下的全部.c 文件
-
此时编译可能会报错,打开 lv_conf.h 文件,找到相应字体的宏并设置为1即可
-
main.c文件里包含头文件:#include “lv_demo_music.h”
-
初始化官方demo:lv_demo_music();
课堂代码2
课堂代码2:带触摸、FreeRTOS、内部SRAM、LVGL自带内存管理。
-
《LVGL移植课堂代码1》源码
-
《LVGL例程2 操作系统移植》源码
移植步骤1
- 重命名工程名称为《 LVGL移植课堂代码2 》
- 移植FreeRTOS相关文件:
移植步骤2
- 打开《 LVGL移植课堂代码2 》工程,添加分组:
- 添加FreeRTOS相关的.c文件到相应分组中:
移植步骤3
- 添加头文件路径(以F429为例):
- 打开HAL库中断相关的.c文件,屏蔽SysTick 中断、SVC 中断、PendSV 中断
移植步骤4
- 修改宏定义__NVIC_PRIO_BITS,由4U改为4即可
-
在lv_conf.h文件中配置自定义时钟源,删除定时器提供时基的部分代码
-
新建lvgl_demo.c/.h文件,创建OS任务,调用/编写demo
-
在main.c中包含头文件#include “lvgl_demo.h”,调用lvgl_demo();函数
拓展知识
-
建立专门存放lvgl用户代码的文件,管理更加方便
-
编译的时候报内存不够如何处理?
-
修改lv_conf.h,适当减小分配给LVGL管理的内存
-
lv_port_disp_timplate.c,适当减小图形缓冲区的大小,同时需要兼顾运行效果
-
FreeRTOSConfig.h,适当减小分配给FreeRTOS的内存,简单的工程,一般10~20k就够用了
课堂代码3
课堂代码3:带触摸、FreeRTOS、外部SRAM、自研内存管理算法。
-
《LVGL移植课堂代码2》源码
-
《内存管理实验》源码
外部SRAM驱动移植
-
重命名工程名称为《 LVGL移植课堂代码3 》
-
添加SRAM驱动相关文件:
- 打开工程,添加.c文件到相应分组中:
-
包含外部sram驱动头文件:#include “./BSP/SDRAM/sdram.h” 或 #include"./BSP/SRAM/sram.h"
-
初始化外部sram:sdram_init();或 sram_init();
外部SRAM使用
-
场景1:把LVGL管理的内存空间放到外部SRAM(非常不推荐)
- 确定外部SRAM首地址,根据需求确定地址偏移
- 在lv_conf.h中将LV_MEM_ADR定义到外部SRAM的地址(不一定是首地址)
-
场景2:把绘图缓冲区放到外部SRAM(内部空间匮乏时可取)
- 确定外部SRAM首地址,根据需求确定地址偏移
- 在lv_port_disp_template.c中创建全屏分辨率大小的数组,并将其定位到外部SRAM的地址
自研内存管理算法移植
- 添加内存管理相关文件:
- 打开工程,添加分组和.c文件:
- 包含内存管理算法头文件:#include “./MALLOC/malloc.h”
LVGL中消耗内存的地方
注意:不同的项目,内存分配的比例不同,一般分配给LVGL管理的内存为15~40k字节
自研内存管理配置流程
- 配置需要管理的内存池大小
在malloc.h文件中通过相关的宏来定义,不同板子代码的宏定义不同
- 初始化需要管理的内存池
调用my_mem_init函数对所需要管理的内存池进行初始化即可
- 适配自研的内存管理算法
编写LVGL内存分配、内存释放、内存重新分配这三个函数,配置相关宏定义
LVGL自带内存管理配置流程
- 配置需要管理的内存池大小
通过lv_conf.h中的LV_MEM_SIZE来定义,以字节为单位
- 创建需要管理的内存池
有3种方式:①大数组、②地址段、③内存分配函数
课堂代码4
课堂代码4:带触摸、FreeRTOS、DMA2D、内部SRAM、LVGL自带内存管理。
-
《LVGL移植课堂代码2》源码
-
支持DMA2D的开发板和RGB屏幕
DMA2D使用
-
重命名工程名称为《 LVGL移植课堂代码4 》
-
修改lv_conf.h中相关的宏定义,开启DMA2D
-
在MDK配置中添加对应芯片的定义
-
配置DMA2D外设
LVGL移植相关文件介绍
LVGL移植相关的文件如下:
lv_conf.h是一个用户级别的文件,不同工程可以有不同的 lv_conf.h