【GD32F427开发板试用】7. 移植LVGL到GD32F427V

news2024/12/23 12:10:27

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:hehung

之前发帖

【GD32F427开发板试用】1. 串口实现scanf输入控制LED
【GD32F427开发板试用】2. RT-Thread标准版移植
【GD32F427开发板试用】3. 硬件IIC0驱动OLED显示中文
【GD32F427开发板试用】4. ADC采集摇杆模块移动量
【GD32F427开发板试用】5. SPI驱动TFTLCD屏幕
【GD32F427开发板试用】6. 定时器运用之精确定时1s

前言

LVGL是一个开源的轻量级图形显示库,非常适合资源比较少的单片机进行移植,上一次使用SPI驱动了一块TFTLCD屏幕,这一次就想着将LVGL移植上来,可以显示一些好看的界面。

本文实现了如下功能:

  1. 移植基于RT-Thread OS(使用RT_Thread OS移植起来十分的方便,都不需要自己去github下载源码了);
  2. 开发工具基于RT-Thread Stduio;
  3. 实现了LVGL功能移植,并使用label(标签)显示字符串;
  4. 如果没有使用RT-Thread OS,使用其他的系统或者是裸机,本文还是有一定的参考价值。

开发流程

环境准备

  1. 准备一个可以正常驱动LCD或者其他显示屏幕的工程,其中需要用到画点函数,画点函数是LVGL能够正常工作的基础,如果没有这个函数,需要先实现一个。 使用GD32F427V-START驱动TFT LCD的过程可以参考我之前发的帖子(本文最上部分);
  2. RT-Thread Studio开发环境,如果使用标准版RT-Thread OS,其他开发环境也是一样的操作,但是配置方面需要使用RT-Thread 提供的ENV工具;如果没有使用RT-Thread OS,使用其他的系统或者是裸机,本文还是有一定的参考价值;

移植过程

添加LVGL包

如下图,添加LVGL,如果使用ENV,则按照ENV的方式添加;

如果使用逻辑,需要在github上下载,电脑安装git,然后输入命令:

git clone --recursive https://github.com/lvgl/lvgl.git

创建显示文件

如下图,将这两个文件移植到application目录下,并更新名字,不然会导致编译错误。
注:还有四个文件根据实际情况选择是否需要复制到application,和文件系统以及触摸屏有关,我所使用的LCD屏幕不带触摸功能,所以没有移植,如果带有触摸功能,可以将最后两个文件一并移植到application文件夹下备用,关于触摸文件的修改,本文不做说明。

更新显示文件

修改头文件包含以及头文件内容

  1. 针对app_port_disp.c文件,修改头文件包含

  1. 针对app_port_disp.h文件,修改如下部分

移植(重要部分)

现在开始最重要的部分了,这部分是lvgl移植的核心,需要和我们的驱动文件配合起来。具体方式见下面:

  1. 修改显示屏的长和宽
    我所使用的显示屏是320X240的,所以做如下修改。
    如下图:

  1. lv_port_disp_init函数修改
    定位到该函数,初始化buffer,官方提供了三种方式,并详细描述了每方式的区别,本文使用第一种方式,最为简单,我们将buffr扩大了一些,其实默认也是可以的。
    屏蔽不需要的其他两种方式。
    如下图:

  1. disp_init函数修改
    定位到disp_init,这里面添加驱动函数的初始化函数即可。
    修改如下:
    其中,lcd_init是我的LCD屏幕的驱动函数;
    lcd_set_region是我的驱动函数中设置屏幕长宽的函数,这里根据自己的驱动函数实现逻辑添加即可,对于我的驱动代码,lcd_set_region是必须要加的,不然屏幕显示不正确。
    /*Initialize your display and the required peripherals.*/ static void disp_init(void) { /*You code here*/ /* Initialize lcd */ extern void lcd_init(void); lcd_init(); extern void lcd_set_region(uint16_t x_start,uint16_t y_start,uint16_t x_end,uint16_t y_end); lcd_set_region(0,0,MY_DISP_HOR_RES - 1,MY_DISP_VER_RES - 1); }
  2. 更新disp_flush函数
    该函数是LVGL显示的核心函数,需要将我们自己的驱动代码写到这里,主要是画一个实心矩形的驱动代码,官方提供了一个接口,我们可以直接在两个for循环内部加上我们的画点函数,或者是自己实现一个画实心矩形的逻辑。我修改的代码如下。
    其中,
  • LCD_CS_CLR与LCD_CS_SET是我的LCD特有的操作,不一定每个驱动代码都会这样写;
  • lcd_draw_point是我的画点函数,color_p是颜色变量,一般的颜色都是16位的,所以直接转换成了uint16即可,颜色的位数可以进行配置,后面再说。
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
    if(disp_flush_enabled) {
        /*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/

        int32_t x;
        int32_t y;

        LCD_CS_CLR;
        for(y = area->y1; y <= area->y2; y++) {
            for(x = area->x1; x <= area->x2; x++) {
                /*Put a pixel to the display. For example:*/
                /*put_px(x, y, *color_p)*/
                extern void lcd_draw_point(uint16_t x,uint16_t y,uint16_t data);
                lcd_draw_point(x, y, (uint16_t)color_p->full);
                color_p++;
            }
        }
        LCD_CS_SET;
    }

    /*IMPORTANT!!!
     *Inform the graphics library that you are ready with the flushing*/
    lv_disp_flush_ready(disp_drv);
}

到目前为止,基本上以及算是移植完成了显示部分了,但是现在还是不能使用,因为还没有进行配置,接下来描述这部分。

RT-Thread配置

如果没有使用RT-Thread OS可以忽略这步骤,后面的步骤(lv_conf.h文件中)也可以对这部分内容进行配置。
打开RT-Thread配置页面,配置lvgl相关参数,配置想很少,根据实际情况配置。
第一项配置优先级;
第二项配置LVGL使用RT-Thread任务的栈空间;
第三项配置,用于配置屏幕刷新速率,单位是ms。默认是5。其实没必要,因为SPI总线的刷新速度跟不上,对于GD32F427V,SPI最快也要二分频,连接到了APB1总线,所以最高频率为25MHz。这里设置20或者30都是可以的,本来刷新速率也跟不上。

lv_conf.h文件创建

lv_conf.h文件是用于配置LVGL中的一些功能是否使能的。模板中已经提供了,我们只需要复制过来,更新一下名字即可。

  1. 使能该文件

  1. 设置配置
    默认配置就能够使用了,但是很多选择项都是打开的,很占用资源,可以对其中一些不使用的显示模块进行禁用,本文就不做过多说明。
    注: 在编译的时候还是会报一些警告或者是编译错误,直接将lv_conf.h中报错的宏定义禁掉就可以了,因为很多都是重定义,在其他地方已经定义过了,这里无需再次定义,然后在此编译就不会报错了。
    举例如下:

关于宏LV_DPI_DEF的计算公式如下:
DPI = 根号下(长边像素的平方+短边像素的平方)/英寸。
对于我的LCD,2.2寸,320X240,所以计算公式为
DPI = 根号下(320_320 + 240_240) / 2.2 ≈ 182.

到目前为止,整个移植过程都结束了,接下来就是写测试用例来测试移植是否成功了。

测试代码

如果用的是RT-Thread OS,官方已经提供了测试代码,如下,并且会自动参与编译,我们就无须手动创建了,没有使用RT-Thread需要手动创建一个文件,本文不做说明:

官方已经帮我们创建好了显示任务,我们不需要再次创建,只需要往里面添加显示内容即可。
禁掉其中无用的内容。
只需要修改lvgl_thread_entry文件。
禁掉lv_port_indev_init以及lv_user_gui_init;
lv_user_gui_init起止可以不用禁掉,在里面写我们的代码,但是不知道为什么我这边总是编译不通过,所以就禁掉了,然后添加了函数
Gui_LvglEntry,这个函数需要我们自己实现。

static void lvgl_thread_entry(void *parameter)
{
#if LV_USE_LOG
    lv_log_register_print_cb(lv_rt_log);
#endif /* LV_USE_LOG */
    lv_init();
    lv_port_disp_init();
//    lv_port_indev_init();
//    lv_user_gui_init();

    extern void Gui_LvglEntry(void);
    Gui_LvglEntry();

    /* handle the tasks of LVGL */
    while(1)
    {
        lv_task_handler();
        rt_thread_mdelay(PKG_LVGL_DISP_REFR_PERIOD);
    }
}

实现Gui_LvglEntry

在application里面新建一个文件app_gui.c,然后新建一个函数Gui_lvgl_Test,内容如下:
该函数我实现了显示不同颜色的字符串;见效果展示。

/*
 * @hehung
 * 2022-12-13
 *  转载请注明出处
 * */

#include "lvgl.h"

static void Gui_lvgl_Test(void);

/* My GUI entry */
void Gui_LvglEntry(void)
{
    Gui_lvgl_Test();
}

/* Lvgl test for porting to GD32F427V  */
static void Gui_lvgl_Test(void)
{
    lv_obj_t * label;

    /*Create a label below the slider*/
    label = lv_label_create(lv_scr_act());
    lv_label_set_long_mode(label, LV_LABEL_LONG_WRAP);     /*Break the long lines*/
    lv_label_set_recolor(label, true);                      /*Enable re-coloring by commands in the text*/
    lv_label_set_text(label, "#0000ff GD32F427V-START#\n"
                             "#ff00ff aijishu.com#\n "
                             "#ff0000 Lvgl Porting Test#\n"
                             "         --hehung");
    lv_obj_set_width(label, 150);  /*Set smaller width to make the lines wrap*/
    lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_CENTER, 0);
    lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
}

至此,整个LVGL移植过程结束。下面试验证。

验证

效果见下方。
试了一下刷新,速度还是比较慢,后期还需要优化,使用DMA应该会快一些。

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

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

相关文章

TypeScript快速入门———(一)TypeScript 介绍以及初体验

文章目录1. TypeScript 介绍1.1 TypeScript 是什么1.2 TypeScript 为什么要为 JS 添加类型支持&#xff1f;1.3 TypeScript 相比 JS 的优势2. TypeScript 初体验2.1 安装编译 TS 的工具包2.2 编译并运行 TS 代码2.3 简化运行 TS 的步骤1. TypeScript 介绍 1.1 TypeScript 是什…

[python入门㊺] - 异常中的finally

目录 ❤ finally的作用 ❤ try、except、finally的执行顺序是什么 ❤ 案列 finally 中不带return finally中有return ❤ finally的作用 finally内的代码不管有无异常发生&#xff0c;都会执行。具体来说&#xff1a; 无论是否发生了异常&#xff0c;一定会执行 fi…

若依-pro使用

前言 最近开始搞一个项目&#xff0c;使用的框架是若依-pro。新手上路&#xff0c;多多指教。 首先了解一下什么是若依&#xff0c;其实他就是将很多项目共同的代码进行了抽取&#xff0c;方便我们可以快速开发的一个javaweb项目&#xff08;若依是一个项目&#xff0c;一个p…

中睿天下Coremail联合发布《2022年第四季度企业邮箱安全报告》(附下载)

近日&#xff0c;中睿天下联合CAC邮件安全大数据中心&#xff08;以下简称CAC中心&#xff09;发布《2022年第四季度企业邮箱安全报告》&#xff0c;对当前企业邮箱的应用状况和安全风险进行了分析。1.垃圾邮件同比下降22.16%日前&#xff0c;CAC&#xff08;Coremail Anti Spa…

test3

数据链路层故障分析 一、网桥故障 a.主要用途简述 网桥作为一种桥接器&#xff0c;可以连接两个局域网。工作在数据链路层&#xff0c;是早期的两端口二层网络设备。可将一个大的VLAN分割为多个网段&#xff0c;或者将两个以上的LAN互联为一个逻辑LAN&#xff0c;使得LAN上的…

互联网舆情监测系统困境及措施,TOOM舆情监控平台应对及处置?

互联网舆情监测系统帮助政府、企业、媒体等机构了解公众的需求和诉求&#xff0c;及时发现和解决问题&#xff0c;防范和化解不良舆情&#xff0c;提高公众满意度和信任度。互联网舆情监测的技术手段包括爬虫、文本挖掘、情感分析、网络图谱等&#xff0c;互联网舆情监测系统困…

UE4 使用AE跟踪相机数据,演算任意视频的相机运动数据

参考链接 ae 3dsmax 摄像机互导 aehj 虚幻引擎5使用AE跟踪相机数据 一、软件版本&#xff1a;试过好几个版本&#xff0c;目前只有两组版本成功过 3dmax2016 AE2014 3dmax2020 AE2022 二、程序安装&#xff08;执行exe和手动拷贝是相同的&#xff09; 参考链接 重启AE后如…

工作记录------PostMan自测文件导入、导出功能

工作记录------PostMan自测文件导入、导出功能 测试文件导出 背景&#xff1a;写了一个文件下载功能&#xff0c;是数据写到excel中&#xff0c;下载&#xff0c;使用PostMan点击send后&#xff0c;返回报文是乱码。 解决办法&#xff1a; 点击send下面的 send and Downlo…

python学习之pandas库的使用总结

【1】读取CSV并进行透视 我们的原始数据格式&#xff1a; ① 读取数据 pd.read_csv 会读取csv表格并使用names指定读取后的列名称。 import pandas as pdreleaseNumOfYear pd.read_csv("data/releaseNumOfYear.csv", headerNone, names[Year, Genre, ReleaseNum]…

各种音频接口比较

时间 参考&#xff1a;https://www.bilibili.com/video/BV1SL4y1q7GZ/?spm_id_from333.337.search-card.all.click&vd_source00bd76f9d6dc090461cddd9f0deb2d51&#xff0c; https://blog.csdn.net/weixin_43794311/article/details/128941346 接口名字时间公司支持格式…

springcloud - 2021.0.3版本 - (一)服务注册nacos+feign

一&#xff0c;注册中心 最新版使用的是nacos&#xff0c;可替换为eureka&#xff0c;zookeeper&#xff0c;使用方式大同小异&#xff0c;这里不做扩展。 下载安装&#xff1a;&#xff08;有机会重装时再补上&#xff09; 管理页面&#xff1a;http://localhost:8848/naco…

RabbitMQ详解(二):Docker安装RabbitMQ

在Docker上安装部署RabbitMQ方便快捷&#xff0c;不需要额外安装Erlang环境&#xff0c;所以写该篇文章先来介绍如何在Docker上部署RabbitMQ。 一、安装并运行 (1)、在docker hub 中查找rabbitmq镜像 docker search rabbitmq:3.9.12-management带有“mangement”的版本&…

Python将脚本程序转变为可执行程序

Python将脚本程序转变为可执行程序 类似Java打包操作&#xff0c;若不想让人看到Python程序内部逻辑&#xff0c;也可将其转换为exe可执行文件 首先自己写一个Python程序&#xff0c;如下&#xff1a; print("start running...")listTest ["I","a…

网渗透(二十二)之Windows协议认证和密码抓取-Silver Ticket白银票据制作原理及利用方式

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

知识图谱业务落地技术推荐之国内知识图谱平台汇总(竞品)[阿里、腾讯、华为等】

各位可以参考国内知识图谱平台产品进行对技术链路搭建和产品参考提供借鉴。

2.4G-WiFi连接路由器过程

一、概述 WiFi的数据通信基于802.11协议进行&#xff0c;无线AP在工作时会定时向空中发送beacon数据包&#xff0c;基站&#xff08;STA&#xff09;从beacon中解析出AP的名称、加密方式等信息&#xff0c;从而发起连接。 二、WiFi连接路由器的详细过程 WiFi连接过程主要可以…

tomcat打debug断点调试

windows debug调试 jdk版本&#xff1a;1.8.0_181 tomcat版本&#xff1a;apache-tomcat-9.0.68.0 idea版本&#xff1a;2020.1 方法一 修改catalina.bat 在%CATALINA_HOME%\bin\catalina.bat中找到 set “JAVA_OPTS%JAVA_OPTS% -Djava.protocol.handler.pkgsorg.apache…

TIOBE 2 月编程语言榜:C++ 势不可挡

继上个月&#xff0c;C 摘得 TIOBE 2022 年度最佳编程语言奖项之后&#xff0c;其发展势头仍然保持强劲。放眼整个编程语言榜单中&#xff0c;只有 C 突破了 2 字开头的增幅&#xff0c;其同比增幅为 5.93%&#xff0c;其次便是 C 以 1.31% 的增长趋势排在第二位。 在本月 Top …

U盘文件如何恢复?u盘还原,必学的4招(2023已更新)

移动U盘是大家经常使用的存储工具&#xff0c;它可以帮助我们保存各种文件数据。在学习和工作中&#xff0c;U盘文件丢失的原因五花八门。遇到U盘文件丢失该怎么办&#xff1f;u盘格式化了怎样恢复&#xff1f;u盘还原&#xff0c;我们必须要学习的4招&#xff01; 第一招&…

如何提高短视频的播放量-4个技巧

做短视频自媒体&#xff0c;点击率是第一位&#xff0c;点击量越多&#xff0c;粉丝也就越多。可是&#xff0c;怎么才能增加短视频的点击率和提高播放量呢&#xff1f;今天就来教大家4个技巧&#xff1a; 1、蹭热点 热门话题自带流量&#xff0c;它的热度和价值&#xff0c;是…