N32G45XVL-STB之lvgl的应用实例

news2024/9/20 14:46:32

目录

概述

1 硬件介绍

1.1 ST7796-LCD

1.2 MCU IO与LCD PIN对应关系

1.3 MCU IO与Touch PIN对应关系

2 N32G45x移植 LVGL

2.1 移植步骤

2.2 注意点

2.2.1 UI刷新函数

2.2.2 主函数中调用

3 LVGL的应用Demo

3.1 功能描述

3.2 代码实现

3.3 测试


N32G45XVL-STB之lvgl的应用实例

概述

本文主要介绍在N32G45XVL上移植lvgl应该注意的问题,其主要包括驱动程序接口的实现,UI刷新速度的优化。还编写一个简单的案例用以测试LVGL的UI显示和触摸功能的响应速度。相比与Contex-M3内核来说,基于Contex-M4内核的N32G45XVL在UI刷新速度上当然快了好多,当在用户体验上,任有值得优化的地方。

1 硬件介绍

1.1 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.2 MCU IO与LCD PIN对应关系

N32G45X PIN引脚LCD PIN引脚
PA7-MOSIMOSI
PA6-MISOMISO
PA5-SCKSCK
PD4CS
PD5RST
PD6RS

1.3 MCU IO与Touch PIN对应关系

N32G45X PIN引脚touch PIN引脚
PB6I2C-SCK
PB7I2C-SDA
PB10INIT
PB9RST

2 N32G45x移植 LVGL

2.1 移植步骤

关于LVGL的移植参考如下文档:

N32G45XVL-STB之移植LVGL(lvgl-8.2.0)-CSDN博客

2.2 注意点

2.2.1 UI刷新函数

笔者使用SPI接口类型的LCD,相比较有图形接口的LCD来说,其速度刷新速度函数比较慢的。为了尽可能加快UI的刷新速度,笔者做了如下优化:

1)重新写数据函数

代码26行: 计算刷新点个数

代码30行:设置窗口

代码31行:设置传递数据模式

代码34~39行:SPI模式写数据

源代码

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;
    uint16_t tempcolor;

    LCD_SetWindows(sx, sy, ex, ey);
    LCD_RS_SET;
    LCD_CS_CLR;
    // set point value 
    for( i = 0; i < draw_size; i++)
    {
        tempcolor =  color[i];
        SPI_WriteByte(tempcolor>>8);
        SPI_WriteByte(tempcolor);
    }
    
    LCD_CS_SET;
}

2.2.2 主函数中调用

在main函数中需要调用两个函数:

1)刷新UI函数: lv_task_handler()

2)触摸监测tick函数: lv_tick_inc(1)

源代码:

/**
 * @brief  Main program
 */
int main(void)
{
    uint32_t time_count;
    
    Board_Init();
    ui_init();
    usr_touchInit();
    LCD_DrvInit();
    lvgl_test();
    while (1)
    {
        // refresh tje UI interval: 300 ms 
        time_count =  get_timer1_countMs();
        if( (time_count % 50) == 0)
        {
        }
        if( (time_count % 5) == 0)
        {
            lv_tick_inc(1);
        }
        lv_task_handler();
    }
}

3 LVGL的应用Demo

3.1 功能描述

1)实现3个Button

2)通过Button改变数值

3.2 代码实现

#include "lv_mainstart.h"
#include "lvgl.h"
#include <stdio.h>


static const lv_font_t* font;       /* 定义字体 */

static lv_obj_t *label_speed;       /* 速度提示文本 */
static lv_obj_t *btn_speed_up;      /* 加速按钮 */
static lv_obj_t *btn_speed_down;    /* 减速按钮 */
static lv_obj_t *btn_stop;          /* 急停按钮 */

static int32_t speed_val = 0;       /* 速度值 */

/* 获取当前活动屏幕的宽高 */
#define scr_act_width() lv_obj_get_width(lv_scr_act())
#define scr_act_height() lv_obj_get_height(lv_scr_act())


/**
 * @brief  按钮回调
 * @param  *e :事件相关参数的集合,它包含了该事件的所有数据
 * @return 无
 */
static void btn_event_cb(lv_event_t * e)
{
    lv_obj_t *target = lv_event_get_target(e);      /* 获取触发源 */

    if(target == btn_speed_up)                      /* 加速按钮 */
    {
        speed_val += 30;
    }
    else if(target == btn_speed_down)               /* 减速按钮 */
    {
        speed_val -= 30;
    }
    else if(target == btn_stop)                     /* 急停按钮 */
    {
        speed_val = 0;
    }
    lv_label_set_text_fmt(label_speed, "Speed : %d RPM", speed_val);    /* 更新速度值 */
}


/**
 * @brief  速度值提示标签
 * @param  无
 * @return 无
 */
static void lv_example_label(void)
{
    /* 根据活动屏幕宽度选择字体 */
    if (scr_act_width() <= 320)
    {
        font = &lv_font_montserrat_20;
    }
    else if (scr_act_width() <= 480)
    {
        font = &lv_font_montserrat_20;
    }
    else
    {
        font = &lv_font_montserrat_20;
    }

    label_speed = lv_label_create(lv_scr_act());                                    /* 创建速度显示标签 */
    lv_obj_set_style_text_font(label_speed, font, LV_PART_MAIN);                    /* 设置字体 */
    lv_label_set_text(label_speed, "Speed : 0 RPM");                                /* 设置文本 */
    lv_obj_align(label_speed, LV_ALIGN_CENTER, 0, -scr_act_height() / 3);           /* 设置标签位置 */
}
/**
 * @brief  加速按钮
 * @param  无
 * @return 无
 */
static void lv_example_btn_up(void)
{
    font = &lv_font_montserrat_18;
    btn_speed_up = lv_btn_create(lv_scr_act());                                     /* 创建加速按钮 */
    lv_obj_set_size(btn_speed_up, scr_act_width() / 4, scr_act_height() / 6);       /* 设置按钮大小 */
    lv_obj_align(btn_speed_up, LV_ALIGN_CENTER, -scr_act_width() / 3, 0);           /* 设置按钮位置 */
    lv_obj_add_event_cb(btn_speed_up, btn_event_cb, LV_EVENT_CLICKED, NULL);        /* 设置按钮事件 */

    lv_obj_t* label = lv_label_create(btn_speed_up);                                /* 创建加速按钮标签 */
    lv_obj_set_style_text_font(label, font, LV_PART_MAIN);                          /* 设置字体 */
    lv_label_set_text(label, "Speed +");                                            /* 设置标签文本 */
    lv_obj_set_align(label,LV_ALIGN_CENTER);                                        /* 设置标签位置 */
}

/**
 * @brief  减速按钮
 * @param  无
 * @return 无
 */
static void lv_example_btn_down(void)
{
    font = &lv_font_montserrat_18;
    btn_speed_down = lv_btn_create(lv_scr_act());                                   /* 创建加速按钮 */
    lv_obj_set_size(btn_speed_down, scr_act_width() / 4, scr_act_height() / 6);     /* 设置按钮大小 */
    lv_obj_align(btn_speed_down, LV_ALIGN_CENTER, 0, 0);                            /* 设置按钮位置 */
    lv_obj_add_event_cb(btn_speed_down, btn_event_cb, LV_EVENT_CLICKED, NULL);      /* 设置按钮事件 */

    lv_obj_t* label = lv_label_create(btn_speed_down);                              /* 创建减速按钮标签 */
    lv_obj_set_style_text_font(label, font, LV_PART_MAIN);                          /* 设置字体 */
    lv_label_set_text(label, "Speed -");                                            /* 设置标签文本 */
    lv_obj_set_align(label,LV_ALIGN_CENTER);                                        /* 设置标签位置 */
}

/**
 * @brief  急停按钮
 * @param  无
 * @return 无
 */
static void lv_example_btn_stop(void)
{
    font = &lv_font_montserrat_18;
    btn_stop = lv_btn_create(lv_scr_act());                                         /* 创建急停按钮 */
    lv_obj_set_size(btn_stop, scr_act_width() / 4, scr_act_height() / 6);           /* 设置按钮大小 */
    lv_obj_align(btn_stop, LV_ALIGN_CENTER, scr_act_width() / 3, 0);                /* 设置按钮位置 */
    lv_obj_set_style_bg_color(btn_stop, lv_color_hex(0xef5f60), LV_STATE_DEFAULT);  /* 设置按钮背景颜色(默认) */
    lv_obj_set_style_bg_color(btn_stop, lv_color_hex(0xff0000), LV_STATE_PRESSED);  /* 设置按钮背景颜色(按下) */
    lv_obj_add_event_cb(btn_stop, btn_event_cb, LV_EVENT_CLICKED, NULL);            /* 设置按钮事件 */

    lv_obj_t* label = lv_label_create(btn_stop);                                    /* 创建急停按钮标签 */
    lv_obj_set_style_text_font(label, font, LV_PART_MAIN);                          /* 设置字体 */
    lv_label_set_text(label, "Stop");                                               /* 设置标签文本 */
    lv_obj_set_align(label,LV_ALIGN_CENTER);                                        /* 设置标签位置 */
}

/**
 * @brief  LVGL演示
 * @param  无
 * @return 无
 */
void lv_mainstart(void)
{
    lv_example_label();             /* 速度提示标签 */
    lv_example_btn_up();            /* 加速按钮 */
    lv_example_btn_down();          /* 减速按钮 */
    lv_example_btn_stop();          /* 急停按钮 */
}


/* End of this file */

3.3 测试

点击按键改变数据

 

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

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

相关文章

为Linux设置GRUB密码

正文共&#xff1a;999 字 11 图&#xff0c;预估阅读时间&#xff1a;1 分钟 我们前面介绍了如何恢复root密码&#xff08;CentOS 7.9遗忘了root密码怎么办&#xff1f;&#xff09;&#xff0c;虽然简单好用&#xff0c;但是可能会被不法分子利用&#xff0c;造成root密码以及…

Elasticsearch文档_id以数组方式返回

背景需求是只需要文档的_id字段&#xff0c;并且_id组装成一个数组。 在搜索请求中使用 script_fields 来整理 _id 为数组输出&#xff1a; POST goods_info/_search?size0 {"query": {"term": {"brand": {"value": "MGC"…

防火墙图形化界面策略和用户认证(华为)

目录 策略概要认证概要实验拓扑图题目要求一要求二要求三要求四要求五要求六 策略概要 安全策略概要&#xff1a; 安全策略&#xff08;Security Policy&#xff09;在安全领域具有双重含义。宏观上&#xff0c;安全策略指的是一个组织为保证其信息安全而建立的一套安全需求、…

通过图像高频信息保留图像细节,能保留多少细节-Comfyui

&#x1f9e8;前情提要 如果还不了解comfyui中图像高频信息保留细节的内容&#xff0c;可以参考上一篇文章&#xff1a; 图像中高频信息、低频信息与ComfyUI中图像细节保留的简单研究-CSDN博客 这次主要是简单测试下保留图像细节&#xff0c;能保留到什么程度&#xff1b; …

自建搜索引擎-基于美丽云

Meilisearch 是一个搜索引擎&#xff0c;主程序完全开源&#xff0c;除了使用官方提供的美丽云服务&#xff08;收费&#xff09;进行对接之外&#xff0c;还可以通过自建搜索引擎来实现完全独立的搜索服务。 由于成本问题&#xff0c;本博客采用自建的方式&#xff0c;本文就…

HybridCLR原理中的重点总结

序言 该文章以一个新手的身份&#xff0c;讲一下自己学习的经过&#xff0c;大家更快的学习HrbirdCLR。 我之前的两个Unity项目中&#xff0c;都使用到了热更新功能&#xff0c;而热更新的技术栈都是用的HybridCLR。 第一个项目本身虽然已经集成好了热更逻辑&#xff08;使用…

【排序 - 冒泡排序】

当我们谈论经典的排序算法时&#xff0c;冒泡排序&#xff08;Bubble Sort&#xff09;往往是最先被提及的一种。尽管它在实际应用中不太常见&#xff0c;但冒泡排序的简单易懂&#xff0c;有助于理解排序算法的基本原理和思想。 冒泡排序的基本原理 冒泡排序是一种基础的交换…

Git的基本知识点 + GitBash安装Pacman + Git命令含有中文,终端输出中文乱码

Git的基本知识点&#xff1a;整理自以下作者的文章繁华似锦Fighting的文章https://www.jianshu.com/nb/49854893另外还补充了git ls-file、.gitignore 等内容&#xff0c;涉及具体操作&#xff0c;还有命令总结。简略版可以看以上作者的文章&#xff0c;详细版可以看网盘里面的…

【企业级监控】源码部署Zabbix与监控主机

Zabbix企业级分布式监控 文章目录 Zabbix企业级分布式监控资源列表基础环境一、LNMP环境搭建&#xff08;在zbx主机上&#xff09;1.1、配置Yum仓库1.1.1、下载阿里云的仓库文件1.2.2、安装PHP7的仓库1.2.3、生成Mariadb10.11的仓库文件1.2.4、快速重建Yum缓存 1.2、安装PHP7.4…

Golang | Leetcode Golang题解之第228题汇总区间

题目&#xff1a; 题解&#xff1a; func summaryRanges(nums []int) (ans []string) {for i, n : 0, len(nums); i < n; {left : ifor i; i < n && nums[i-1]1 nums[i]; i {}s : strconv.Itoa(nums[left])if left < i-1 {s "->" strconv.It…

数学建模美赛经验小结

图片资料来自网络所听讲座&#xff0c;感谢分享&#xff01;

《C++设计模式》状态模式

文章目录 一、前言二、实现一、UML类图二、实现 一、前言 状态模式理解最基本上的我觉得应该也是够用了&#xff0c;实际用的话&#xff0c;也应该用的是Boost.MSM状态机。 相关代码可以在这里&#xff0c;如有帮助给个star&#xff01;AidenYuanDev/design_patterns_in_mode…

Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce

章节内容 上节我们完成了&#xff1a; Sqoop 介绍Sqoop 下载配置环境等Sqoop 环境依赖&#xff1a;Hadoop、Hive、JDBC 等环境补全 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机…

javaweb图书商城系统带万字文档网上书城java项目java课程设计java毕业设计

文章目录 图书商城系统一、项目演示二、项目介绍三、万字项目文档四、部分功能截图五、部分代码展示六、底部获取项目源码带万字文档&#xff08;9.9&#xffe5;带走&#xff09; 图书商城系统 一、项目演示 网上书城 二、项目介绍 语言&#xff1a;java 数据库&#xff1a;…

如何用 Python 远程控制 Windows 服务器?

大家好&#xff01;我是爱摸鱼的小鸿&#xff0c;关注我&#xff0c;收看每期的编程干货。 在信息时代的洪流中&#xff0c;掌握一门编程语言已经成为一项必备技能。Python&#xff0c;这门以简洁、易学、强大著称的编程语言&#xff0c;更是成为无数开发者的大宝剑。今天&…

maven——插件创建maven工程(了解即可)

对于之前手一个个文件夹创建&#xff0c;可能会觉得麻烦&#xff0c;maven出了个插件&#xff0c;可以直接创建出来。 使用这个指令就可以生成&#xff0c;是使用模板生成的&#xff0c;模板要告诉他用哪一个 告诉插件用的哪个模板&#xff1a; 范例&#xff1a; 创建java…

Nginx实现服务器端集群搭建/Nginx实现动静分离/Nginx高可用解决方案/Nginx与Tomcat部署

Nginx实现服务器端集群搭建 Nginx与Tomcat部署 前面课程已经将Nginx的大部分内容进行了讲解&#xff0c;我们都知道了Nginx在高并发场景和处理静态资源是非常高性能的&#xff0c;但是在实际项目中除了静态资源还有就是后台业务代码模块&#xff0c;一般后台业务都会被部署在…

Java-常用API

1-Java API &#xff1a; 指的就是 JDK 中提供的各种功能的 Java类。 2-Scanner基本使用 Scanner&#xff1a; 一个简单的文本扫描程序&#xff0c;可以获取基本类型数据和字符串数据 构造方法&#xff1a; Scanner(InputStream source)&#xff1a;创建 Scanner 对象 Sy…

Python地图可视化三大秘密武器

Python地图可视化库有大家熟知的pyecharts、plotly、folium&#xff0c;还有稍低调的bokeh、basemap、geopandas&#xff0c;也是地图可视化利器。 首先介绍下bokeh bokeh擅长制作交互式图表&#xff0c;当然在地图展示方面也毫不逊色。 Bokeh支持google地图、geojson数据的地…

枚举trick,CF 489D - Unbearable Controversy of Being

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 489D - Unbearable Controversy of Being 二、解题报告 1、思路分析 对于这种计算图形数目&#xff0c;最朴素的暴力无非是枚举每个顶点&#xff0c;这样时间复杂度会很高 策略往往是固定些点&#xff0c;…