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

LittleVGL不完全指南文章目录

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


 

 

 


前言

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的事务处理
  }

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

然后编译下载


总结

 

 

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值