N32G45XVL-STB之移植LVGL(8.4.0)

目录

概述

1 系统软硬件

1.1 软件版本信息

1.2 ST7796-LCD

1.3 MCU IO与LCD PIN对应关系

2 认识LVGL

2.1 LVGL官网

2.2 下载V8.4.0

3 移植LVGL

3.1 硬件驱动实现

3.2 添加LVGL库文件

3.3 移植和硬件相关的代码

3.3.1 驱动接口相关文件介绍

3.3.2 重新接口函数

3.4 配置.h文件

3.5 Keil中配置源代码路径

4 文件架构编译配置

4.1 项目文件架构

4.2 编译配置

5 测试

5.1 测试代码实现

5.2 测试案例


测试视频:

N32G45XVL-STB之移植LVGL(8.4.0)

概述

本文主要介绍在N32G45XVL-STB移植lvgl-8.4.0的详细步骤,包括加载文件的方法,Keil中加载文件目录和路径,修改和LCD驱动层相关的接口,keil中配置编译参数,笔者使用LVGL提供的vgl-8.4.0\demos\stress案例,验证移植的代码是否可以正常运行。

1 系统软硬件

1.1 软件版本信息

软硬件信息版本信息
MCU类型N32G457VEL7
KeilMDK ARM 5.38
调试工具:DAPCMSIS-DAP

1.2 ST7796-LCD

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对应关系如下图所示

1.3 MCU IO与LCD PIN对应关系

N32G457VEL7 PIN引脚LCD PIN引脚
PA.07MOSI
PA.06MISO
PA.05SCK
PD.04CS
PD.05RST
PD.06RS

2 认识LVGL

2.1 LVGL官网

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

官方网址:LVGL — Light and Versatile Embedded Graphics Library

https://lvgl.io/

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

2.2 下载V8.4.0

软件下载链接如下:

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

 下载完成代码后,解压代码,其文件结构如下:

文件夹examples:  应用实例代码,目录

文件夹src:    lvgl的源代码目录

头文件 lvgl.h: lvgl源代码引用文件

头文件lv_conf_template.h:  lvgl编译项目配置文件

3 移植LVGL

3.1 硬件驱动实现

在移植LVGL库之前,必须保证LCD驱动已经触摸屏的相关驱动程序已经实现,其实现案例,参考笔者文章:

N32G45XVL-STB之SPI接口驱动LCD-CSDN博客

N32G45XVL-STB之移植FT6336触摸屏芯片驱动-CSDN博客

3.2 添加LVGL库文件

1)lvgl-8.4.0\src\core

添加该目录下的所有.c文件到工程目录中,该目录下的文件包括:

2) lvgl-8.4.0\src\draw

该目录下的文件包括两部分,文件夹中的和绘图相关,文件一级目录的通用.c文件

2.1) 添加一级目录下的文件

添加如下文件到项目中

2.2)二级目录下的文件

这两个文件夹下的.c文件必须加载到项目中

 3)lvgl-8.4.0\src\extra

添加如下一级目录和二级目录下所有的.c文件至项目

4) lvgl-8.4.0\src\font

添加如下所有.c文件至项目

 5)lvgl-8.4.0\src\hal

添加如下所有.c文件至项目

6)lvgl-8.4.0\src\misc 

添加如下所有.c文件至项目

7)lvgl-8.4.0\src\widgets 

添加如下所有.c文件至项目

3.3 移植和硬件相关的代码

3.3.1 驱动接口相关文件介绍

\lvgl-8.4.0\examples\porting目录有3个.c文件

1)LCD显示相关接口函数库: lv_port_disp_template.c    

2)   触摸屏/按键相关函数库:   lv_port_indev_template.c

3)文件操作行管函数库:        lv_port_fs_template.c

 3.3.2 重新接口函数

1)重写lv_port_disp_template.c  

将 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_H
#define MY_DISP_VER_RES             LCD_W /* 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)
{LCD_drawfast_RGB_color(sx, sy, ex, ey, color);
}static void disp_init(void)
{/*You code here*/LCD_Init();//LCD_direction(2);LCD_direction(1);LCD_Clear(WHITE);
}void lv_port_disp_init(void)
{static lv_disp_drv_t disp_drv; static lv_disp_draw_buf_t draw_buf_dsc_1;static lv_color_t buf_1[MY_DISP_VER_RES * 8]; disp_init();lv_disp_draw_buf_init(&draw_buf_dsc_1, buf_1, NULL, MY_DISP_VER_RES * 8);lv_disp_drv_init(&disp_drv);disp_drv.hor_res = lcddev.width;disp_drv.ver_res = lcddev.height;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 */

2)重写lv_port_indev_template.c  

将 lv_port_indev_template.c  添加到项目,重写干文件中的代码,具体如下:

/*** @file lv_port_indev_templ.c**//*Copy this file as "lv_port_indev.c" and set this value to "1" to enable content*//**********************      INCLUDES*********************/
#include "lv_port_indev_template.h"
#include "lvgl.h"
#include "usr_touch.h"/* 触摸屏 */
static void touchpad_init(void);
static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
static bool touchpad_is_pressed(void);
static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y);lv_indev_t * indev_touchpad;      // 触摸屏
stru_pos st_Pos;/*** @brief       初始化并注册输入设备* @param       无* @retval      无*/
void lv_port_indev_init(void)
{static lv_indev_drv_t indev_drv;/*------------------* 触摸屏* -----------------*//* 初始化触摸屏(如果有) */touchpad_init();/* 注册触摸屏输入设备 */lv_indev_drv_init(&indev_drv);indev_drv.type = LV_INDEV_TYPE_POINTER;indev_drv.read_cb = touchpad_read;indev_touchpad = lv_indev_drv_register(&indev_drv);
}/***********************   STATIC FUNCTIONS**********************//*------------------* 触摸屏* -----------------*//*** @brief       初始化触摸屏* @param       无* @retval      无*/
static void touchpad_init(void)
{usr_touchInit();
}/*** @brief       图形库的触摸屏读取回调函数* @param       indev_drv   : 触摸屏设备*   @arg       data        : 输入设备数据结构体* @retval      无*/
static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{static lv_coord_t last_x = 0;static lv_coord_t last_y = 0;/* 保存按下的坐标和状态 */if(touchpad_is_pressed()){touchpad_get_xy(&last_x, &last_y);data->state = LV_INDEV_STATE_PR;} else{data->state = LV_INDEV_STATE_REL;}/* 设置最后按下的坐标 */data->point.x = last_x;data->point.y = last_y;
}/*** @brief       获取触摸屏设备的状态* @param       无* @retval      返回触摸屏设备是否被按下*/
static bool touchpad_is_pressed(void)
{usr_ScanTouchProcess( &st_Pos );if( st_Pos.status_bit.tpDown ){st_Pos.status_bit.tpDown = 0;return true;}return false;
}/*** @brief       在触摸屏被按下的时候读取 x、y 坐标* @param       x   : x坐标的指针*   @arg       y   : y坐标的指针* @retval      无*/
static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y)
{/*Your code comes here*/(*x) = st_Pos.xpox[0];(*y) = st_Pos.ypox[0];
}/* End of this file */

3.4 配置.h文件

在lvgl-8.4.0根目录下有两个.h文件,其分别为:

头文件 lvgl.h: lvgl源代码引用文件

头文件lv_conf_template.h:  lvgl编译项目配置文件

 修改lv_conf_template.h    -----> lv_conf.h

 实际项目中的文件名称如下:

 3.5 Keil中配置源代码路径

在keil中将lvgl源代码的路径配置到项目中,方便编译。其具体配置如下:

4 文件架构编译配置

4.1 项目文件架构

项目中和lvgl库相关的文件架构如下:

4.2 编译配置

完成文件加载和路径配置后,需要使能lvgl的源代码,需要再lv_conf.h文件中作相关的修改,修改方法如下:

5 测试

5.1 测试代码实现

1)初始化LVGL

在使用UI接口实现绘图功能之前,必须初始化lvgl,初始化接口函数如下:

2)  刷新UI功能

完成代码加载到项目之后,还需要在main.c函数调用两个函数lv_tick_inc()和lv_task_handler(),用于刷新UI和响应按键。具体方法如下:

 5.2 测试案例

使用lvgl-8.4.0\demos\stress下的测试案例,进行LVGL功能测试

添加该文件到项目中:

运行结果如下:

 

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

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

相关文章

SQL索引结构优化及回表查询知识总结

1. 索引的基本概念 定义:索引是数据库中用于快速定位数据的有序数据结构。作用:加速数据检索,减少查询时间。 2. 索引的分类与结构 单列索引:基于单个列的索引,如:CREATE INDEX idx_employee_id ON empl…

ReduceTask有几种排序方式以及排序发生的阶段?

在MapReduce框架中,ReduceTask的排序主要包括两种方式:排序(Sort)和分组(Grouping)。这些排序操作发生在不同的阶段,以确保数据按键进行处理。 一、ReduceTask的排序方式 排序(Sor…

Java中BIO、NIO、AIO详解

参考: https://blog.csdn.net/s2152637/article/details/98777686 https://blog.csdn.net/bigorsmallorlarge/article/details/137292669 1、几个基本概念 Java中IO模型简介 在Java中,主要有三种IO模型,分别是: 同步阻塞IO&…

视频合成渲染服务解决方案,数字人+PPT+视频云剪辑

在金融理财领域,一个生动、直观、专业的视频,往往能够在海量信息中脱颖而出,帮助客户更好地理解产品、把握市场动态。然而,传统的视频制作方式往往周期长、成本高、难以适应快速变化的市场需求。 美摄科技,作为行业领…

XZ后门故事:初始分析

2024年3月29日,Openwall OSS安全邮件列表上的一条消息“炸醒”了整个信息安全、开源和Linux社区:XZ出现了一个CVSS评分10.0的恶意后门。 这个后门库的特殊危险在于OpenSSH服务器进程sshd使用它。在多个基于systemd的发行版上(包括Ubuntu、De…

从根源解决问题:构建体系化BOM管理机制与解决方案

BOM(物料清单)是设计与生产间的纽带,其准确及时对企业的竞争力至关重要。然而,维护BOM数据时,常遇到录入错误、信息孤岛及跨部门沟通障碍等难题,直接影响生产效率和成本。为此,道合顺将探讨确保…

Hi3861 OpenHarmony嵌入式应用入门--点灯

本篇实现对gpio的控制,通过控制输出进行gpio的点灯操作。 硬件 我们来操作IO2,控制绿色的灯。 软件 GPIO API API名称 说明 hi_u32 hi_gpio_deinit(hi_void); GPIO模块初始化 hi_u32 hi_io_set_pull(hi_io_name id, hi_io_pull val); 设置某个IO…

如何使用xurlfind3r查找目标域名的已知URL地址

关于xurlfind3r xurlfind3r是一款功能强大的URL地址查询工具,该工具本质上是一个CLI命令行工具,可以帮助广大研究人员从多种在线源来查询目标域名的已知URL地址。 功能介绍 1、从被动在线源获取URL地址以实现最大数量结果获取; 2、支持从Way…

python 地图+经纬度标记

如果你想在地图上显示标注点并在标注点旁边显示文字,可以使用folium.Marker的popup参数来实现。这个参数允许你设置在标注点上点击时显示的文本内容。以下是修改后的示例代码,演示如何在地图上显示带有文字标注的标注点: import folium# 创建…

leetcode打卡#day45 携带研究材料(第七期模拟笔试)、518. 零钱兑换 II、377. 组合总和 Ⅳ、爬楼梯(第八期模拟笔试)

携带研究材料&#xff08;第七期模拟笔试&#xff09; #include<iostream> #include<algorithm> #include<vector>using namespace std;int main() {int N, V;cin >> N >> V;vector<int> weights(N1);vector<int> values(V1);int w…

遗传算法浅理解

1. 什么是遗传算法&#xff1f; ​ 遗传算法&#xff0c;又称为 Genetic algorithm(GA)Genetic algorithm(GA)。其主要思想就是模拟生物的遗传与变异。它的用途非常广泛&#xff0c;可以用于加速某些求最大或者最小值的算法&#xff08;换句话说就是加速算法收敛&#xff0c;最…

实现企业可持续发展目标,ISCC能起什么作用呢?

国际可持续发展和碳认证 (ISCC) 基于气候变化已经成为全球面临的重大挑战之一、可再生能源需求不断增长的这个大背景下&#xff0c;企业的可持续发展诉求正日益显现&#xff0c;尤其当下消费者对于环境和社会责任意识的提升&#xff0c;需要更透明的供应链证明&#xff0c;同时…

移动端专业视频剪辑解决方案,深度编辑,专业级体验

面对众多繁杂的移动端视频编辑软件&#xff0c;如何挑选一款既高效又专业的解决方案&#xff0c;成为众多企业关注的焦点。美摄科技凭借其卓越的技术实力&#xff0c;推出了面向企业的移动端专业视频剪辑解决方案&#xff0c;助力企业轻松打造高质量视频内容。 一、深度编辑&a…

OAuth 2.0:现代应用程序的授权标准

前言 随着互联网和移动应用的发展&#xff0c;应用程序之间的交互变得越来越普遍。用户希望通过单一的身份认证在多个平台上无缝体验&#xff0c;这就要求不同的应用程序能够安全地共享用户数据。而 OAuth 2.0 正是为了解决这一问题而设计的&#xff0c;它提供了一种标准机制&…

6月16日-英语学习日记-(专科生)

我能够走到对岸的&#xff0c;我相信我自己&#xff0c;自己该和过去的事情做一个了断了&#xff01; 符号区别句子&#xff0c;通过感叹符号可以知道那些句子是一个感叹句。 In recent years 最近几年 commander n军官&#xff0c;长官 自己今天对了一道题目&#xff1a; …

Golang 百题(实战快速掌握语法)_1

整形转字符串类型 实验介绍 本实验将展示三种方法来实现整形类型转字符串类型。 知识点 strconvfmt Itoa 函数 代码实例 Go 语言中 strconv 包的 itoa 函数输入一个 int 类型&#xff0c;返回转换后的字符串。下面是一个例子。 package mainimport ("fmt"&qu…

C语言 -- 宏的变长参数定义

C语言宏定义中的可变参数处理 在C语言的宏定义中&#xff0c;我们可以使用可变参数来创建更加灵活和通用的宏。C99标准引入了__VA_ARGS__&#xff0c;而GNU编译器扩展了...args。这两者在处理可变参数时有所不同。本文将介绍它们的区别、使用场景以及相关示例。 背景介绍 __…

wps 二维数据转转一维度数据

HSTACK(TOCOL(C2:H2&A3:A8),TOCOL(B3:B8&C1:H1),TOCOL(C3:H8))

网络编程(三)UDP TFTP协议

文章目录 一、 UDP&#xff08;一&#xff09;概述&#xff08;二&#xff09;流程 二、收发函数&#xff08;一&#xff09;recvfrom&#xff08;二&#xff09;sendto 三、实现一个简单的udp服务端和客户端四、实现tftp客户端协议 一、 UDP &#xff08;一&#xff09;概述 …

Spring-事件

Java 事件/监听器编程模型 设计模式-观察者模式的拓展 可观察者对象(消息发送者) Java.util.Observalbe观察者 java.util.Observer 标准化接口(标记接口) 事件对象 java.util.EventObject事件监听器 java.util.EventListener public class ObserverDemo {public static vo…