基于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)(SPI接口的LCD)资源-CSDN文库

概述

本文主要介绍基于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.hqwc.cn/news/687200.html

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

相关文章

linux fdisk 银河麒麟操作系统 v10 磁盘分区和挂载 详细教程

1查看 未加载的磁盘 fdisk -l 2 开始分区 fdisk /dev/vdb #查看分区 #新建分区和保存 3 格式化和挂载 fdisk -l mkfs.xfs /dev/vdb1 #查看uuid blkid /dev/vdb1 mkdir /data vi /etc/fstab UUID209daa-fb1c-48f2-bf5e-e63f38cb8a /data xfs defaults 0 0 #加载下 mo…

探秘未来科技:数字化无人巡检的奇妙之旅

嘿&#xff0c;朋友们&#xff01;下午茶时间到&#xff01;趁着这会儿咱们来聊一个超级炫酷的话题——数字化无人巡检。想象一下&#xff0c;那些曾经需要人工跋山涉水、风吹日晒的巡检工作&#xff0c;现在正被一群“智能小分队”悄悄接手&#xff0c;是不是觉得既神奇又方便…

Ascent DMS AE电源说明书和设备连接调试教程

Ascent DMS AE电源说明书和设备连接调试教程

彩虹聚合DNS管理系统

聚合DNS管理系统可以实现在一个网站内管理多个平台的域名解析&#xff0c;目前已支持的域名平台有&#xff1a;阿里云、腾讯云、华为云、西部数码、CloudFlare。本系统支持多用户&#xff0c;每个用户可分配不同的域名解析权限&#xff1b;支持API接口&#xff0c;支持获取域名…

FFmpeg常用API与示例(三)—— 音视频解码与编码

编解码层 1.解码 (1) 注册所有容器格式和 CODEC:av_register_all() (2) 打开文件:av_open_input_file() (3) 从文件中提取流信息:av_find_stream_info() (4) 穷举所有的流&#xff0c;查找其中种类为 CODEC_TYPE_VIDEO (5) 查找对应的解码器:avcodec_find_decoder() (6) …

19.接口自动化-Jekins学习

1.CI-持续集成 频繁的&#xff08;一天多次&#xff09;将代码集成到主干 目的&#xff1a;让产品快速迭代&#xff0c;保持高质量 好处&#xff1a; 快速发现错误&#xff0c;每次更新都集成到主干&#xff0c;可以快速发现错误&#xff0c;定位错误也容易防止分支大幅偏离主…

QT C++(QWidget类及其常见的属性)

文章目录 1. QWidget类及其常见的属性 1. QWidget类及其常见的属性 QT各种控件都是继承自QWidget类&#xff0c;QWidget类是QT控件体系中通用的部分。 QWidget属性如下图 常见的QT属性为&#xff1a; enabled&#xff1a;描述控件是否处于可用状态&#xff08;禁用状态这个…

idea中数据库的连接(保姆级)

点击idea中的database 然后再点击加号 创建 然后选择第一栏data source 再选择mysql 然后选择数据库的连接方式 再输入密码 这里我们本来就是localhost所有就不用改 选择端口号 然后点击Test Connection 测试连接 第一次连接会下载连接的文件 我们只需要 等待它下载完成就好了 …

常见排序算法——希尔排序

基本原理 希尔排序在插入排序的基础之上&#xff0c;将待排序序列分成组&#xff0c;分成 gap 个组&#xff0c;组的数量通过 length / 2 获得&#xff0c;比如6个元素的序列&#xff0c;那么就是 3 个组&#xff0c;每个组两个元素&#xff0c;然后将每个组的元素进行插入排…

免费远程控制软件哪个好用

免费远程控制软件哪个好用 在现今高度信息化的社会&#xff0c;远程控制软件已成为许多用户进行远程办公、技术支持和教育培训的重要工具。市面上有许多免费的远程控制软件&#xff0c;但哪款才是最好用的呢&#xff1f;本文将为您介绍几款热门的免费远程控制软件&#xff0c;…

linux打包流程

因为linux有俩个python版本&#xff0c;我们需要切换到python3这个版本&#xff0c;默认是python 2.7 alias pythonpython3 切换到python3 再次执行&#xff1a;python -V 显示出python的版本了&#xff0c;然后查看pip的配置&#xff0c;我们打包里面需要的第三方需要放到pip…

Ansible-Playbook通过role角色部署Lnmp架构

目录​​​​​​​ 一、配置Nginx的Roles角色 1.1编写files/default.conf 1.2编写files/nginx.repo 1.3编写handlers/main.yml 1.4编写tasks/main.yml文件 1.5编写vars/main.yml文件 1.6测试运行结果&#xff0c;并不是真的执行任务 二、配置Mysql的Roles角色 2.1编写…