【兆易创新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

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

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

相关文章

《Linux运维总结:基于银河麒麟V10+ARM64架构二进制部署elasticsearch7.17.21集群 + kibana(方案三)》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:Linux运维实战总结 一、背景 elasticsearch是一个分布式、实时、高性能的搜索和分析引擎,它广泛应用于企业级搜索、日志分析、实时数据处理等领域。随着elasticsearch的广泛应用,安全性变得越来越重…

ArcGI基本技巧-科研常用OLS, GWR, GTWR模型实现

ArcGI基本技巧-科研常用OLS, GWR, GTWR模型实现 OLS,GWR,GTWR回归模型均可以揭示解释变量对被解释变量的影响且可以进行预测。Ordinary Least Squares (OLS)是最小二乘法&#xff0c;Geographically Weighted Regression (GWR)是地理加权回归&#xff0c;Geographically and T…

Unity射击游戏开发教程:(18)添加弹药计数+补充弹药

添加简单的弹药计数 我将讨论如何向游戏中添加简单的弹药计数。这将包括在 HUD 中添加弹药计数器,当弹药达到 0 时,文本会将颜色更改为红色以提醒玩家。另外,当弹药数为0时,玩家将无法再射击。让我们深入了解吧! 在播放器脚本中我们需要添加一些变量。我们将创建两个公共整…

详细分析Python中的win32com(附Demo)

目录 前言1. 基本知识2. Excel3. Word 前言 对于自动化RPA比较火热&#xff0c;相应的库也比较多&#xff0c;此文分析win32com这个库&#xff0c;用于操作office 1. 基本知识 Win32com 是一个 Python 模块&#xff0c;是 pywin32 扩展的一部分&#xff0c;允许 Python 代码…

C语言如何删除表中指定位置的结点?

一、问题 如何删除链表中指定位置的结点&#xff1f; 二、解答 删除链表中指定的结点&#xff0c;就像是排好队的⼩朋友⼿牵着⼿&#xff0c;将其中⼀个⼩朋友从队伍中分出来&#xff0c;只需将这个⼩朋友的双⼿从两边松开。 删除结点有两种情况&#xff1a; &#xff08;1&am…

HTML静态网页成品作业(HTML+CSS)——我的家乡江永网页设计制作(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

mysql -- WITH RECURSIVE 语法

引言 在 SQL 中&#xff0c;WITH RECURSIVE 是一个用于创建递归查询的语句。它允许你定义一个 Common Table Expression (CTE)&#xff0c;该 CTE 可以引用自身的输出。递归 CTE 非常适合于查询具有层次结构或树状结构的数据&#xff0c;例如组织结构、文件系统或任何其他具有…

Pencils Protocol Season 2 收官在即,Season 3 携系列重磅权益来袭

此前Scroll生态LaunchPad &聚合收益平台Pencils Protocol&#xff08;原Penpad&#xff09;&#xff0c;推出了首个资产即其生态代币PDD的Launch&#xff0c;Season 2活动主要是用户通过质押ETH代币、组件战队等方式&#xff0c;来获得Point奖励&#xff0c;并以该Point为依…

2024 Google I/O大会:全方位解读最新AI技术和产品

引言&#xff1a; 2024年的Google I/O大会如期举行&#xff0c;作为技术圈的年度盛事之一&#xff0c;谷歌展示了其在人工智能领域的最新进展。本次大会尤其引人注目&#xff0c;因为它紧随着OpenAI昨天发布GPT-4o的脚步。让我们详细解析Google此次公布的各项新技术和产品&…

svn如何远程访问?

svn&#xff08;Subversion&#xff09;是一种版本控制系统&#xff0c;广泛应用于软件开发领域。它能够追踪文件和目录的变化&#xff0c;记录每个版本的修改内容&#xff0c;并允许多人协同开发。svn的远程访问功能允许开发人员可以在不同的地点访问和管理代码&#xff0c;提…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-15.7讲 GPIO中断实验-编写按键中断驱动

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

typescript -元组类型

元组类型 元组表示有限元素构成的有序列表。元组类型是数组类型的子类型。元组是长度固定的数组&#xff0c;元组总每个元素都有具体的类型 元组的定义 [T0, T1, T2,...,Tn] const point: [number,number] [0, 0]只读元组 使用readonly修饰符或者Readonly工具类型 readon…

分布式websocket实时通讯的session共享问题

目录 1.需求 2.前置条件和要求 3.方案分析 3.1.方案1&#xff1a;session共享存储到redis数据库 3.2.方案2&#xff1a;采用mongo生命周期的AbstractMongoEventListener 3.3.方案3&#xff1a;引入redis等MQ组件&#xff0c;发送广播消息 3.4.方案4&#xff1a;采用chan…

AI4Science

AI4Science 文章目录 AI4ScienceMicroSoft AI4Science其它 微软研究院刘铁岩&#xff1a;AI for Science&#xff0c;追求人类智能最光辉的一面&#xff5c;MEET2023 &#xff08;17min&#xff09; https://www.bilibili.com/video/BV1bs4y1W7rW/AI Forum 2023 | AI4Science: …

html使用<el-table-column />时不能正常渲染出页面

一、bug开始了 <el-table-column prop"date" label"Date" width"180"/>当使用上述代码进行html渲染时&#xff0c;发现没有正常渲染出想象中的视图&#xff0c;乱七八糟地。 二、bug解决 在IDE中报了如下警告&#xff1a; Empty tag do…

EasyCVR智慧校园建设中的关键技术:视频汇聚智能管理系统应用

一、引言 随着信息技术的迅猛发展&#xff0c;智慧校园作为教育信息化建设的重要组成部分&#xff0c;对于提升校园安全、教学效率和管理水平具有重要意义。本文旨在介绍智慧校园视频管理系统的架构设计&#xff0c;为构建高效、智能的校园视频监控系统提供参考。 二、系统整…

机器学习之sklearn基础教程(第三篇:模型选择和评估)

机器学习之sklearn基础教程&#xff08;第三篇&#xff1a;模型选择和评估&#xff09; 1. 模型选择 在机器学习任务中&#xff0c;选择合适的模型是非常重要的。不同的模型适用于不同的问题类型和数据特征。 在模型选择过程中&#xff0c;有几个常用的方法和原则&#xff1a;…

Vitis HLS 学习笔记--资源绑定-使用URAM(1)

目录 1. 简介 2. 代码分析 2.1 存储器代码 2.2 Implementation报告 2.3 存储器类型指定 2.4 存储器初始化 3. 总结 1. 简介 在博文《Vitis HLS 学习笔记--资源绑定-使用URAM-CSDN博客》中&#xff0c;介绍了如何在Vitis HLS环境下设计一个简易的存储器模型。 通过以下…

gin自定义验证器+中文翻译

gin自定义验证器中文翻译 1、说明2、global.go3、validator.go4、eg&#xff1a;main.go5、调用接口测试 1、说明 gin官网自定义验证器给的例子相对比较简单&#xff0c;主要是语法级别&#xff0c;便于入门学习&#xff0c;并且没有给出翻译相关的处理&#xff0c;因此在这里记…

红黑树底层封装map、set C++

目录 一、框架思考 三个问题 问题1的解决 问题2的解决&#xff1a; 问题3的解决&#xff1a; 二、泛型编程 1、仿函数的泛型编程 2、迭代器的泛型编程 3、typename&#xff1a; 4、/--重载 三、原码 红黑树 map set 一、框架思考 map和set都是使用红黑树底层&…