LittleVGL不完全指南(一) 您所在的位置:网站首页 STM32SPI-FSMC刷屏 LittleVGL不完全指南(一)

LittleVGL不完全指南(一)

2024-03-14 14:25| 来源: 网络整理| 查看: 265

LittleVGL不完全指南文章目录

LittleVGL不完全指南(一)——STM32移植F429IG_spi屏

 

 

文章目录 系列文章目录前言一、获取LittleVGL二、移植总结

 

前言

LittlevGL是一个免费的开放源代码图形库,它提供创建嵌入式GUI所需的一切,它具有易于使用的图形元素,精美的视觉效果和低内存占用;

它是一个开源的图像库,旨在为嵌入式设备提供一个精美的界面,当然嵌入式设备只是一部分,由于它是使用标C所写,你可以很轻松的移植到更多设备上,包括但不局限于嵌入式设备

支持的平台: STM32F1, STM32F3, STM32F4, STM32F7 Microchip DSPIC33, PIC24, PIC32MX, PIC32MZ NXP Kinetis, LPC, iMX Linux frame buffer (/dev/fb) Raspberry Pi Espressif ESP32 Nordic nrf52 Quectell M66 可以看到,我们常见的单片机几乎都支持(16bit及以上),之所以能够同时支持这么多平台是因为littlevGL对硬件的要求没有太高,一般来说只要能驱动显示屏且Flash大于64KB,RAM大于20KB的单片机都可以使用。  

官网网站: https://littlevgl.com/ Github项目主页: https://github.com/littlevgl/lvgl

 

一、获取LittleVGL

github获取

源码:https://github.com/littlevgl/lvgl

中国镜像GitHub https://codechina.csdn.net/mirrors/littlevgl/lvgl

根据网页说明,目前在测试V8,所以我们要下载V7,目前本文使用最新的7.10.4

下载

二、移植

注意:默认已经建好一个可用的STM32F429IG的Keil5工程,并拥有Lcd及驱动

1.新建一个文件夹命名为LittleVGL,将下载的所有文件copy进去

why to do  this ,因为这样能避免一些麻烦,比如路径问题

当然也可以如这样,简洁

 

2.将lv_conf_template改为lv_conf必须改,examples\porting下的也要改,不改也行,但这是给人看的

记得.c .h 都改,文件里面也要改,if 0 改 if1

然后添加所有路径和src及 examples\porting下的c文件(驱动文件,用哪个添哪个)到mdk

lv_conf的必要修改

LV_HOR_RES_MAX和LV_VER_RES_MAX是屏幕像素数量(分辨率)

下一个是颜色深度,没啥好说的

LV_COLOR_16_SWAP 交换2字节的RGB565颜色。如果用串行设备且为8位会很有用,因为u16类型强转u8指针会先指向低8位

这里我用的是 中景园0.96寸80x160 IPS显示屏st7735s主控 spi接口,说以置1

/*==================== Graphical settings *====================*/ /* Maximal horizontal and vertical resolution to support by the library.*/ #define LV_HOR_RES_MAX (160) #define LV_VER_RES_MAX (80) /* Color depth: * - 1: 1 byte per pixel * - 8: RGB332 * - 16: RGB565 * - 32: ARGB8888 */ #define LV_COLOR_DEPTH 16 /* Swap the 2 bytes of RGB565 color. * Useful if the display has a 8 bit interface (e.g. SPI)*/ #define LV_COLOR_16_SWAP 1

dpi 注释够详细了,不过别太小不然有些复杂的界面显示不出来,一般保持不变就好 

/* Dot Per Inch: used to initialize default sizes. * E.g. a button with width = LV_DPI / 2 -> half inch wide * (Not so important, you can adjust it to modify default sizes and spaces)*/ #define LV_DPI 130 /*[px]*/

小部件用的buf,一般也不动,如果ram不足或显示有问题时再改

/* Maximum buffer size to allocate for rotation. Only used if software rotation is enabled. */ #define LV_DISP_ROT_MAX_BUF (10U * 1024U)

其他就占时不管了,可以自己读注释,基本能看明白 

lv_port_disp

LVGL需要一个内部绘制小部件的缓冲区,稍后这个缓冲区将传递给您的显示驱动flush_cb,以复制其内容到您的显示。缓冲区必须大于1个显示行有三种缓冲配置

1. 创建一个有一些行的缓冲区:LyGL将在这里绘制显示内容并将其写入display

2. 创建两个缓冲区,包含一些行:LVGL将绘制显示的内容到缓冲区,并写入您的显示。您应该使用DMA将缓冲区的内容写入显示t将使LVGL绘制屏幕的下一部分到另一个缓冲区,而同时数据是从第一个缓冲区发送的。它使呈现和刷新并行

3. 创建两个屏幕大小的缓冲区类似于2),但缓冲区必须是屏幕大小。当LVGL准备好时,它将给整个帧显示。这样你只需要改变帧缓冲区的地址,而不是复制像素

我屏小ram多,选3 

同时修改屏幕大小 和最后的disp_drv.buffer = &draw_buf_dsc_3;记得修改

完成static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)函数

并在传输完毕后调用lv_disp_flush_ready(disp_drv)告知LVGL我画完了,我用dma,所以lv_disp_flush_ready(disp_drv);在dma回调里调用

避坑指南 : lv_color_t * color_p是个指针指向缓冲区buf 并不是一个颜色值而更像是个color_p[]所以记得要地址增加(手动(自己写底层)或自动(hal库,dma)) !!!!!  

在.h文件中声明void lv_port_disp_init(void); 然后 n ms调用一次     lv_tick_inc( n ); eg:1ms    lv_tick_inc(1);

最后初始化和循环调用        lv_task_handler();//lvgl的事务处理  

lv_init(); lv_port_disp_init(); while (1) { lv_task_handler();//lvgl的事务处理 }

 如果有触摸还要初始化触摸    循环调用坐标获取函数,本文未用到

然后编译下载

总结

 

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有