STM32笔记之 GUI(LittlevGL移植)
写在前面:
本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
目录
一、LittlevGL GUI
LittlevGL是一个免费的开放源代码图形库,它提供创建嵌入式GUI所需的一切,它具有易于使用的图形元素,精美的视觉效果和低内存占用;功能强大且易于使用的嵌入式GUI,具有许多小部件,高级视觉效果(不透明度,抗锯齿,动画)和低内存要求(16K RAM,64K Flash)
手册:https://docs.littlevgl.com/zh-CN/html/index.html
项目开源地址:https://github.com/littlevgl/lvgl
其他什么的,这里就不多解释了,上面链接里的内容都写的明明白白的
二、文件提取
首先,我们先 git clone,把它的提供的项目文件拉取下来,我这里是用的是 6.1.2发行版,打开文件夹可以看到如下文件:
然而我们真正需要的只是框选的文件,所以我们只需提取那几个文件就好了
如果你想要试一下官方提供的 Demo,可以再 git clone一个例子项目,链接:https://github.com/littlevgl/lv_examples
然后把下图框选的文件提取出来
三、移植操作及添加接口
文件提取完成后,并入到我们的工程里面(PS:这里截的是改好的文件)
lvgl/src文件太多,就不展开截图了,记住,src里的文件需要全部都添加进去,因为它包含了 lvgl的所有组件的功能
接着我们先打开管理整个 lvgl的配置文件,按照它描述修改就好了
从上图可以看到,我已经把它改成了 lv_conf.h了,还记得上面说的提取的 lv_conf_template.h文件吗?对滴,就是把它重命名了,另外有一些也是一样的道理,官方写的还是很明白的,实在不知道怎么操作,那就再翻手册呗;还有就是把需要用到的文件开头部分的 #if 0都修改为 #if 1
好了,当你琢磨完配置文件后,那么就来修改一下接口文件吧,就是上图的 lvgl/port的那三个文件,其实看名字就知道了
文件 | 说明 |
lv_port_disp | 配置显示器的接口功能的文件 |
lv_port_indev | 配置触摸等输入设备的接口功能的文件 |
lv_port_fs | 配置 FatFs文件系统的接口功能的文件 |
在这里,接入 FatFs文件系统的操作就不说,只讲另外的那两个,因为这两个才是最重要的
1、先来分析 lv_port_disp.c文件
- lv_port_disp_init函数
这里要做的主要是选择我们想要提供给 lvgl操作的显示缓存空间
设置 lvgl使用的显示尺寸,这里直接等于 lv_conf.h的宏就好了
- disp_init函数
这里添加你用的显示器初始化函数就完事了
- disp_flush函数
这里也是按照它说的,添加底层描点函数就行了,当然,保险一点,我们可以加上一些检测功能
2、再者分析 lv_port_indev.c文件
- lv_port_indev_init函数
这里面有包含很多输入设备的接口函数,从它注释可以知道
/* Here you will find example implementation of input devices supported by LittelvGL:
* - Touchpad
* - Mouse (with cursor support)
* - Keypad (supports GUI usage only with key)
* - Encoder (supports GUI usage only with: left, right, push)
* - Button (external buttons to press points on the screen)
*
* The `..._read()` function are only examples.
* You should shape them according to your hardware
*/
但是我们目前只需处理触摸的接口就行,其他的屏蔽掉
- touchpad_init函数
上面那个函数初始化的时候会调用到这里,而这里是用来存放我们添加的触摸底层接口
- touchpad_read函数
是会被库调用来读取 touchpad信息的,不用改动它,因为它留有接口出来,就是下面的函数
- touchpad_is_pressed函数
用来获取触摸状态的接口
- touchpad_get_xy函数
顾名思义,用来获取 xy坐标的
四、执行处理
在写好接口后,要让 lvgl执行起来其实很简单
1、初始化
初始化只需要添加这几个接口
2、lvgl时基
lvgl它需要一个时基来维持,在这里我是用 Systick时钟来为其提供需要,当然你也可以用其他定时器;传入参数是你对应所做的时基计数,单位是 ms
3、执行处理
我们需要周期执行 lv_task_handler这个函数,因为 lvgl的刷新靠的就是这个函数
五、Demo运行及配置
当你把以上的配置都弄好之后,那么你可以运行一下官方提供的 demo.c文件的例子,添加 demo_create函数
其余的都不用怎么改动
然后在 lv_ex_conf.h里面,打开你想要用的操作
效果:
还有其他效果,具体可以自己去摸索