(STM32)从零开始的RT-Thread之旅--SPI驱动ST7735(4)使用LVGL

news2024/11/16 15:27:48

上一篇:

(STM32)从零开始的RT-Thread之旅--SPI驱动ST7735(3)使用DMA

经过前几章的搭建,底层显示已经没有问题了,现在需要添加上层的库,我选择了比较火的开源GUI库--LVGL。而RT-Thread Studio支持直接添加LVGL代码库的。

在RT-Thread Settings中选择添加软件包:

直接搜索LVGL,然后添加:

然后保存  RT-Thread Settings 即可。

添加完成后我们需要把官方给的几个接口文件的模版添加到我们的应用代码里面,这些模版文件路径为:

packages\LVGL-latest\examples\porting

其中它们分别是:

最后还需要一个LVGL库的配置模版lv_conf_template.h,它在packages目录下。 把这几个文件名字中的模版后缀(template)去掉,添加到application文件夹下:

这时候编译会报一些错误:

主要是lvgl_thread_entry函数中找不到相关函数的定义:

看名字也该知道这几个就是我们刚才添加的模版文件相关的。我们仔细看一下这lv_rt_thread_port.c 这个文件,发现里面包含一个自动初始化的 lvgl_thread_init 函数,然后这个函数创建了一个 "LVGL" 的线程,现在是线程入口函数找不到相关定义。可以看出来,RT-Thread Studio已经帮我们生成好一部分代码了,我们现在只需修改接口模版文件适配我们的板子即可。

这里我暂时不使用lvgl的文件管理和输入设备,只保留显示:

打开几个模版文件可以看到,其实文件都被宏定义#if 0给注释掉了,所以现在使用哪个开哪个模块,但是lv_conf.h是必须打开的。然后修改模版文件中的头文件,也把后缀去掉:

然后在工程编译命令中添加宏定义 LV_LVGL_H_INCLUDE_SIMPLE

应用后保存。然后在 lv_port_disp.c 中修改屏幕大小,根据实际硬件设置:

然后LVGL给了三种初始化的方法,可以参考:

https://www.xyhtml5.com/22577.html

这里我选用第三种,把另外两种注释掉即可:

然后这个函数下面对buf的引用修改一下,修改为刚才使用方式3创建的:

然后我们只需要完善两个接口函数disp_initdisp_flush即可:

注意这里坐标系是朝下的: 

在mlcd.c中添加函数,这里使用区域绘制函数(如果使用一个点一个点的描点函数,则会非常卡):

其实就是套个壳,然后直接在disp_flush中调用: 

 

注意这里调用的mlcd_fill_rectangle其实最底层调用的是ST7735_FillRGBRect,这个函数的参数是宽、高,而不是坐标!我们想刷新整个屏幕时,刷新的区域是坐标(0,0)到(159,79)的矩形范围,但是转化为宽高则是起点为(0,0),宽为160,高为80的范围。我一开始没有+1,导致lvgl绘制出来的画面都是斜的,调试了很久都没有发现原因,太坑了。

最后再开启两个宏定义:

我们还需要给告诉LVGL时间,可以把lv_tick_inc加到SysTick_Handler函数里,参数单位是毫秒:

或者使用LVGL的宏定义,修改如下,注意头文件要换成你自己对应芯片的头文件:

以上两个方法只能选其一。 

再修改一下LVGL分配的内存,原始直接分配了128K,太大了,现在修改为10K:

 

可以修改lv_hal_disp.h中的 LV_DEF_REFR_PERIOD去修改FPS的上限,否则最高30!

如果发现显示的颜色有异常,可能是因为颜色是uint16类型的,但是SPI传输是uint8类型的,所以要注意大小端,可以在ST7735_FillRGBRect函数中修改:

写一个简单的文本显示测试一下:

int main(void)
{
    key_init();
    lv_obj_t* label = lv_label_create(lv_scr_act());
    lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR);//过长会滚动
    lv_obj_set_pos(label, 0, 0);
    lv_obj_set_size(label, 100, 16);
    lv_label_set_text(label, "Something project V1.0!");
    while (1)
    {
        rt_thread_mdelay(1000);
    }

    return RT_EOK;
}

 很丝滑~

 

推荐:

LVGL显示优化—基本优化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/30466.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能-4计算机视觉和图像处理01

深度学习简介 机器学习是实现人工智能的一种途径,深度学习是机器学习的一个子集 深度学习相比于机器学习,少了‘手动特征提取’部分,交给网络来处理 深度学习流程:数据输入–训练模型(在数据中学习)–输出预…

IP请求工具

无缝的 IP 分配和管理 手动将不同子网中的 IP 分配给不同的 IT 管理员,同时遵守配置的不同访问级别可能是一项繁琐的任务。为了简化IP请求和分配的过程,OpUtils为您提供了一个内置的IP请求工具。使用此工具,您的网络管理员不必再等待其 IP 请…

数据库笔记

文章目录01 数据库概述1.1 四个基本概念1.2 数据管理技术的三个阶段1.2.1 人工管理阶段1.2.2 文件系统阶段1.2.3 数据库阶段1.3 数据独立性1.4 数据库的三级模式结构1.4.1 三级模式结构1.4.2 数据库的二级映像与数据独立性02 关系数据库2.1 关系数据结构及形式化定义2.1.1 关系…

论文管理系统(增删查改功能的实现)

目录 一、后端 1.1实体类 1.2paperMapper类 1.3 PaperMapper类 1.4Service层 1.5 Controller层 二、前端 源代码 我们已经实现列表数据了,接下来我们将实现增删查改功能,新增和修改还能够回显 一、后端 1.1实体类 实体类还是我们上一版的列表功能的实现的paper实…

IFD-x 微型红外成像仪探测距离说明

红外热成像仪是用光学镜头来收集被测物体的热辐射能量的,故此探测距离会受镜头视场角 和热成像像素分辨率有关。 假如某成像仪的成像分辨率为 32*32 像素,视场角为 75 度,则可以理解为从镜头发射出 32*321024 条激光来探测 1024 个点的…

数据结构初阶:队列

目录 一、队列的概念和结构 二、队列的实现 定义队列结构 初始化队列 销毁队列 检测队列是否为空 入队列 出队列 获取队列头部元素 获取队列队尾元素 获取队列中有效元素个数 优化 三、测试 四、优化后的全部代码 一、队列的概念和结构 队列:只允许在一端进行插入数据操作…

【区块链】用Python实现一条区块链

用Python实现一条区块链 点击链接获取可执行文件 本文使用 python 实现了一条简单的区块链。主要分两个模块:实现每个区块的结构和相关的方法、实现整条区块链的结构和相关的方法。下面是对这两个模块的描述。 每个区块主要包括两个成员:区块头和区块…

GlobalWebsoket.js 的使用,实现获取实时数据

在称重小程序是使用 GlobalWebsoket 实现获取实时数据前言一、逻辑分析二、实现方式1.方法整体流转分析 -- 初始化并绑定1. onLoad1. init2. getDeviceInfo3. initWebSocket4. setProperties2.方法整体流转分析 -- 解除绑定1. onBackPress2. remoeSubscribe三、参数调用分析四、…

“大数据分析”相比“传统数据分析”优势明显,体现在哪些方面

一、大数据和数据分析的定义: 数据分析:指使用适当的统计分析方法来收集数据,以进行大量数据分析。 大数据分析:指在可承受的时间范围内无法使用常规软件工具捕获,管理和处理的数据集合; 数据分析的核心…

【web渗透思路】任意账号的注册、登录、重置、查看

目录 一、任意用户注册 1.未验证邮箱/手机号 2、不安全验证邮箱/手机号 3.批量注册 4.个人信息伪造 5.前端验证审核绕过 6.用户名覆盖 二、任意用户登录 1、万能密码 2、验证码、密码回显 3、登录检测不安全 三、任意账号重置 1、重置账号名 2、验证码 3、MVC数…

2022年第三季度泛出行行业洞察:泛出行行业正在经历数智化升级的关键时期,用户规模保持平稳增长,行业整体良性发展

易观分析:泛出行行业涵盖综合车主服务、车辆加油充电、网约车、旅游预定、酒店预定、户外出行等领域。当前泛出行领域正在经历传统模式向数智化新模式的转变,智能化升级和服务品质提升在该领域变革中正发挥着积极的作用。未来泛出行领域将在数智化、电动…

Web3:价值投资的范式转移

​潜力博主推荐,点上面关注博主 ↑↑↑ 进化是宇宙中最强大的力量,是唯一永恒的东西,是一切的驱动力。———桥水基金 雷.达利奥 时间拉长,进化才是人类的主旋律。过去,环境的变化是进化的主因。 现在,技…

Servlet | 深度剖析转发和重定向

一:深度剖析转发和重定向 (1)在一个web应用中通过两种方式可以完成资源的跳转 第一种方式:转发方式 第二种方式:重定向方式 (2)转发和重定向的区别 区别一:代码上的区别 ①转发 &a…

阿里资深专家撰写出的 Nginx 底层与源码分析手册,GitHub 已爆赞

NGINX 发展史: 过去最主流的服务器是 1995 年发布的 Apache 1.0。Apache 源于 NCSAHTTPd 服务器,是一个多进程模型的 Web 服务器。但运行到后期,Apache 渐渐出现很多问题,比如内存占用很大、扩展需挂接第三方库、并发能力受限等。…

高效的股票数据接口工具有哪些?

我们已经知道了量化投资是是通过数量化方式及计算机程序化发出买卖指令,以获取稳定收益为目的的交易方式,而其中最重要的载体是数据。在金融领域中量化的应用让金融分析师、外汇交易员、产品研发员等技术人员又有了新的用武之地,转型成为量化…

【微信小程序】saveFile:fail tempFilePath file not exist

开发微信小程序尝试保存文件时,会提示saveFile:fail tempFilePath file not exist错误,是什么问题呢,接下来带你如何分析和解决问题 文章目录1. 定位问题2. 解决问题1. 定位问题 首先,看一下代码怎么写得,如下所示 w…

数据结构之线性表中的顺序表【详解】

前言 现在是北京时间11月24号0点2分,天气有一些冷,我现在很困,但是博客还没写,我很想睡觉,假如我现在放弃的码字,往床上一趟,其实也不怎么样,但是我们不能有拖延症,所以…

关于元宇宙的六七八你知道多少?

🏠个人主页:黑洞晓威 🧑个人简介:大家好,我是晓威,一名普普通通的大二在校生,希望在CSDN中与大家一起成长。🎁如果你也在正在学习Java,欢迎各位大佬来到我的博客查漏补缺…

【MySQL篇】第三篇——表的操作

创建表 创建表案例 查看表结构 修改表 删除表 创建表 在创建数据库之后,接下来就要在数据库中创建数据表了。所谓创建数据表,指的是在已经创建数据库中建立新表。 创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性&am…

JAVA实训第二天

目录 JDK8新特性 Java8介绍 JAVA 8主要新特性 Java 8接口增强-默认方法 接口 接口的应用 Lambda表达式介绍 Lambda表达式的写法 功能性接口Lambda表达式的应用 函数接口 JDK8新特性 Java8介绍 •Java8是Java发布以来改动最大的一个版本,其中主要添加了函数式…