当前位置: 首页 > article >正文

基于亚博K210开发板——lvgl 图形化实验

开发板

亚博K210开发板
在这里插入图片描述

实验目的

本次测试主要学习 K210 图形化操作界面的功能。

实验元件

LCD 显示屏、FT6236 触摸板

lvgl 图形化库简介

  • LVGL(轻度综合图形界面库)是一个免费开源图形库,具有使用方便,画面美观,内存占用率低等优点,能够适配大部分嵌入式单片机,库里拥有许多控件,比如图片按钮、滑动杆、对话框等等,都可以轻松使用。
  • 对单片机系统要求:16/32/64 位 MCU,系统时钟速度大于 16MHz,ROM 大于 128K,静态 RAM 大于 16K,栈 RAM 大于 4K,堆 RAM 大于 16K,C99 或更新的编译器。需要注意一点的是内存使用情况可能因架构、编译器和构建选项的不同而有所不同。
    由于 lvgl 图形化库版本之间会有差异,这里以 lvgl-v6.1.1 为实验基础版本。
    由于 lvgl 图形化库版本之间会有差异,这里以 lvgl-v6.1.1 为实验基础版本。
    下载地址:https://github.com/lvgl/lvgl/releases/tag/v6.1.1
    这里需要注意的是如果从 lvgl 下载的版本,由于 K210 是 64 位芯片,所以需要增加 64 位的支持,找到 lvgl->src->lv_misc->lv_men.h 文件,在里面增加一个宏定义:#define LV_MEM_ENV64 1
    在这里插入图片描述

实验原理

  • lvgl 图形化库总共可以分为三个大的部分来理解,第一个是 lvgl 的线程,第二个是输入检测,第三个是显示画面。
  • lvgl 的主线程由外部定时器每几毫秒调用一次, lv_task_handler 主要是处理 lvgl 的任务,lv_tick_inc 则是起到刷新、清除中断和记录时间的作用。
  • lvgl 的输入检测由 lv_indev_drv_t 这个结构体管理,例如触摸板只需要设置输入参数后,在回调函数 read_cb 中传入触摸板的状态和触摸的 X/Y 坐标值就可以。
  • lvgl 的显示画面由 lv_disp_drv_t 结构体管理,同样是设置参数后,调用flush_cb 函数把回调传回的图像显示出来。

实验过程

  1. 首先根据上面的硬件连接引脚图,K210 的硬件引脚和软件功能使用的是FPIOA 映射关系。
// 硬件IO口,与原理图对应
#define PIN_LCD_CS             (36)
#define PIN_LCD_RST            (37)
#define PIN_LCD_RS             (38)
#define PIN_LCD_WR             (39)#define PIN_FT_SCL             (9)
#define PIN_FT_SDA             (10)
#define PIN_FT_INT             (12)
#define PIN_FT_RST             (37)/*****************************SOFTWARE-GPIO********************************/
// 软件GPIO口,与程序对应
#define LCD_RST_GPIONUM        (0)
#define LCD_RS_GPIONUM         (1)#define FT_INT_GPIONUM         (2)
#define FT_RST_GPIONUM         (3)/*****************************FUNC-GPIO************************************/
// GPIO口的功能,绑定到硬件IO口
#define FUNC_LCD_CS             (FUNC_SPI0_SS3)
#define FUNC_LCD_RST            (FUNC_GPIOHS0 + LCD_RST_GPIONUM)
#define FUNC_LCD_RS             (FUNC_GPIOHS0 + LCD_RS_GPIONUM)
#define FUNC_LCD_WR             (FUNC_SPI0_SCLK)#define FUNC_FT_SCL             (FUNC_I2C0_SCLK)
#define FUNC_FT_SDA             (FUNC_I2C0_SDA)
#define FUNC_FT_INT             (FUNC_GPIOHS0 + FT_INT_GPIONUM)
#define FUNC_FT_RST             (FUNC_GPIOHS0 + FT_RST_GPIONUM)
static void hardware_init(void)
{/* SPI lcd */fpioa_set_function(PIN_LCD_CS,  FUNC_LCD_CS);fpioa_set_function(PIN_LCD_RST, FUNC_LCD_RST);fpioa_set_function(PIN_LCD_RS,  FUNC_LCD_RS);fpioa_set_function(PIN_LCD_WR,  FUNC_LCD_WR);sysctl_set_spi0_dvp_data(1);/* I2C FT6236 */fpioa_set_function(PIN_FT_SCL, FUNC_FT_SCL);fpioa_set_function(PIN_FT_SDA, FUNC_FT_SDA);fpioa_set_function(PIN_FT_INT, FUNC_FT_INT);// fpioa_set_function(PIN_FT_RST, FUNC_FT_RST);
}
  1. 设置 LCD 的 IO 口电平电压为 1.8V
static void io_set_power(void)
{/* 设置显示器电压为1.8V */sysctl_set_power_mode(SYSCTL_POWER_BANK6, SYSCTL_POWER_V18);
}
  1. 在使用 LCD 触摸屏前需要初始化,先初始化 LCD,在初始化 ft6236,然后显示一秒自定义图片
 /* 初始化触摸屏并显示图片 */lcd_init();ft6236_init();lcd_draw_picture_half(0, 0, 320, 240, gImage_logo);
  1. 初始化 lvgl,设置 LCD 显示的结构体参数,其中 flush_cb 是 LCD 刷新的回调函数;再设置触摸屏输入的结构体参数,其中 read_cb 是输入设备的回调函数;最后初始化并启动定时器。
void lvgl_disp_input_init(void)
{lv_init();static lv_disp_buf_t disp_buf;static lv_color_t buf[LV_HOR_RES_MAX * 10];lv_disp_buf_init(&disp_buf, buf, NULL, LV_HOR_RES_MAX * 10);lv_disp_drv_t disp_drv;               /*Descriptor of a display driver*/lv_disp_drv_init(&disp_drv);          /*Basic initialization*/disp_drv.flush_cb = my_disp_flush;    /*Set your driver function*/disp_drv.buffer = &disp_buf;          /*Assign the buffer to the display*/lv_disp_drv_register(&disp_drv);      /*Finally register the driver*/// inputlv_indev_drv_t indev_drv;lv_indev_drv_init(&indev_drv);             /*Descriptor of a input device driver*/indev_drv.type = LV_INDEV_TYPE_POINTER;    /*Touch pad is a pointer-like device*/indev_drv.read_cb = my_touchpad_read;      /*Set your driver function*/lv_indev_drv_register(&indev_drv);         /*Finally register the driver*//* 初始化并启动定时器 */mTimer_init();
}
  1. .LCD 显示刷新回调的主要功能是解析需要显示的位置,然后传给 LCD 显示的函数显示出来,其中 color_p 就是需要显示的数据。显示完成后需要通过lv_disp_flush_ready 函数通知 lvgl 系统数据更新完成。
static void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p)
{uint16_t x1 = area->x1;uint16_t x2 = area->x2;uint16_t y1 = area->y1;uint16_t y2 = area->y2;lcd_draw_picture_half((uint16_t)x1, (uint16_t)y1, (uint16_t)(x2 - x1 + 1), (uint16_t)(y2 - y1 + 1), (uint16_t *)color_p);lv_disp_flush_ready(disp); /* Indicate you are ready with the flushing*/
}
  1. 输入设备回调函数主要的功能读取触摸板的状态和触摸的坐标
static bool my_touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{static int a_state = 0;if (ft6236.touch_state & TP_COORD_UD){ft6236.touch_state &= ~TP_COORD_UD;ft6236_scan();data->point.x = ft6236.touch_x;data->point.y = ft6236.touch_y;data->state = LV_INDEV_STATE_PR;a_state = 1;return false;}else if (ft6236.touch_state & 0xC0){if (a_state == 1){a_state = 0;data->point.x = ft6236.touch_x;data->point.y = ft6236.touch_y;data->state = LV_INDEV_STATE_REL;return false;}}return false;
}
  1. 定时器定时时间为每毫秒中断调用一次,在定时器中断函数中调用 lvgl的任务管理函数和时钟函数。
static void mTimer_init(void)
{timer_init(TIMER_DEVICE_0);timer_set_interval(TIMER_DEVICE_0, TIMER_CHANNEL_0, 1e6);timer_irq_register(TIMER_DEVICE_0, TIMER_CHANNEL_0, 0, 1, timer_irq_cb, NULL);timer_set_enable(TIMER_DEVICE_0, TIMER_CHANNEL_0, 1);
}
static int timer_irq_cb(void * ctx)
{lv_task_handler();lv_tick_inc(1);return 0;
}
  1. 初始化完成后,就可以运行例程程序,这个例程是创建一个有用三个界面的画面。最后打印 OK,并提示触摸屏幕。
 demo_create();printf("system start ok\n");
printf("Please touch the screen\n");
while (1);
  1. 编译调试,烧录运行
    进入自己项目 build目录,运行以下命令编译。
cmake .. -DPROJ=watchdog -G "MinGW Makefiles"
make

实验现象

烧录完成固件后,系统会弹出一个终端界面,如果没有弹出终端界面的可以打开串口助手显示调试内容。
终端会打印“Please touch the screen”提示触摸显示屏,显示屏会显示第一个界面,触摸中间输入框,会在底部弹出一个虚拟键盘,在键盘上触摸可以打印字符;上面顶栏的“List”切换到第二个界面列表,可以点击列表上的内容, 则会把对应的名称显示到第一个界面的输入框中;点击顶栏的“Chart”,切换到第三个界面,拖动底部的滑动杆,上面的条形图会跟着变化。
在这里插入图片描述
在这里插入图片描述

实验总结

  • lvgl 是一个嵌入式微处理器图形化库,拥有丰富的控件。
  • K210 开发板完成可以跑图形化的 lvgl 库,并且效果很 OK。
  • 由于 lvgl 的不同版本的差异性,跨大版本是存在兼容性问题的。

相关文章:

基于亚博K210开发板——lvgl 图形化实验

开发板 亚博K210开发板 实验目的 本次测试主要学习 K210 图形化操作界面的功能。 实验元件 LCD 显示屏、FT6236 触摸板 lvgl 图形化库简介 LVGL(轻度综合图形界面库)是一个免费开源图形库,具有使用方便,画面美观&#xff…...

LABVIEW 通过节点属性动态改变数值显示控件的方法

在 LabVIEW 里,能够借助属性节点来改变数值输入控件的禁用状态。下面为你介绍具体的操作步骤: 1. 创建或开启前面板 要先创建一个数值输入控件,操作方法是:点击 "控件" 选板,接着选择 "新式→数值→数…...

信息安全管理与评估2025上海卷

上海市“星光计划”第十一届职业院校技能大赛 (高职组) “信息安全管理与评估”赛项 任务书 一、 赛项时间共计4小时。二、 赛项信息 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段 平台搭建与安全设备 配置防护 任务1 网络平台搭建 2…...

el-form 使用el-row el-col对齐 注意事项

1.el-form 使用inline&#xff0c;el-form-item宽度会失效。 2.为了保证el-form-item 和 它内部的el-input 能在一行&#xff0c;要设置el-form-item的label-width <el-form :model"editInspectform"><el-row style"margin-bottom: 20px"><…...

使用Terraform创建azure databrick

Azure Databricks 介绍 Azure Databricks是一种在Microsoft Azure云平台上运行的快速、易于使用的分析和大数据处理服务。它是基于Apache Spark的分析平台,可帮助用户以更高效的方式进行数据处理、数据分析和机器学习任务。Azure Databricks提供了一个协作式的工作环境,使数…...

Python爬虫开发基础案例:构建可复用的名言采集系统

一、项目背景与技术选型 1.1 爬虫技术应用场景 网络爬虫作为数据采集的核心技术&#xff0c;在舆情监控、价格比对、学术研究等领域发挥着重要作用。本案例选择quotes.toscrape.com作为目标网站&#xff0c;因其具有以下典型特征&#xff1a; 公开允许爬取的测试环境清晰的H…...

Spring Boot 中修改 HTTP 响应状态码(即 `response.status`)可以通过以下几种方式实现

以下是不同场景下的具体方法&#xff1a; 方法 1&#xff1a;直接使用 ResponseStatus 注解 在 Controller 方法或异常类上使用 ResponseStatus 注解&#xff0c;直接指定返回的状态码。 场景示例&#xff1a;固定返回指定状态码 import org.springframework.http.HttpStatu…...

Linux目录介绍+Redis部署(小白篇)

目录 &#x1f451;Linux基础✨【目录】 &#x1f451;Redis 安装1.下载压缩包2.解压3.安装编译环境4.安装到本地5.设置开机自启 &#x1f451;Linux 自启服务 &#x1f451;Linux基础 虽然在大二的时候学过Linux&#xff0c;但是很多基础知识都忘了&#xff0c;想再次从基础捡…...

软件开发MVC三层架构杂谈

在当今的软件开发领域&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;架构已成为构建复杂系统时不可或缺的设计模式。它通过将应用程序划分为模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&#xff09;三…...

Python 基础语法速查手册:从入门到精通

Python 作为最受欢迎的编程语言之一&#xff0c;以其简洁易读的语法和强大的功能吸引了大量开发者。本文全面汇总 Python 基础语法知识&#xff0c;帮助初学者快速掌握核心概念&#xff0c;并为后续深入学习打下坚实基础。 1. Python 基础语法结构 1.1 代码结构与缩进规则 Py…...

Spring框架--IOC技术

一、Spring框架的介绍 1、Spring框架的概述 Spring 是一个开放源代码的设计层面框架&#xff0c;它解决的是业务逻辑层和其他各层的松耦合问题&#xff0c;因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003年兴起的一个轻量级的Java开发框架&#xff0c;由 Rod Jo…...

前端vue2-完全前端生成pdf->pdf-lib,html2canvas+jspdf,原生打印,三种方式(打印带有echarts图的pdf)

pdf-lib&#xff1a;优点是可以控制输出内容&#xff0c;缺点是麻烦 html2canvas&#xff1a;优点是直接把html页面转成图片之后插入pdf很方便&#xff0c;不用过多的代码&#xff0c;缺点是不好控制图片大小&#xff0c;容易被戒断&#xff0c;可以把想打印的内容藏在页面外面…...

论文阅读笔记——Emerging Properties in Unified Multimodal Pretraining

BAGEL 论文 商业闭源系统与学术/开源模型的差距很大&#xff0c;BAGEL 旨在通过开源统一架构大规模交错数据主要解决&#xff1a; 架构割裂&#xff1a;理解/生成分属两条网络&#xff0c;信息被压缩在少量条件 token 中&#xff0c;长上下文推理受限。数据贫乏&#xff1a;主…...

JAVA批量发送邮件(含excel内容)

EmailSenderHtmlV1 是读取配置文件《批量发送邮件.xlsx》&#xff0c;配置sheet获取 发件人邮箱 邮箱账号 口令&#xff0c;发送excel数据sheet获取收件人邮箱 抄送人邮箱 邮件标题 第N行开始(N>1,N0默认表头) 第M行结束(M>1,M0默认表头) 附件文件夹…...

Linux(Ubuntu)新建文件权限继承问题

当你在一个工作目权限为777的文件下&#xff0c;新建一个文件的时候&#xff0c;就有可能发生&#xff0c;新建的这个文件&#xff0c;权限和其他文件&#xff0c;或者工作目录不一致的问题&#xff0c;我们不可能每次新建一个文件&#xff0c;就要 sudo chmod -R 777 /PATH 所…...

Java中的String的常用方法用法总结

1.1 String &#xff08;1&#xff09;声明 &#xff08;2&#xff09;字符串常量 存储字符串数据的容器&#xff1a;private final char value[] 字符串常量都存储在字符串常量池&#xff08;StringTable&#xff09;中 字符串常量池不允许存放两个相同的字符串常量 &#xff…...

QGIS如何打开 ARCGIS的mxd工程文件

“SLYR”是一款由著名开源组织“北路开源”开发的一套QGIS兼容和转换ARCGIS样式、工程、设置信息的插件&#xff01;其主要功能为&#xff1a; 最近项目需要&#xff0c;我使用了一些功能&#xff0c;发现其对中文环境及中文信息支持不太好&#xff0c;还有一些其它BUG&#xf…...

基于微信小程序的智能问卷调查系统设计与实现(源码+定制+解答)基于微信生态的问卷管理与数据分析系统设计

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…...

React 如何封装一个可复用的 Ant Design 组件

文章目录 前言一、为什么需要封装组件&#xff1f;二、 仿antd组件的Button按钮三、封装一个可复用的表格组件 (实战)1. 明确需求2. 设计组件 API3. 实现组件代码4. 使用组件 三、封装组件的最佳实践四、进阶优化 总结 前言 作为一名前端开发工程师&#xff0c;在日常项目中&a…...

CloudWeGo-Netpoll:高性能NIO网络库浅析

一、Netpoll 简介 Netpoll 是由字节跳动开发的高性能 NIO&#xff08;Non-blocking I/O&#xff09;网络库&#xff0c;专注于 RPC 场景。在 RPC 场景中&#xff0c;通常有较重的处理逻辑&#xff0c;无法串行处理 I/O。而 Go 的标准库 net 设计了 BIO&#xff08;Blocking I/…...

Mac的显卡架构种类

目录 一、Intel架构时期的Mac显卡&#xff08;2006 年至 2020 年&#xff09; 1. Intel 集成显卡&#xff08;iGPU&#xff09; 2. 独立显卡&#xff08;dGPU&#xff09;—— AMD 和 NVIDIA &#xff08;1&#xff09;AMD Radeon&#xff08;主流独显选择&#xff09; &a…...

HTTP基本概述

HTTP基本概述 报文格式 HTTP报文分为 请求报文 和 响应报文 一、请求报文 请求行&#xff08;Request Line&#xff09;请求头部&#xff08;Request Headers&#xff09;&#xff08;空行&#xff09;请求体&#xff08;Request Body&#xff09; ← 可选&#xff0c;如 P…...

Canvas SVG BpmnJS编辑器中Canvas与SVG职能详解

Canvas详解与常见API 一、Canvas基础 核心特性 • 像素级绘图&#xff1a;Canvas是基于位图的绘图技术&#xff0c;通过JavaScript操作像素实现图形渲染&#xff0c;适合动态、高性能场景&#xff08;如游戏、数据可视化&#xff09;。 • 即时模式&#xff1a;每次绘制需手动…...

dify多实例部署,一台机器部署多个dify实例

dify多实例部署 目的 实现在一台机器上&#xff0c;部署多个dify的实例。比如一个部署1.2版本&#xff0c;一个部署1.3版本。废话没有&#xff0c;直接上干货。 前提 你的电脑已经部署了一个dify实例&#xff0c;并成功运行。比如已经部署成功0.15.3版本。 步骤如下&#…...

ML 48.机器学习之临床生存树(rpartSurv)

简介机器学习中生存树&#xff08;Survival Tree&#xff09;的原理详解 生存树是结合决策树与生存分析的机器学习模型&#xff0c;主要用于处理带有时间-事件数据&#xff08;包含删失数据&#xff09;的预测问题。其核心目标是&#xff1a;通过树状结构对数据进行递归分割&am…...

HarmonyOS 应用开发,如何引入 Golang 编译的第三方 SO 库

本指南基于笔者临时修复的 ohos_golang_go 项目fork&#xff0c;解决HO 应用导入 cgo编译产物时的 crash 问题。 1. 下载 ohos_golang_go git clone https://gitcode.com/deslord/ohos_golang_go.git&#x1f4cc; 该仓库为笔者临时修复版本&#xff0c;修复了 CGO 编译模式下…...

Axure元件动作六:设置图片

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 案例视频: Axure元件动作:设置图片 课程主题:设置图片 主要内容:图片悬停、鼠标按下时、选中...

一体化雷达波明渠流量计简介

一、技术定义与核心原理 一体化雷达波明渠流量计是基于微波技术的全自动流量监测设备&#xff0c;采用 24G K 波段平面雷达技术&#xff0c;通过非接触式测量方式实现对明渠、河道、排水管网等场景的水位、流速及流量监测。其核心原理是利用雷达发射高频电磁波&#xff0c;经水…...

Pr -- 耳机没有Pr输出的声音

问题 很久没更新视频号了&#xff0c;想用pr剪辑一下&#xff0c;结果使用Pr打开后发现耳机没有Pr输出的声音 解决方法 在编辑--首选项-音频硬件中设置音频硬件的输出为当前耳机设备...

白皮精读:2024年国家数据基础设施建设指引【附全文阅读】

《国家数据基础设施建设指引》提出建设覆盖数据采集至安全全链条的新型基础设施,目标到 2029 年形成横向联通、纵向贯通的格局,聚焦数据可信流通、算力协同、高速传输、安全保障四大功能,明确技术架构与重点方向,强调政府与市场协同,分阶段推进试点及规模化部署,为数字中…...