Skip to content

移植

移植关键点

image-20240111173245328

显示是必须的

image-20240111175122572

image-20240111175227364

image-20240111175304448

实际移植

image-20240111180612620

把库文件放在GUI/lvgl文件夹里面

把示例文件放在GUI_APP文件夹里面

image-20240111181745589

image-20240111183043644

出现问题, 找不到文件lv_conf.h, 需要把跟文件夹下面的lv_conf_template.h改名

输入输出配置

image-20240111184612136

缓冲有三种:

  1. 单缓冲: 当屏幕的大小是800*480的时候, 设置的buf大小是十行的像素的大小
  2. 双缓冲: 有两个十行大小的buf, 交替使用(这个版本的优化不是很好)
  3. 全屏幕双缓冲
  4. image-20240111192347243

这里使用第一种, 添加宽度的宏定义, 之后屏蔽后面的代码

在设置屏幕的显示等都是在函数lv_port_disp_init里面实现的

image-20240111192639200

设置屏幕尺寸, 分别是水平和竖直的长度

image-20240111192920909

image-20240111193047629

设置打点的方式

image-20240111193355336

输入设备配置

image-20240111193513093

image-20240111193856557

删除其他设备的函数声明和结构体

lv_port_indev_init函数里面把不需要的设备删除

image-20240111195329701

初始化

image-20240111195611635

检测是否有触摸

image-20240111195744803

获取坐标

提供时基

image-20240111195843890

image-20240111200119155

在这个函数里面主要就是增加时基

c
LV_ATTRIBUTE_TICK_INC void lv_tick_inc(uint32_t tick_period)
{
    tick_irq_flag = 0;
    sys_time += tick_period;
}

测试

image-20240111200616599

在这一步会报错, 因为使用的内存过大

使用外部的SRAM

管理空间

image-20240526130657965

把内部管理空间放在外面, 这一个不推荐, 会使得速度降低

绘图空间

在创建缓冲区的时候, 放在外部的空间

内存管理

LVGL使用内存的地方是LVGL的管理, 图形缓冲区, OS以及其他一般使用15~40K字节

自研内存管理

  • 配置需要的内存池大小
  • 初始化需要的内存池
  • 配置自己的算法

编写lvgl的内存分配, 内存释放, 内存重新分配这三个函数, 在lv_conf.h这一个文件里面

image-20240526205020123

自带内存管理

这一个内存的大小是通过lv_conf.h文件里面的LV_MEM_SIZE这一个宏定义进行控制

创建一个需要管理的内存池有三种方法1. 大数组(默认) 2. 地址段 3. 内存分配

c
/**********************
 *   GLOBAL FUNCTIONS
 **********************/

/**
 * Initialize the dyn_mem module (work memory and other variables)
 */
void lv_mem_init(void)
{
#if LV_MEM_CUSTOM == 0

#if LV_MEM_ADR == 0
#ifdef LV_MEM_POOL_ALLOC
    //使用函数进行分配
    tlsf = lv_tlsf_create_with_pool((void *)LV_MEM_POOL_ALLOC(LV_MEM_SIZE), LV_MEM_SIZE);
#else
    /*Allocate a large array to store the dynamically allocated data*/
    //定义一个大数组, 这一个是默认的方法
    static LV_ATTRIBUTE_LARGE_RAM_ARRAY MEM_UNIT work_mem_int[LV_MEM_SIZE / sizeof(MEM_UNIT)];
    tlsf = lv_tlsf_create_with_pool((void *)work_mem_int, LV_MEM_SIZE);
#endif
#else
    //使用一块内存地址
    tlsf = lv_tlsf_create_with_pool((void *)LV_MEM_ADR, LV_MEM_SIZE);
#endif
#endif

#if LV_MEM_ADD_JUNK
    LV_LOG_WARN("LV_MEM_ADD_JUNK is enabled which makes LVGL much slower");
#endif
}

使用DMA2D

lv_conf.h文件里面

c
/*-------------
 * GPU
 *-----------*/

/*Use STM32's DMA2D (aka Chrom Art) GPU*/
#define LV_USE_GPU_STM32_DMA2D 0
#if LV_USE_GPU_STM32_DMA2D
    /*Must be defined to include path of CMSIS header of target processor
    e.g. "stm32f769xx.h" or "stm32f429xx.h"*/
    #define LV_GPU_DMA2D_CMSIS_INCLUDE
#endif

之后在这里加一下头文件, 在MDK配置里面添加一下这一个芯片的宏定义, 实际使用的时候还是在之前自己写的那一个填充函数里面使用DMA2D

文件

  • lv_port_disp_template.c/h 输出设备的配置文件
  • lv_port_indev_template.c/h 输入设备的配置文件
  • lv_conf.h 配置文件

lv_conf.h文件

  1. 颜色, 深度, 字节交换, 屏幕透明
  2. 内存, 算法的选择, 内存的大小
  3. 硬件层, 显示的周期以及输入设备的读取周期
  4. 特征, 绘图, 日志, 以及帧率显示
  5. 编辑器, 大数组前缀, 内存对齐
  6. 字体, 系统字体以及自定义字体
  7. 文本, 字符编码, 文本特性
  8. 核心部件, 使能以及失能部件
  9. 拓展, 使能失能第三方部件
  10. 实例