【兆易创新GD32H759I-EVAL开发板】 移植LVGL

2024-05-16 06:36

本文主要是介绍【兆易创新GD32H759I-EVAL开发板】 移植LVGL,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为什么最终选择了 LVGL?

经过比较多种主流的界面设计软件,emWin 开发方便 ,但是没有开放源码  所以感觉不太自由;

TouchGFX目前仅限于STM32用, 应用范围小;

ThreadX 的配套GUI  GUIX   这个用起来感觉确实很方便,其实很想用, 但是由于对ThreadX还不太熟悉,所以GD32移植ThreadX还是有点麻烦,所以暂时放弃,但是 不得不说ThreadX 系统的性能还是很厉害的,它的中断响应速度在目前流行的多数嵌入式系统中是数一数二的,

国产的周立功也推出了GUI界面库以及配套设计,AWTK全称为Toolkit AnyWhere,是周立功倾心打造的一套基于C语言开发的GUI框架。旨在为用户提供一个功能强大、高效可靠、简单易用、可轻松做出炫酷效果的GUI引擎。其特点是支持跨平台同步开发,一次编程,到处编译,跨平台使用。但是目前感觉用的人不多,根据官方介绍 ,对系统资源也是有些要求的,

QT for MCU  对资源受限的单片机来说 还是不太流畅

GuiLite 是简单,易学的GUI库,代码量少,例子很多, 但是没有图形化设计软件;

所以最终综合考虑 ,LVGL 可以在多平台运行, 也有图形化设计软件,就选择了它

移植LVGL  基本的思路是

1使用GUI Guider 设计好LVGL的界面, 这个软件是 NXP官方为自家芯片的图形化界面设计而推出的, 也支持PC端模拟设计, 可以生成lvgl图形的源码;

2创建目标板的工程,调试好液晶屏的驱动程序 RGB,SPI等任何接口都可以

3界面移植工作

        1)移植LVGL 源码,不包含设计的GUI界面;(先把文件加入工程中)

        2)移植GUI Guider生成的界面代码(先把文件加入工程中)

        3)对LVGL界面库的代码进行配置,主要是修改一些头文件里的 宏定义(修改文h件)

        4)对GUI Guider的代码移植后 要在主函数中进行 配置和调用 (修改c文件)

        5) 有时候要根据GUI Guider界面所用到的控件和资源 对 LVGL的配置文件进行二次调整

        移植时注意 建议尽量按照官方指导的文件结构去移植,

GD32H7 移植要点

1 搞明白TLI的用法。

 TLI实际上是rgb接口液晶屏的控制器,除了要定义基本的rgb接口输出时要设置参数之外。

里面有两个图层控制单元,图层0和图层1可以进行简单的图层混合操作。

在使用时可以使用一个图层,也可以使用两个图层。但是即使不用的图层也会参与到后期的2个图层的混合过程中,最后输出混合的图像。不使用的图层可以设置一个默认的图层参数。图层没有使用时,这个默认参数就会被激活。

 TLI的工作过程是将 初始化时指定的显存区域的 图像内容 输出到GRB接口上。

暂时先用一个图层。

2移植 LVGL  的要点

1 .定义显存,定义显存位置,因为这个板子的屏幕也不小。,所以就算是单个整屏显存也要占用250kb左右的大小。使用双显存的话,需要将显存的位置定义在外部的任务中。

将显存定义在外部任务中有几种方式。

1) 不使用自定义sct文件,在Keil的工程中配置好外部显存的地址。然后在代码中指定分配地址,或者在代码属性中设置分配地址

2)使用自定义的sct文件, 在代码中指定 显存的位置

如 Arm V6下 :

先在sct中定义 SDRAM 的分配区,然后再代码中定义:

__ALIGNED(32) lv_color_t buf_disp[LV_HOR_RES_MAX * LV_VER_RES_MAX] __attribute__((section("SDRAM")));

2 .实现刷屏函数

static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p);

这个的函数实现 是lvgl的一个重点,涉及到系统工作效率

方式1  内存到内存 想 准备好的显示内容  逐个字节搬运至 指定的TLI显存地址中

方式2  使用IPA的DMA

方式3 使用DMA-DMA


/*Flush the content of the internal buffer the specific area on the display*You can use DMA or any hardware acceleration to do this operation in the background but*'lv_disp_flush_ready()' has to be called when finished.*/
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{SCB_CleanInvalidateDCache();/*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/
#if (USE_IPA_INT == 0)uint32_t time_out;
#endifuint16_t offline;offline = LV_HOR_RES_MAX - (area->x2 - area->x1 + 1);IPA_CTL = 0x0;IPA_FMADDR = (uint32_t)color_p;IPA_DMADDR = (uint32_t)buf_disp + 2*(LV_HOR_RES_MAX*area->y1+area->x1);IPA_FLOFF = 0;IPA_DLOFF = offline;IPA_FPCTL = FOREGROUND_PPF_RGB565;IPA_IMS = (uint32_t)((area->x2 - area->x1 + 1) << 16) | (uint16_t)(area->y2 - area->y1 + 1);#if (USE_IPA_INT == 1)
g_disp_drv = disp_drv;  // 将disp_drv的值赋给全局变量g_disp_drv,可能是用于设定显示驱动的参数
/* enable IPA interrupt */
// IPA_CTL_FTFIE :传输完成中断使能位 软件置位和清除 0:传输完成中断禁止 1:传输完成中断使能
//IPA_CTL_TAEIE : 传输访问错误中断使能位
//IPA_CTL_WCFIE : 配置错误中断使能位
IPA_CTL |= IPA_CTL_FTFIE | IPA_CTL_TAEIE | IPA_CTL_WCFIE;  // 将IPA_CTL_FTFIE,IPA_CTL_TAEIE,IPA_CTL_WCFIE这些标志位设置到IPA_CTL中,启用对应的IPA中断
IPA_CTL |= IPA_CTL_TEN;  // 将IPA_CTL_TEN设置到IPA_CTL中,可能为启用IPA的工作(例如开启传输等)
g_ipa_flag = 1;  // 将全局变量g_ipa_flag设置为1,表示IPA已经被设定并启用#elseIPA_CTL |= IPA_CTL_TEN;/* Wait until transfer is done */while (IPA_CTL & IPA_CTL_TEN){if(time_out++ >= 0XFFFFFFFF) break;}/* IMPORTANT!!!* Inform the graphics library that you are ready with the flushing*/lv_disp_flush_ready(disp_drv);
#endif}#if (USE_IPA_INT == 1)// /*!
//     \brief      this function handles IPA exception
//     \param[in]  none
//     \param[out] none
//     \retval     none
// */
// void IPA_IRQHandler(void)
// {
//     if(RESET != ipa_interrupt_flag_get(IPA_INT_FLAG_FTF)){
//         if(0U != (IPA_CTL & IPA_CTL_FTFIE)){
//             IPA_CTL &= (uint32_t)(~IPA_CTL_FTFIE);
//             ipa_interrupt_flag_clear(IPA_INT_FLAG_FTF);//             if(1U == g_ipa_flag){
//                 g_ipa_flag = 0U;
//                 /* IMPORTANT!!!
//                  * Inform the graphics library that you are ready with the flushing*/
//                 lv_disp_flush_ready(g_disp_drv);
//             }
//         }
//     }
// }
/*!\brief      this function handles IPA exception\param[in]  none\param[out] none\retval     none
*/
void IPA_IRQHandler(void)
{// 检查是否有IPA FTF(Frame Transfer Finish)中断标志被置位if(RESET != ipa_interrupt_flag_get(IPA_INT_FLAG_FTF)){// 如果IPA 控制寄存器中启用了FTF中断(Frame Transfer Finish Interrupt Enable)if(0U != (IPA_CTL & IPA_CTL_FTFIE)){// 关闭FTF中断使能,防止中断重入问题IPA_CTL &= (uint32_t)(~IPA_CTL_FTFIE);// 清除FTF中断标志位,以便能够检测下一个FTF事件ipa_interrupt_flag_clear(IPA_INT_FLAG_FTF);// 如果全局的g_ipa_flag标志位被设定,说明正在等待处理某些操作if(1U == g_ipa_flag){// 将g_ipa_flag标志位清零,表示当前的操作已完成g_ipa_flag = 0U;/* 重要!!!* 通知图形库刷新操作已经完成,可以进行下一个渲染周期。* lv_disp_flush_ready是一个在图形库中定义的函数,它的调用* 通知图形库当前的绘制操作已经完成,图形库可以对显示进行更新* 或者处理其他图形任务。*/lv_disp_flush_ready(g_disp_drv);}}}
}#endif

这篇关于【兆易创新GD32H759I-EVAL开发板】 移植LVGL的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/994141

相关文章

创新、引领、发展——SAMPE中国2024年会在京盛大开幕

绿树阴浓夏日长,在这个色彩缤纷的季节,SAMPE中国2024年会暨第十九届国际先进复合材料制品原材料、工装及工程应用展览会在中国国际展览中心(北京朝阳馆)隆重开幕。新老朋友共聚一堂,把酒话桑麻。 为期4天的国际学术会议以“先进复合材料,引领产业创新与可持续化发展”为主题,设立了34个主题分会场,其中包括了可持续化会场、国际大学生会场、中法复合材料制造技术峰会三个国际会场和女科技工作者委员会沙龙,

LVGL快速入门笔记

目录 一、基础知识 1. 基础对象(lv_obj) 2. 基础对象的大小(size) 3. 基础对象的位置(position) 3.1 直接设置方式 3.2 参照父对象对齐 3.3 获取位置 4. 基础对象的盒子模型(border-box) 5. 基础对象的样式(styles) 5.1 样式的状态和部分 5.1.1 对象可以处于以下状态States的组合: 5.1.2 对象

lvgl_micropython development for esp32

​​​​​​上一篇博客已经编译源码生成了ESP32C3的固件lvgl_micropy_ESP32_GENERIC_C3-4.bin,这篇博客开发一个界面。 一、开发环境 1、安装开发工具 Windows安装Thonny工具,官网链接:Thonny, Python IDE for beginners。 参考博客:用MicroPython开发ESP32- 用Thonny写程序_esp32用什么

移植对话框MFC

VC版 MFC程序对话框资源移植 以下均拷贝自上面,仅用来记录 (部分有删除) 法1: Eg:将B工程调试好的对话框移植到A工程中 1.资源移植         1.1  在2017打开B工程,在工作区Resource标签页中选中Dialog文件夹下的资源文件,按Ctrl+C或点击Edit->Copy.         1.2. 关闭当前工程,注意不要关闭VC6,打开B工程(File

2024老年护理新前沿:养老实训室的创新应用

随着人口老龄化的加速,如何为老年人提供优质的养老服务已成为社会关注的重点。在这一背景下,养老实训室应运而生,成为培养专业养老人才、改善老年人生活质量的新兴平台。与传统的课堂教学相比,养老实训室能够为学员提供更为生动、贴近实际的培训体验,为老年护理事业注入创新动力。 一、养老实训室的功能优势 模拟真实环境,提升操作技能 养老实训室通过还原老年人的居住环境,如卧室、浴室等,让学员能实际操作各种日

基于imx6ull开发板 移植opencv4.7.0

一、概述 本章节是针对opencv-4.7.0移植到Linux系统,运行在正点原子-I.MX6U ALPHA开发板 上,详细的移植流程如下。 二、环境要求 2.1 硬件环境 正点原子-I.MX6U ALPHA开发板虚拟机:VMware 2.2 软件环境 Ubuntu系统要求:20.04opencv版本: 4.7.0opencv贡献软件版本:4.x交叉工具链版本:gcc-linaro-6

【华东南AWDP】第十七届全国大学生信息安全竞赛 CISCN 2024 创新实践能力赛区域赛 部分题解WP

前言:这次区域赛AWDP安恒作为支持,赛制风格遵循安恒,一小时check一次。室温35°在室内坐了8小时,午饭是藿香正气水拌冰水。这场总体下来中规中矩吧。 WEB-welcome-BREAK Ctrl+U拿到flag WEB-submit-BREAK 文件上传,简单绕过 绕过就两个,一个MIMA头,一个等号换php(短标签) WEB-submit-FIX 修两个点,一个是

conda环境的备份和移植

备份和移植 Conda 环境可以通过以下步骤实现: 克隆环境 conda create --name backup_myenv --clone myenv# 删除原环境# conda remove --name myenv --all 移植 Conda 环境 方法1:使用 environment.yml 文件移植环境 # 导出环境的依赖项conda env export --na

【GD32】从零开始学兆易创新32位微处理器——RTC实时时钟+日历例程

1 简介 RTC实时时钟顾名思义作用和墙上挂的时钟差不多,都是用于记录时间和日历,同时也有闹钟的功能。从硬件实现上来说,其实它就是一个特殊的计时器,它内部有一个32位的寄存器用于计时。RTC在低功耗应用中可以说相当重要,因为在使用外部低速晶振的条件下,它在所有的低功耗模式下都可以工作,这使得RTC很适合实现芯片的低功耗唤醒。下面是RTC的框图。 咋一看RTC的内部还挺复杂的。 2 硬件时

数据资产与云计算深度融合:借助云计算技术,优化数据存储、高效处理并创新应用,驱动企业数字化转型

目录 一、引言 二、数据资产与云计算深度融合的必要性 1、数据资产的重要性 2、云计算技术的优势 三、云计算技术在数据资产管理中的应用 1、数据存储的优化 2、数据处理的高效性 3、数据应用的创新 四、云计算驱动企业数字化转型的实践案例 案例一:金融行业的数据分析平台 案例二:零售行业的智能供应链系统 五、结论与展望 一、引言 随着信息技术的飞速发展,数据已成为