【LVGL进阶日记】① 开源LVGL在MCU上的移植

news2024/10/6 3:14:06

关注+星标公众号,不错过精彩内容
在这里插入图片描述
作者 | 量子君
微信公众号 | 极客工作室


【LVGL进阶日记】专栏目录
第一章 开源LVGL在MCU上的移植

文章目录

  • 前言
  • 一、LVGL介绍
    • 1.1 LVGL的主要特性如下:
    • 1.2 LVGL对MCU的要求如下:
  • 二、移植LittlevGL到MCU
    • 2.1 LVGL源码下载和文件组织
    • 2.2 LVGL配置(lvgl_conf.h):
    • 2.3 移植显示驱动
    • 2.4 在makefile或MDK工程中添加相应的LVGL的.C和头文件
  • 总结


前言

LVGL 可以说是这两年才刚开始流行的一个小型开源嵌入式 GUI 库,具有界面精美,消耗资源小、可移植度高、响应式布局等特点,全库采用纯 C 语言开发,LVGL 库的更新速度非常快。

本章介绍了LVGL主要特性、对MCU性能要求、移植到MCU的关键步骤及重要代码块等详解。


一、LVGL介绍

LVGL 官方资料丰富,相关链接如下:
LVGL 的官方网址
LVGL 的 github 网址
LVGL 的在线文档网址

1.1 LVGL的主要特性如下:

• 具有非常丰富的内置控件,像 buttons、charts、lists、sliders、images等
• 高级图形效果:动画、反锯齿、透明度、平滑滚动
• 支持多种输入设备,像 touchpad、mouse、keyboard、encoder等
• 支持多语言的 UTF-8 编码
• 支持多个和多种显示设备,例如同步显示在多个彩色屏或单色屏上
• 完全自定制的图形元素
• 硬件独立于任何微控制器或显示器
• 可以缩小到最小内存 (64 kB Flash、16 kB RAM)
• 支持操作系统、外部储存和 GPU(非必须)
• 仅仅单个帧缓冲设备就可以呈现高级视觉特效
• 使用 C 编写以获得最大兼容性(兼容 C++)
• 支持 PC 模拟器
• 为加速 GUI 设计,提供教程,案例和主题,支持响应式布局
• 提供了在线和离线文档
• 基于自由和开源的 MIT 协议

1.2 LVGL对MCU的要求如下:

  1. 16、32 或 64 位的单片机(微控制器)或处理器

  2. 微处理器的主频最好高于 16MHZ

  3. Flash / ROM:如果只用 LVGL 核心组件的话,则至少需要 64kB 的容量,如果想完整使用的话,最好保证 180KB 以上的容量

  4. RAM:
    ①静态 RAM:大约 8 到 16 kB,这取决于你所用的组件功能和 objects 控件对象类型;
    ②栈:至少为 2Kb,一般推荐值为 4kB;
    ③动态数据(堆):至少 4kB,如果你用到了多个或多种控件的话,那么最好设置为 16kB 以上,这个是可以通过lv_conf.h 配置文件中的LV_MEM_SIZE宏来定义的;
    ④显示缓冲区:至少要比“水平分辨率像素”要大,一般推介值为 10 倍的“水平分辨率像素”。举个例子:假如我们屏幕的水平分辨率为480个像素,采用16位的颜色深度进行显示,即一个像素占 2 个字节,那么推介的显示缓冲区大小为 10 * 480 * 2 = 9600 个字节;

  5. LV_MEM_SIZE 的大小,这个就是控制 littleVGL 中所谓的动态数据堆的大小,是用来给控件的创建动态分配空间的,我们这里设置为 16KB 的大小 #define LV_MEM_SIZE (16U * 1024U);

  6. 用定时器设置其每隔 1ms 进入中断,为 littleVGL 提供 1ms 的心跳节拍,当然你也可以采用其他的定时器,原理都是一样的;

  7. littleVGL 的内存消耗主要体现在 2 个方面:第一个是显示缓冲区、第二个就是我们这里所要讲到的堆,而 littleVGL 堆的内存分配也是有 2 种方式,如下所示:
    ①采用内部的 SRAM,原理定义一个静态的局部数组;
    ②和显示缓冲区一样,采用外部的大容量 SRAM;

  8. 定义屏幕的刷新周期和此功能相关的配置项只有1个,为LV_DISP_DEF_REFR_PERIOD,它的默认值为30ms,此值设置的过大的话就可能会出现卡顿的现象,设置的过小的话就会有点浪费性能,我们直接采用默认值就可以了,不用过多理会。

在这里插入图片描述

二、移植LittlevGL到MCU

2.1 LVGL源码下载和文件组织

Github下载LittleVGL源代码,移植到工程中;且需要有一个最基本的LCD驱动例程,实现初始化、打点等基础功能。
在这里插入图片描述

在工程中新建mg_lvgl文件夹将下载好的lvgl源码发在此处,新建lvgl_driver文件夹将lvgl源码包下porting文件夹中与LCD相关的配置模板拷贝出来放到lvgl_driver下,并分别更名为lv_port_disp.c和lv_port_disp.h:
在这里插入图片描述

将lvgl源码包下的lv_conf_template.h拷贝到mg_lvgl目录下,然后改名为lvgl_conf.h,将lv_conf.h中将宏打开 #if 0改为1,如下:

/**
 * @file lv_conf.h
 * Configuration file for v7.10.0-dev
 */

/*
 * COPY THIS FILE AS `lv_conf.h` NEXT TO the `lvgl` FOLDER
 */

#if 1 /*Set it to "1" to enable content*/

#ifndef LV_CONF_H
#define LV_CONF_H
/* clang-format off */
#include <stdint.h>

2.2 LVGL配置(lvgl_conf.h):

  1. 分辨率大小设置:
/* Maximal horizontal and vertical resolution to support by the library.*/
#define LV_HOR_RES_MAX          (128)  
#define LV_VER_RES_MAX          (160) 
  1. 颜色深度设置:
/* Color depth:
 3. - 1:  1 byte per pixel
 4. - 8:  RGB332
 5. - 16: RGB565
 6. - 32: ARGB8888
 */
#define LV_COLOR_DEPTH     1
  1. 界面伸缩比例调节:
    用来调节界面缩放比例的,此值越大,控件分布的就越散,控件自身的间隔也会变大,这里设置为60。
/* Dot Per Inch: used to initialize default sizes.
 8. E.g. a button with width = LV_DPI / 2 -> half inch wide
 9. (Not so important, you can adjust it to modify default sizes and spaces)*/
#define LV_DPI              60     /*[px]*/
  1. 动态数据堆大小设置:
    这个参数是用于控制 littleVGL 中所谓的动态数据堆的大小,是用来给控件的创建动态分配空间的,这里我们设置为16KB。
/* Size of the memory used by `lv_mem_alloc` in bytes (>= 2kB)*/
#  

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

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

相关文章

【AI人工智能】文心智能体,你的情诗小助理,哄女朋友必备, 低代码工作流易上手,干货满满,不容错过哦

&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通 &#x1f601; 2. 毕业设计专栏&#xff0c;毕业季咱们不慌忙&#xff0c;几百款毕业设计等你选。 ❤️ 3. Python爬虫专栏…

数字图像处理项目——基于Unet网络实现MRI图像的双肺区域分割(论文/代码)

完整的论文代码见文章末尾 以下为核心内容 摘要 在医学图像处理领域&#xff0c;肺部图像的分割是一个重要的研究方向&#xff0c;特别是针对肺部疾病的检测与诊断。传统的X射线和CT&#xff08;计算机断层扫描&#xff09;是常用的肺部成像技术&#xff0c;但MRI&#xff08…

I/O多路转接

目录 一、select 1.1、select概念 1.2、select 函数原型 1.3、理解 select 执行过程 1.4、select就绪条件 1.4.1、读就绪 1.4.2、写就绪 1.4.3、异常就绪&#xff08;了解&#xff09; 1.5、select 基本工作流程 1.6、select服务器 1.6.1、Sock.hpp 1.6.2、selectS…

python实战四:输入一个年份,判断是否是闰年

问题&#xff1a; 从键盘获取一个四位的整数年份&#xff0c;判断其是否是闰年。闰年的判断条件为︰能被4整除但不能被100整除&#xff0c;或者能被400整除。 需求方法&#xff1a; 使用 input() 函数从键盘获取输入。输入的年份是一个字符串。检查输入是否为四位数&#xf…

Elasticsearch学习笔记(四) Elasticsearch集群安全配置一

继续我们的实验。先谈一下我对Elasticsearch粗浅的一些认识&#xff0c;首先Elasticsearch是一个非常宏大的技术栈&#xff0c;发展到今天围绕着Elasticsearch已经产生了更多的组件、套件。因此在看官方文档或者别人的一些教程的时候经常会遇到ELK,elastic stack等。elastic st…

如何在电脑上浏览手机界面

联想浏览器中&#xff0c;点击右键-》检查&#xff0c;进入开发者工具&#xff1a; 点击如上&#xff0c;红色框框选中的手机浏览模式即可。

【微服务】服务注册与发现、分布式配置管理 - Nacos

概述 Nacos是阿里巴巴旗下的一个开源产品&#xff0c;目前市场使用率还是比较高的。在最初开源时&#xff0c;Nacos选择内部三个产品合并并统一开源&#xff0c;这三个产品分别是&#xff1a;非持久化注册中心&#xff08;Configserver&#xff09;、持久化注册中心&#xff0…

InnoDB 事务模型

文章目录 InnoDB 事务模型事务ACID特性事务隔离级别 事务操作事务并发问题事务数据读写类型Consistent Nonlocking Reads 快照读Locking Reads 加锁读 MVCC 并发控制实现原理InnoDB 隐藏列Read ViewUndo log实现过程 MVCC与隔离级别MVCC和辅助索引 幻读可重复读MVCC会出现幻读的…

腾讯自研Git客户端,助力每个人都可以轻松使用Git

工具介绍 UGit是一款腾讯自研的Git客户端&#xff0c;为了让每个人都可以轻松使用Git&#xff0c;从而提高开发效率和团队协作的流畅性。支持工蜂MR/CR&#xff0c;工蜂议题管理&#xff0c;另外对于Git的原生特性有着深度支持。 支持的系统 支持macOS 10.11、Apple Silicon和…

【数据结构】什么是哈希表(散列表)?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;哈希表的概念 &#x1f4cc;哈希函数的构造方法 &#x1f38f;直接定址法 &#x1f38f;除留余数法 &#x1f38f;平方取中法 &#x1f38f;折叠法 &#x…

自动驾驶的技术实现及原理

自动驾驶技术是现代科技领域中一项引人注目的创新&#xff0c;它具有变革运输行业并提升道路安全的潜力。随着人工智能、传感器技术以及数据处理能力的不断提升&#xff0c;自动驾驶车辆已经从实验室研究逐渐走向现实应用。 自动驾驶的技术实现及原理 1. 自动驾驶技术的核心…

【深度学习】— 多层感知机介绍、 隐藏层、从线性到非线性、线性模型的局限性

【深度学习】— 多层感知机介绍 4.1 多层感知机4.1.1 隐藏层线性模型的局限性引入隐藏层 4.2 从线性到非线性线性组合的局限性引入非线性堆叠更多隐藏层 4.1 多层感知机 在第 3 节中&#xff0c;我们介绍了 softmax 回归&#xff0c;并实现了其从零开始的实现和基于高级 API 的…

UART通信协议

什么是UART UART ( Universal Asynchronous Receiver/Transmitter&#xff0c; 通用异步收发器) 是一种常用的串行通信协议&#xff0c;用于在 计算机和外部设备之间传输数据。它是一种异步通信协议&#xff0c;也就是说数据的传输不需要事先建立好同步时钟信号。 UART&#xf…

Unity MVC框架演示 1-1 理论分析

本文仅作学习笔记分享与交流&#xff0c;不做任何商业用途&#xff0c;该课程资源来源于唐老狮 1.一般的图解MVC 什么是MVC我就不说了&#xff0c;老生常谈&#xff0c;网上有大量的介绍&#xff0c;想看看这三层都起到什么职责&#xff1f;那就直接上图吧 2.我举一个栗子 我有…

深入理解 JavaScript 事件循环机制:单线程中的异步处理核心

深入理解 JavaScript 事件循环机制&#xff1a;单线程中的异步处理核心 JavaScript 是一门单线程的编程语言&#xff0c;也就是说它在同一时间只能执行一个任务。然而&#xff0c;现代 Web 应用经常需要处理大量的异步操作&#xff0c;如用户输入、网络请求、定时器等。为了确…

Vue的基本用法及模板语法

Vue.js使用了基于 HTML 的模板语法&#xff0c;允许开发者声明式地将 DOM 绑定至底层 Vue实例的数据。所有 Vue.js的模板都是合法的 HTML&#xff0c;所以能被遵循规范的浏览器和 HTML 解析器解析。 在底层的实现上&#xff0c;Vue将模板编译成虚拟 DOM 渲染函数。结合响应系…

实现Xshell与虚拟机中Linux服务器的连接(附常见错误解决)

前言 Xshell是一个强大的安全终端模拟软件&#xff0c;它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。Xshell 通过互联网到远程主机的安全连接以及它创新性的设计和特色帮助用户在复杂的网络环境中享受他们的工作。 本文将介绍Xshell与虚拟机中Linux服务器连接…

前缀线性基——关于目前的理解以及一些样题

怎么说呢&#xff1f;在前几天我总结了了有关线性基的一篇博客&#xff0c;线性基用来去求整个区间的异或最值问题 前缀线性基——用于统计一个区间内的异或最值问题 那么我们如何去统计呢&#xff1f;那么就要去存储一个区间的异或空间线性基&#xff0c;因此我们的思路就是用…

【python】追加写入excel

输出文件运行前&#xff08;有两张表&#xff0c;“表1”和“Sheet1”&#xff09;&#xff1a; 目录 一&#xff1a;写入单表&#xff08;删除所有旧工作表&#xff0c;写入新表&#xff09;二&#xff1a;写入多表&#xff08;删除所有旧工作表&#xff0c;写入新表&#x…

平衡二叉搜索树之 AVL 树的模拟实现【C++】

文章目录 AVL树的简单介绍全部的实现代码放在了文章末尾准备工作包含头文件类的成员变量 构造函数和拷贝构造swap和赋值运算符重载析构函数findinsert[重要]当parent的平衡因子为1/-1时&#xff0c;如何向上更新祖先节点的平衡因子呢&#xff1f;怎么旋转&#xff1f;左单旋右单…