第二节 LVGL移植

LVGL移植关键点

第二节 LVGL移植_第1张图片

LVGL移植整体流程

  1. 确定输入、输出设备
    • 输入:触摸屏、鼠标、键盘以及编码器;输出:显示屏
  2. 准备LVGL库、例程
    • 准备V8.2版本的LVGL库文件,还有支持所需功能的例程源码
  3. 添加LVGL库到工程
    • 按需裁剪、修改LVGL库文件,并添加到MDK工程中
  4. 配置输入、输出设备
    • 适配自己的输入和输出设备,添加所需功能(例如系统)
  5. 提供心跳、测试
    • 为LVGL提供时基,写测试代码检测移植是否成功

LVGL移植准备

移植前需要确定的功能

第二节 LVGL移植_第2张图片

LVGL移植课堂代码功能汇总

第二节 LVGL移植_第3张图片

课堂代码下载

链接: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 》,添加定时器文件
  • 按以下结构新建文件夹:

第二节 LVGL移植_第4张图片

移植步骤2

  • 把裁剪后的LVGL库文件复制到 Middlewares/LVGL/GUI/lvgl 路径下
  • 打开《 LVGL移植课堂代码1 》工程,编译 ,修改工程名称,再添加分组

第二节 LVGL移植_第5张图片

移植步骤3

  • 添加LVGL相关的.c文件到相应分组,如下:

第二节 LVGL移植_第6张图片

移植步骤4

  • 添加头文件路径:

第二节 LVGL移植_第7张图片

  • 开启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函数部分

  1. 在main.c文件中包含头文件:

第二节 LVGL移植_第8张图片

  1. 初始化定时器、LVGL库、输入输出设备:

第二节 LVGL移植_第9张图片

  1. 在while中每隔5ms调用一次lv_timer_handler();
  2. 编写测试代码:

第二节 LVGL移植_第10张图片

移植压力测试示例

  • 把 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();

第二节 LVGL移植_第11张图片

移植音乐播放器示例

  • 把 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();

第二节 LVGL移植_第12张图片

课堂代码2

课堂代码2:带触摸、FreeRTOS、内部SRAM、LVGL自带内存管理。

  • 《LVGL移植课堂代码1》源码

  • 《LVGL例程2 操作系统移植》源码

移植步骤1

  • 重命名工程名称为《 LVGL移植课堂代码2 》
  • 移植FreeRTOS相关文件:
    第二节 LVGL移植_第13张图片

移植步骤2

  • 打开《 LVGL移植课堂代码2 》工程,添加分组:

在这里插入图片描述

  • 添加FreeRTOS相关的.c文件到相应分组中:

第二节 LVGL移植_第14张图片

移植步骤3

  • 添加头文件路径(以F429为例):

在这里插入图片描述

  • 打开HAL库中断相关的.c文件,屏蔽SysTick 中断、SVC 中断、PendSV 中断

第二节 LVGL移植_第15张图片

移植步骤4

  • 修改宏定义__NVIC_PRIO_BITS,由4U改为4即可

第二节 LVGL移植_第16张图片

  • 在lv_conf.h文件中配置自定义时钟源,删除定时器提供时基的部分代码

  • 新建lvgl_demo.c/.h文件,创建OS任务,调用/编写demo

  • 在main.c中包含头文件#include “lvgl_demo.h”,调用lvgl_demo();函数

拓展知识

  • 建立专门存放lvgl用户代码的文件,管理更加方便

  • 编译的时候报内存不够如何处理?

第二节 LVGL移植_第17张图片

  1. 修改lv_conf.h,适当减小分配给LVGL管理的内存

  2. lv_port_disp_timplate.c,适当减小图形缓冲区的大小,同时需要兼顾运行效果

  3. FreeRTOSConfig.h,适当减小分配给FreeRTOS的内存,简单的工程,一般10~20k就够用了

课堂代码3

课堂代码3:带触摸、FreeRTOS、外部SRAM、自研内存管理算法。

  • 《LVGL移植课堂代码2》源码

  • 《内存管理实验》源码

外部SRAM驱动移植

  • 重命名工程名称为《 LVGL移植课堂代码3 》

  • 添加SRAM驱动相关文件:

第二节 LVGL移植_第18张图片

  • 打开工程,添加.c文件到相应分组中:

在这里插入图片描述

  • 包含外部sram驱动头文件:#include “./BSP/SDRAM/sdram.h” 或 #include"./BSP/SRAM/sram.h"

  • 初始化外部sram:sdram_init();或 sram_init();

外部SRAM使用

  • 场景1:把LVGL管理的内存空间放到外部SRAM(非常不推荐)

    1. 确定外部SRAM首地址,根据需求确定地址偏移
    2. 在lv_conf.h中将LV_MEM_ADR定义到外部SRAM的地址(不一定是首地址)
  • 场景2:把绘图缓冲区放到外部SRAM(内部空间匮乏时可取)

    1. 确定外部SRAM首地址,根据需求确定地址偏移
    2. 在lv_port_disp_template.c中创建全屏分辨率大小的数组,并将其定位到外部SRAM的地址

自研内存管理算法移植

  • 添加内存管理相关文件:

第二节 LVGL移植_第19张图片

  • 打开工程,添加分组和.c文件:

第二节 LVGL移植_第20张图片

  • 包含内存管理算法头文件:#include “./MALLOC/malloc.h”

LVGL中消耗内存的地方

第二节 LVGL移植_第21张图片

注意:不同的项目,内存分配的比例不同,一般分配给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移植相关的文件如下:

第二节 LVGL移植_第22张图片

lv_conf.h是一个用户级别的文件,不同工程可以有不同的 lv_conf.h

lv_conf.h文件内容介绍

第二节 LVGL移植_第23张图片

你可能感兴趣的:(实战LVGL系列,stm32,单片机,arm开发,ui,LVGL)