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

news2025/5/25 11:38:29

开发板

亚博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*/

    // input
    lv_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 的不同版本的差异性,跨大版本是存在兼容性问题的。

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

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

相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

穿屏技巧:Mac-Windows一套鼠标键盘控制多台设备 (sharemouse6.0-Keygen)| KM-401A

文章目录 引言I sharemouse6.0介绍功能介绍关闭自动更新安装包II 安装系统对应的sharemouse软件Windowsmac版本III 知识扩展:SCP、FTP、SSH文件传输SCP配置SSH密钥免密登录FTP(File Transfer Protocal,文件传输协议)引言 基于USB进行同步键盘和鼠标事件,更流畅。 基于局域…

【写在创作纪念日】基于SpringBoot和PostGIS的各省东西南北四至极点区县可视化

目录 前言 一、空间检索简介 1、空间表结构 2、四至空间检索 二、前后端实现 1、后端实现 2、前端集成 三、成果展示 1、东部省份 2、西部省份 3、南部省份 4、北部省份 5、中部省份 四、总结 前言 在当今数字化时代,地理信息数据的分析与可视化对于众…