基于STM32移植lvgl(V8.2)(SPI接口的LCD)

目录

概述

1 认识LVGL

1.1 LVGL官网

1.2  LVGL库文件下载

2 认识SPI接口型LCD

2.1 PIN引脚定义

2.2 MCU IO与LCD PIN对应关系

 3 实现LCD驱动

 3.1 使用STM32Cube配置Project

 3.2 STM32Cube生成工程

4 移植LVGL

4.1 准备移植文件

4.2 添加lvgl库文件到项目

4.2.1 src下的文件

4.2.2 examples下的文件

4.2.3 配置文件路径

4.2.4 其他文件

4.3 工程目录下的文件结构

4.4 Keil中的编译配置

4.5 lvgl&lcd驱动接口

5 测试代码

5.1 主函数

5.2 测试函数

6 系统测试


概述

本文主要介绍基于STM32移植lvgl(V8.2)的详细过程,包括lvgl源代码的下载过程,如何加载这些文件到keil中,以及需要需改的接口文件内容。笔者使用的LCD屏幕为SPI接口类型,通过实操的方法完整的移植lvgl到stm32f4平台,并能完整的运行lvgl的demo。

1 认识LVGL

1.1 LVGL官网

LVGL是最流行的免费和开源嵌入式图形库,可为任何MCU, MPU和显示类型创建漂亮的UI。基于这个特点,其可以在一般的MCU上都能运行的,本文选取STM32F407芯片作为主控MCU,实现该UI库的移植。

官方网址:

https://lvgl.io/

登录网址后,可以看见如下页面,目前最新版本已经升级到 LVGL v8.4 and v9.1 are released!:

1.2  LVGL库文件下载

lvgl的源代码已经共享到github上,用户可以在网站上直接下载,下载地址如下:

https://github.com/lvgl/lvgl

打开链接可以看见如下页面:

笔者选择早期的v8.2版本作为移植对象,其下载链接如下:

https://github.com/lvgl/lvgl/releases/tag/v8.2.0

连接页面如下:

下载完成后打开代码库文件夹,核心文件如下:

2 认识SPI接口型LCD

2.1 PIN引脚定义

 LCD的PIN引脚功能介绍

序号模块引脚引脚说明
1VCC屏电源正
2GND屏电源地
3LCD_CS液晶屏片选控制信号,低电平有效
4LCD_RST液晶屏复位控制信号,低电平复位
5LCD_RS液晶屏命令/数据选择控制信号高电平:数据,低电平:命令
6SDI(MOSI)SPI总线写数据信号(SD卡和液晶屏共用)
7SCKSPI总线时钟信号(SD卡和液晶屏共用)
8LED液晶屏背光控制信号(如需要控制,请接引脚,如不需要控制,可以不接)
9SDO(MISO)SPI总线读数据信号(SD卡和液晶屏共用)
10CTP_SCL电容触摸屏IIC总线时钟信号(无触摸屏的模块不需连接)
11CTP_RST电容触摸屏复位控制信号,低电平复位(无触摸屏的模块不需连接)
12CTP_SDA电容触摸屏IIC总线数据信号(无触摸屏的模块不需连接)
13CTP_INT电容触摸屏IIC总线触摸中断信号,产生触摸时,输入低电平到主控(无触摸屏的模块不需连接)
14SD_CSSD卡片选控制信号,低电平有效(不使用SD卡功能,可不接)

实体LCD Port对应关系如下图所示

2.2 MCU IO与LCD PIN对应关系

STM32 PIN引脚LCD PIN引脚
PB5-MOSIMOSI
PB4-MISOMISO
PB3-SCKSCK
PB6CS
PB9RST
PB8RS

 3 实现LCD驱动

 3.1 使用STM32Cube配置Project

1) 配置SPI接口

SPI的参数

2)配置LCD的控制引脚

3)使能外部晶振

 3.2 STM32Cube生成工程

使用STM32Cube生成工程,并创建两个目录

User/lcd_drv     驱动文件目录

User/test           测试文件目录

LCD驱动代码的详尽情况,请参考笔者提供的源码,或者使用LCD的供应商提供的代码。

在移植LVGL库之前,必须保证LCD的驱动程序能够正确运行:

4 移植LVGL

4.1 准备移植文件

解压下载的lvgl源代码包,然后将如下文件目录和文件copy到工程目录下。各个文件或者文件夹的内容接口如下:

lvgl-8.2.0文件内容功能介绍
examples和MCU相关的驱动接口和应用Demo
srclvgl的核心源码包
lvgl.h资源引用的头文件
lv_conf_template.h资源配置头文件

4.2 添加lvgl库文件到项目

4.2.1 src下的文件

step-1: Core文件目录,添加该目录下所有的.c文件到

 step-2: draw文件目录,添加该目录下所有的.c文件到

 step-3: extra文件目录,添加该目录下所有的.c文件到

 step-4: font文件目录,添加该目录下所有的.c文件到

  step-5: hal文件目录,添加该目录下所有的.c文件到

  step-6: misc文件目录,添加该目录下所有的.c文件到

  step-7: widgets文件目录,添加该目录下所有的.c文件到 

4.2.2 examples下的文件

examples下的文件主要包括和mcu相关的接口函数和应用范例。移植代码时,只需移植porting目录下的文件即可。

4.2.3 配置文件路径

在Keil中配置文件夹路径,方便文件引用

4.2.4 其他文件

修改如下文件的名称,重新命名如下:

4.3 工程目录下的文件结构

完成以上步骤后,在项目文件中已经加载了lvgl的源代码,具体内容如下:

Keil中lvgl的文件结构如下:

4.4 Keil中的编译配置

 在keil中配置如下信息,其目的是避免编译lvgl源代码时,出现过多的warning

--diag_suppress=68 --diag_suppress=111 --diag_suppress=188 --diag_suppress=223 --diag_suppress=546  --diag_suppress=1295

4.5 lvgl&lcd驱动接口

在lv_port_disp_template.c文件中实现和LCD相关的驱动接口

step-1: 添加LCD驱动头文件

 

 step-2: 修改lcd的相关参数

  step-3: 初始化接口函数

 通过以上步骤,移植工作全部结束,lv_port_disp_template.c文件的详细代码:

/*** @file lv_port_disp_templ.c**//* Includes ------------------------------------------------------------------*/
#include "lv_port_disp_template.h"
#include "lvgl.h"
#include "lcd_drv.h"/* Private includes ----------------------------------------------------------*/
#define MY_DISP_HOR_RES             LCD_W
#define MY_DISP_VER_RES             LCD_H /* Private function prototypes -----------------------------------------------*/
static void disp_init(void);
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p);/* Private user code ---------------------------------------------------------*/
static void lcd_draw_fast_rgb_color(int16_t sx, int16_t sy,int16_t ex, int16_t ey, uint16_t *color)
{uint16_t w = ex-sx+1;uint16_t h = ey-sy+1;uint32_t draw_size = w * h;uint32_t i;LCD_SetWindows(sx, sy, w, h);// set point value for( i = 0; i < draw_size; i++){Lcd_WriteData_16Bit(color[i]);}
}static void disp_init(void)
{/*You code here*/lcd_gpio_init();LCD_Init();LCD_direction(USE_HORIZONTAL);LCD_Clear(WHITE);
}void lv_port_disp_init(void)
{disp_init();static lv_disp_draw_buf_t draw_buf_dsc_1;static lv_color_t buf_1[MY_DISP_HOR_RES * 10]; lv_disp_draw_buf_init(&draw_buf_dsc_1, buf_1, NULL, MY_DISP_HOR_RES * 10);static lv_disp_drv_t disp_drv;  lv_disp_drv_init(&disp_drv);disp_drv.hor_res = MY_DISP_HOR_RES;disp_drv.ver_res = MY_DISP_VER_RES;disp_drv.flush_cb = disp_flush;disp_drv.draw_buf = &draw_buf_dsc_1;lv_disp_drv_register(&disp_drv);
}static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{lcd_draw_fast_rgb_color(area->x1, area->y1, area->x2, area->y2, (uint16_t *)color_p);lv_disp_flush_ready(disp_drv);
}/* END of this file */

5 测试代码

5.1 主函数

代码122行: 初始化lvgl

代码123行:初始化显示接口

代码124行:调用测试函数

代码130行:调用刷新函数

5.2 测试函数

编写函数实现滑块显示,详细代码参看笔者的附近代码

6 系统测试

编译代码然后下载代码至MCU,运行代码,其结果如下:

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

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

相关文章

【Pytorch】6.torch.nn.functional.conv2d的使用

阅读之前应该先了解基础的CNN网络的逻辑 conv2d的作用 是PyTorch中用于执行二维卷积操作的函数。它的作用是对输入数据进行二维卷积操作&#xff0c;通常用于图像处理和深度学习中的卷积神经网络&#xff08;CNN&#xff09;模型。 conv2d的使用 我们先查看一下官方文档 inpu…

深度学习之前馈神经网络

1.导入常用工具包 #在终端中输入以下命令就可以安装工具包 pip install numpy pip install pandas Pip install matplotlib注&#xff1a; numpy是科学计算基础包 pandas能方便处理结构化数据和函数 matplotlib主要用于绘制图表。 #导包的代码&#xff1a; import numpy as n…

渲染农场评测:6大热门云渲染平台全面比较

在3D行业中&#xff0c;选择一个合适的云渲染平台可能会令许多专业人士感到难以抉择。为此&#xff0c;我们精心准备了6家流行云渲染平台的详尽评测&#xff0c;旨在为您的决策过程提供实用的参考和支持。 目前&#xff0c;市面上主要的3D网络渲染平台包括六大服务商&#xff0…

批量无人值守设备运维如何轻松搞定,设备授权和分组很关键

如今数字化时代&#xff0c;很多企业的一线业务依托无人值守的智能终端设备展开&#xff0c;这类设备的广泛使用可以帮助企业以较小的成本铺开大规模的业务&#xff0c;比如现在随处可见的智能售货机&#xff0c;商场的各类智能互动终端等等。 这类设备整体上可以降低业务开展…

[图解]分层架构是DDD提出的吗

1 00:00:00,040 --> 00:00:02,640 今天我们来说一下分层架构 2 00:00:04,310 --> 00:00:06,730 我经常看到一些文章 3 00:00:06,740 --> 00:00:10,390 或者是在开发团队里面看到 4 00:00:10,400 --> 00:00:12,940 有开发人员说&#xff0c;分层架构 5 00:00:12…

云粒智慧实时数仓的架构演进分享:OceanBase + Flink CDC

4月20日&#xff0c;在2024 OceanBase开发者大会上&#xff0c;云粒智慧的高级技术专家付大伟&#xff0c;分享了云粒智慧实时数仓的构建历程。他讲述了如何在传统数仓技术框架下的相关努力后&#xff0c;选择了OceanBase Flink CDC架构的实时数仓演进历程。 业务背景及挑战 …

iOS性能指标和性能测试工具

一&#xff1a; iOS性能测试指标 作为一名软件测试工程师&#xff0c;在测试 iOS 应用的性能时&#xff0c;需要关注以下几个方面&#xff1a; 1. 响应时间&#xff1a;应用的启动时间、页面加载速度、接口响应时间等。 2. CPU 使用率&#xff1a;应用在各种操作下的 CPU 占…

ADS基础教程11 - TouchStone文件的导出及导入

目录 一、 T o u c h S t o n e 介绍 \color{#4285f4}{ \mathbf{ 一、TouchStone介绍}} 一、TouchStone介绍 二、文件导出、导入方式 \color{#4285f4}{ \mathbf{ 二、文件导出、导入方式}} 二、文件导出、导入方式1.原理图操作1&#xff09;原理图中导出2.原理图中导入 3.DDW中…

布局全球内容生态,酷开科技Coolita AIOS以硬核品质亮相

当前&#xff0c;全球产业链供应链格局持续重构&#xff0c;成为影响中国对外经济发展的重要因素。2024年4月15至5月5日&#xff0c;历史久、规模大、层次高&#xff0c;作为中国外贸风向标的第135届中国进出口商品交易会&#xff08;即广交会&#xff09;在美丽的广州隆重举行…

G2 - 人脸图像生成(DCGAN)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目录 理论知识DCGAN原理 模型结构逻辑结构物理结构 模型实现前期准备1. 导入第三方库2. 修改随机种子(相同的随机种子&#xff0c;第i次随机的结果是固定的)3.…

牛客小白月赛93

B交换数字 题目&#xff1a; 思路&#xff1a;我们可以知道&#xff0c;a*b% mod (a%mod) * (b%mod) 代码&#xff1a; void solve(){int n;cin >> n;string a, b;cin >> a >> b;for(int i 0;i < n;i )if(a[i] > b[i])swap(a[i], b[i]);int num1…

Python运维之定时任务模块APScheduler

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 目录 定时任务模块APScheduler 一、安装及基本概念 1.1、APScheduler的安装 1.2、涉及概念 1.3、APScheduler的工作流程​编辑 二、配置调度器 …

这3种深拷贝实现,你都知道吗?

目录&#xff1a; 1、JSON.parse 2、structuredClone 3、cloneDeep

AI边缘计算盒子优势有哪些?如何实现低延迟处理?

AI边缘计算盒子作为一种集成人工智能技术的边缘计算设备&#xff0c;其优势主要体现在以下几个方面&#xff0c;万物纵横为您详细介绍&#xff1a; 1. 低延迟处理 AI边缘计算盒子靠近数据产生源头&#xff0c;能够即时处理数据&#xff0c;大幅减少数据传输至云端的时间&#…

GRU模块:nn.GRU层

摘要&#xff1a; 如果需要深入理解GRU的话&#xff0c;内部实现的详细代码和计算公式就比较重要&#xff0c;中间的一些过程及中间变量的意义需要详细关注。只有这样&#xff0c;才能准备把握这个模块的内涵和意义&#xff0c;设计初衷和使用方式等等。所以&#xff0c;仔细研…

QML及VTK配合构建类MVVM模式DEMO

1 创建QT QUICK项目 这次我们不在主程中加载VTK的几何&#xff1b; 在qml建立的控件&#xff0c;创建MyVtkObject类的单例&#xff0c;main中将指针和单例挂钩&#xff1b; 在MyVtkObject实例中操作 QQuickVTKRenderItem 类即可&#xff1b; 由于VTK的opengl显示是状态机&a…

学习笔记:【QC】Android Q telephony-data 模块

一、data init 流程图 主要分为3部分&#xff1a; 1.加载TelephonyProvider&#xff0c;解析apns-config.xml文件&#xff0c;调用loadApns将 xml中定义的数据&#xff0c;插入到TelephonyProvider底层的数据库中 2.初始化phone、DcTracker、TelephonyNetworkFactory、Conne…

Ubuntu意外断电vmdk损坏--打不开磁盘“***.vmdk”或它所依赖的某个快照磁盘。

背景&#xff1a;电脑资源管理器崩溃卡死&#xff0c;强行断电重启&#xff0c;结果虚拟机打不开了&#xff0c;提示打不开磁盘“***.vmdk”或它所依赖的某个快照磁盘。 删除lck文件&#xff1a;失败vmware-vdiskmanager修复 &#xff1a;提示无法修复最终用 VMFS Recovery挂载…

ntfs文件系统的优势 NTFS文件系统的特性有哪些 ntfs和fat32有什么区别 苹果电脑怎么管理硬盘

对于数码科技宅在新购得磁盘之后&#xff0c;出于某种原因会在新的磁盘安装操作系统。在安装操作系统时&#xff0c;首先要对磁盘进行分区和格式化&#xff0c;而在此过程中&#xff0c;操作者们需要选择文件系统。文件系统也决定了之后操作的流程程度&#xff0c;一般文件系统…

CSS-页面导航栏实现-每文一言(过有意义的生活,做最好的自己)

&#x1f390;每文一言 过有意义的生活,做最好的自己 目录 &#x1f390;每文一言 &#x1f6d2;盒子模型 &#x1f453;外间距 (margin) &#x1f97c;边框 &#x1f45c;内边距 切换盒子模型计算方案&#xff1a; &#x1f3a2; 浮动布局 浮动特点 &#x1f3c6;导航…