【LVGL学习之旅 01】移植LVGL到STM32

本文介绍了如何将LVGL图形库移植到STM32微控制器。内容涵盖LVGL的特点,移植前的开发环境和硬件准备,如Keil MDK和STM32开发板。详细步骤包括修改工程、添加源文件、配置LVGL、驱动适配及编译运行。提供了移植前后工程模板的GitHub链接,适用于需要在STM32上实现GUI的开发者。
摘要由CSDN通过智能技术生成

一、前言

littlevgl是一个小型开源嵌入式 GUI 库(简称LVGL),界面精美,消耗资源小,可移植度高,支持响应式布局,全库采用纯 c 语言开发,移植上手简单。
littleVGL 的主要特性如下:
• 具有非常丰富的内置控件,像 buttons, charts, lists, sliders, images 等
• 高级图形效果:动画,反锯齿,透明度,平滑滚动
• 支持多种输入设备,像 touchpad, mouse, keyboard, encoder 等
• 支持多语言的 UTF-8 编码
• 支持多个和多种显示设备,例如同步显示在多个彩色屏或单色屏上
• 完全自定制的图形元素
• 硬件独立于任何微控制器或显示器
• 可以缩小到最小内存 (64 kB Flash, 16 kB RAM)
• 支持操作系统、外部储存和 GPU(非必须)
• 仅仅单个帧缓冲设备就可以呈现高级视觉特效
• 使用 C 编写以获得最大兼容性(兼容 C++)
• 支持 PC 模拟器
• 为加速 GUI 设计,提供教程,案例和主题,支持响应式布局
• 提供了在线和离线文档
• 基于自由和开源的 MIT 协议
效果图以及更多详细的说明请见官网
littlevgl中文官网:https://littlevgl.cn/
littlevgl英文官网:https://lvgl.io/

二、学习资料

三、移植前的准备工作

开发环境:
  • Keil MDK5 v5.28
  • ARM Compiler 6.0版本或以上

关于编译器,老版本的5.x编译器也能编译,但是新的6版本的编译器在编译速度与效率上有很大的提升,并且解决了一些莫名其妙的bug,强烈建议升级到6版本的编译器。笔者使用的版本是v6.14.1。

硬件:
  • STM32开发板
  • 屏幕一块(单色点阵屏或者是LCD彩屏都可以)

笔者使用的开发板是正点原子的战舰V3开发板,芯片是STM32F103ZET6,72M主频+512k flash+64k ram,这样的性能足够跑LVGL了,当然,你的芯片性能越高肯定越好。哦,板上还外挂了一颗1M字节的SRAM,这对提升性能很有帮助。如果你用的不是这款芯片或者这块开发板,那也没关系,笔者会详细指出移植过程中不同的芯片移植需要注意的地方。

获取源码:

源码地址:https://github.com/lvgl/lvgl
源码有很多的发行版,不同的发行版对应着不同的LVGL版本,注意不同的版本之间是不同的,比如版本V6与版本V7之间就变化很大,具体的版本变化信息可以看它的release note,这里我以v7.1.0版本为例来移植,并且今后的学习都会使用这个版本。
LVGL v7.1.0源码下载
打开下载好的文件夹
LVGL v7.1.0源码结构
我们重点关注src/目录和lv_conf_template.h, lvgl.h 这几个文件,其它的暂时不用管。

准备模板工程:
  • 为你的开发板准备好一个模板工程
    要求:这个模板工程至少能够驱动一块屏幕(做GUI必须得有屏幕呀= =)
    如果你的屏幕带有触摸功能,那你的工程还需要有触摸屏的驱动,其实触摸屏驱动需要但非必须,没有触摸功能的话你也可以做一些展示的界面。事实上LVGL也支持键盘,鼠标,触控板等外设,因为在LVGL核心那里,它会将这些全部抽象为输入设备,它只需要从输入设备那里取得数据,并不关心你所用的是何种设备。

当然,触摸屏已经用得相当广泛,笔者使用的屏幕同样是正点原子家开发板配套的屏幕,型号:4.3英寸MCU屏,800*480分辨率,带电容触摸功能,其接口为16位并口,驱动IC:NT35510,触摸控制IC:GT9147,触摸控制接口为IIC。
因此我需要提前准备好并且测试好这些驱动,对于屏幕控制器,除了初始化API(就是函数),还需要提供填充LCD的API,像这样:

LCD_Color_Fill(x1,y1,x2,y2,(u16*)color_p);

(x1,y1), (x2,y2)为俩坐标点,color_p为显存指针,该API要实现的功能为:将显存区域内的像素数据点,依次填充到以(x1,y1)为起点, (x2,y2)为重点的对角矩形区域内。
注意,这个API是LVGL渲染屏幕的唯一API,哈哈哈简单吧。同样LVGL内部也不关心使用的何种屏幕,他们之间仅通过一个填充色块儿的API耦合,这种高内聚、低耦合的模块儿化设计思想是非常值得我们学习借鉴的。

四、开始移植

①修改MDK工程(默认你已经会使用keil了)

用keil mdk打开我们的模板工程,添加4个Groups:GUI_core, GUI_drv, GUI_demo, GUI_app,这些组用于添加我们的c代码到工程中,不同的组名意味着会存放不同功能的c代码。(注意:工程中的组与实际文件目录并不相同)

  • GUI_core:GUI核心文件层
  • GUI_drv:GUI驱动设备层,包括显示设备与输入设备
  • GUI_demo:存放官方demo
  • GUI_app:存放我们自己写的GUI应用
    修改后的工程结构:
    修改MDK工程
②添加源文件

在项目的根路径下新建GUI目录,以及GUI_app目录,然后将准备工作第三步下载到的源码直接解压到GUI/目录下,然后把解压出来的文件夹改名为lvgl;在GUI/目录下新建lvgl_driver目录,然后:

//从GUI\lvgl\examples\porting\目录拷贝:
lv_port_disp_template.c
lv_port_disp_template.h
lv_port_indev_template.c
lv_port_indev_template.h
// 到GUI/lvgl_driver/目录下并分别改名为:
lv_port_disp.c
lv_port_disp.h
lv_port_indev.c
lv_port_indev.h

//添加:
dma.c
dma.h
//这两个文件时我编写的使用DMA进行加速的代码,如果你不使用DMA请忽略

然后把GUI/lvgl/lv_conf_template.h拷贝到GUI/目录下并改名为lv_conf.h。
修改后的目录结构:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

③添加源文件到工程中

在GUI_core组中添加以下文件夹中所有的.c文件:

GUI/lvgl/src/lv_core
GUI/lvgl/src/lv_draw
GUI/lvgl/src/lv_font
GUI/lvgl/src/lv_hal
GUI/lvgl/src/lv_misc
GUI/lvgl/src/lv_themes
GUI/lvgl/src/lv_widgets
//注意不要添加 GUI/lvgl/src/lv_gpu中的文件,除非你用到了相关功能

在GUI_drv组中添加以下.c文件:

GUI/lvgl_driver/dma.c
GUI/lvgl_driver/lv_port_disp.c
GUI/lvgl_driver/lv_port_indev.c
④添加头文件路径

在这里插入图片描述

⑤修改配置文件

打开GUI/lv_conf.h
首先第十行设置为#if 1 使能整个配置文件
找到以下几个宏定义并修改

#define LV_HOR_RES_MAX          (480)//定义屏幕的最大水平分辨率
#define LV_VER_RES_MAX          (800)//定义屏幕的最大垂直分辨率
//修改为你的屏幕分辨率即可

/* Color depth:
 * - 1:  1 byte per pixel
 * - 8:  RGB332
 * - 16: RGB565
 * - 32: ARGB8888
 */
#define LV_COLOR_DEPTH     16
//定义颜色深度,如果是单色屏的话就改为1

#  define LV_MEM_SIZE    (30U * 1024U)
//给LVGL分配内存的大小,至少需要2k
  • 90
    点赞
  • 595
    收藏
    觉得还不错? 一键收藏
  • 31
    评论
在进行STM32 LVGL移植之前,需要进行一些准备工作。首先,需要准备一个STM32工程,并确保该工程中包含了TFT LCD控制器,即LTDC。通过LTDC,STM32F429系列芯片可以直接外接RGB LCD屏幕,实现液晶驱动。 其次,需要下载LVGL组件包。可以在lvgl-8.0.2目录下找到lvgl.h、lv_conf_template.h、LICENCE.txt和README.md这四个文件。将这四个文件复制到新建的GUI文件夹中,并确保lv_conf_template.h文件中的配置符合你的具体需求。 在移植LVGL过程中,还需要根据具体的硬件平台和需求,对LVGL进行配置和适配。这包括根据自己的需求进行UI设计、设置图形库的显示驱动程序、处理输入事件、内存管理以及定时器等的适配。通过参考LVGL的文档和示例代码,可以更详细地了解如何进行移植,并按照具体需求进行相应的配置和调整。 需要注意的是,LVGL移植过程可能会涉及到一些底层硬件的操作和配置,因此需要对硬件平台有一定的了解和熟悉。同时,移植过程中可能会遇到一些问题和挑战,需要进行一定的调试和优化。建议在移植过程中保持耐心,并及时查阅LVGL的官方文档和社区资源,以获取更多的帮助和支持。 总之,STM32 LVGL移植需要准备好STM32工程和LVGL组件包,并根据具体的硬件平台和需求进行配置和适配。移植过程中可能会遇到一些问题和挑战,但通过参考LVGL的文档和示例代码,并保持耐心和坚持,最终可以成功完成移植并使用LVGL来实现液晶驱动和UI设计。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值