龙芯+RT-Thread+LVGL实战笔记(1)——从移植开始

2023-11-13

        过去的大半年时间,一直带着学生备战全国职业院校技能大赛“嵌入式系统应用开发”赛项。由于是首次参加该赛项,很多东西都是从0到1的摸索和积累,最后的成绩自然也不甚理想。作为指导教师,备赛期间除了给予学生必要的指导,自己也花了不少精力研究了大赛指定的龙芯1B200嵌入式开发板,并尝试使用RT-Thread操作系统LVGL图形组件,实现了样题的几十项任务,大大小小的版本也写了30多个,也算磕出点名堂了,见图1~图3。

图1  带两级任务按钮菜单和部分功能(密码锁)的效果

图2  自己编写的不同功能的版本(V1.0~V7.6)

图3  自己编写的工程文件(约8000行)

        本着分享和开源精神,也为了给以后的参赛学生循序渐进的指导,于是就有了这个实战笔记系列。希望自己摸索的过程能给更多的嵌入式学习者一些指引,也为国产嵌入式处理器和国产嵌入式操作系统的推广助一点力。

        由于个人能力和精力的限制,再加上龙芯嵌入式的开发资料十分有限,很多问题没法像STM32那样深入到库文件和寄存器的程度,还希望有见解的网友在这些问题上能给与点评和分享。最后,我想说的是,这个实战笔记不是面向0基础的朋友,起码得有龙芯嵌入式裸机的开发经验,了解RT-Thread操作系统的线程、定时器、信号量、邮箱等相关知识,知道LVGL图形用户界面开发的基本套路。

        好了,开场白说完了,本文是实战笔记的第一篇,我们把最基本的文件和代码添加到工程项目中,形成一个最原始的工程项目。


一、关于IDE和工具链的版本

        如图4和图5所示,本人使用的IDE版本是目前官网(http://www.loongide.com)最新的1.2 beta3,工具链用的是GCC 4.9.2 for MIPS ELF,并选择了-O1级别的编译优化(这样运行的UI效果明显比不优化的要流畅的多)。至于低版本的IDE或其他工具链,学生在调试的时候多少会有点莫名其妙的问题,所以建议网友们尽量使用与笔者一致的版本,避免除代码之外的软件问题。

图4  本人使用的IDE和工具链版本

图5  龙芯IDE官网的下载页面

二、创建最初的项目

这一步没啥技术含量,按照新建项目的向导,一步步选择最匹配和最需要的即可,这里把向导的每一步进行了截图(图6~图9),大家跟着选就行了。

图6  确定工程目录和工程名称

图7  选择处理器型号、工具链版本和操作系统类型

图8  选择所需的LVGL组件

图9  保留默认的添加框架源代码

三、触摸屏驱动的移植和配置

        由于后续所有任务的交互都是依赖触摸屏来完成,因此移植触摸屏的驱动就成了当务之急。而且,移植不是简单的把驱动文件加进工程,还要与LVGL输入和输出设备的相关代码结合起来。下面就是我个人摸索的移植过程,供各位借鉴和参考。

3.1 准备横版屏幕的触摸输入驱动文件

        其实,上面刚创建好的工程已经包含了屏幕的显示输出驱动文件 ls1x_fb.c 和 ls1x_fb.h(所在目录如图10所示),以及触摸输入驱动文件 gt1151.c 和 gt1151.h(所在目录如图11所示)。但这里有个很纠结的问题就是,前者的显示输出驱动文件是针对横版屏幕(800×480)编写的,而后者的触摸输入驱动文件是针对竖版屏幕(480×800)编写的。因此,必须想办法让两者对屏幕采取一致的驱动方式。

图10  显示输出驱动文件所在的目录

图11  触摸输入驱动文件所在的目录

        好在龙芯官方已经写好了针对横版的触摸输入驱动文件 gt1151q.c 和 gt1151q.h,放在了开发板的配套例程 10_LCD_touch 中(如图12所示),那接下来我们就用这两个文件去替换工程里原有的 gt1151.c 和 gt1151.h

图12  配套例程里的横版触摸输入驱动文件

3.2 替换竖版的触摸输入驱动文件

        这一步也很简单,把工程里原有的触摸输入驱动文件删除,拷入新的文件,并将其添加进当前工程即可,如图13~图15所示。

图13  替换为gt1151q.c文件

图14  替换为gt1151q.h文件

图15  把新的驱动文件加入工程

3.3 补充头文件路径

        这一点跟 Keil 一个套路,必须把所有头文件所在的路径都添加进来,按照当前的工程目录,图16所示的几个路径是需要手动添加的,如果你自己还规划了其他目录放头文件,也请一并加进来。

图16  补充的头文件路径

3.4 修改LVGL的输入设备驱动文件

        我们心里要清楚,所有的GUI效果都是通过LVGL的图形化组件来实现的,无论是显示输出还是触摸输入,就必须让LVGL知道该调用哪个对应的设备驱动。在这里,显示输出应该调用 ls1x_fb.c 驱动文件,打开LVGL显示输出的驱动文件
./lvgl-7.0.1/porting/lv_port_disp.c(如图17所示),可以看到该文件引用的正是所需的硬件驱动文件,因此 lv_port_disp.c 文件不必修改。

图17  lv_port_disp.c文件及其调用的显示驱动

        

        再来看LVGL输入的驱动文件
./lvgl-7.0.1/porting/lv_port_indev.c(如图18所示),很明显并没有调用所需的 gt1151q.c 触摸输入驱动,因此要对 lv_port_indev.c 文件进行必要的修改才行。一共有6处需要修改,如图19~图24所示。为了清晰展示修改前后的代码差异,这里使用了 Notepad++ 编辑器中的 Compare 插件来对比,怎么样,挺好用的把^_^

图18  lv_port_indev.c文件及其调用的输入驱动

图19  修改头文件

图20  删除不需要的函数声明和全局变量(不删也行,但用不上)

图21  删除不需要的代码(不删也行,但用不上)

图22  删除无关的初始化函数

图23  修改调用的触摸扫描函数

图24  删除不需要的函数定义(不删也行,但用不上)

四、修改龙芯开发板的板级支持(BSP)文件

        配置龙芯开发板BSP的文件有两个:一个是 ./include/bsp.h 文件,如图25所示,这个文件里的很多宏需要根据实际情况进行配置,后续时常要与之打交道;另一个是
./ls1x-drv/ls1x_drv_init.c 文件,如图26所示,这个文件修改的地方不多。

图25  bsp.h文件

图26  ls1x_drv_init.c文件

4.1 修改 bsp.h 文件

        当前对该文件的修改一共有两处,如图27和图28所示,跟之前一样,还是把修改前后的差异对比着看。这两处修改针对的是触摸屏驱动芯片GT1151,以及所占用的I2C0总线。

图27  修改触摸屏驱动总线

图28  修改触摸屏对应的驱动芯片

4.2 修改 ls1x_drv_init.c 文件

        这个文件目前只有2处需要修改,如图29和图30所示,换成横屏对应的驱动文件和初始化函数即可。

图29 修改为横屏驱动文件

图30  修改为横屏初始化

五、修改LVGL的全局配置

        ./lvgl-7.0.1/lv_conf.h 是LVGL的全局配置文件,如图31所示。这里,我们针对屏幕分辨率、字体大小、中文支持等进行了修改,如图32~图36所示。

图31  lv_conf.h文件

图32 修改屏幕水平和垂直分辨率

图33  修改字号

图34  修改中文字体样式和字号

图35  修改主题主色调(非必须)

图36  补充24号中文字体的配置

六、编译和测试

        本文的主要目的是搞定与移植有关的配置,并不打算编写实质性的代码。通过上面的步骤,移植工作几乎全部完成,接下来就可以直接编译整个工程来进行检验了。这里就不贴main.c的源码了,除了修改一下显示模式,如图37所示,其他源码都保留不变。由于工程文件较多,第一次编译耗费的时间会比较长。

图37  修改main.c中的显示模式

        编译没错的话就可以运行或下载本程序了,效果上就是一个线程在运行,每0.5s通过串口打印一下运行时间,如图38所示。至于GUI效果,默认的源码里并没有添加,所以屏幕上什么也没有,我们在下一版来添加。

图38  初步移植后的串口打印效果

        至此,移植的工作就算告一段落了,虽然工作量不大,但网上并没有针对龙芯的移植教程,几乎都是针对STM32的,移植的大多也是LVGL8,所以上面的移植经验也是反复折腾总结出来的。大家在移植的时候有什么问题,欢迎在评论区留言。后续我们就可以在此基础上添加一个个我们想要的效果了。

(本文完)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

龙芯+RT-Thread+LVGL实战笔记(1)——从移植开始 的相关文章

  • 基础知识汇总(python)

    1 注释 单行注释 多行注释 2 换行 total applePrice orangePrice milkPrice 3 变量 111 赋值给了 a a 111 变量名规则 字母 数字 下划线组成 数字不可以开头 不能关键字重用 变量名必须
  • 腾讯云分布式数据库可用性系统实践

    欢迎大家前往腾讯云社区 获取更多腾讯海量技术实践干货哦 在分布式环境当中 总是会遇到诸如 主机宕机 或 网络故障 等各种影响系统可用性的情况发生 轻则会导致投诉 重则导致企业核心数据的丢失 影响企业业绩和商誉 而如何确保分布式系统运行正常

随机推荐

  • 【自用】微信小程序体验版无法加载数据、无法调用接口

    一 原因 没有打开微信小程序调试模式 二 解决办法 1 进入小程序 点击右上角的3个点儿 2 点击右下角开发调试 3 点击 打开调试 4 点击 前往体验版 重新进行测试 5 问题解决 右下角出现角标 重新进行测试吧
  • QT 中信号与槽connect 放在哪个位置

    在使用QT 的时候 就一直犯嘀咕 两个对象之间使用信号与槽链接的时候 应该把connect 放在哪个位置呢 对象 A 对象 B两个对象 把connect 放在A 对象里还是放在B 对象里呢 在一次项目里面我突然自己领悟了一个方式 C 对象调
  • 大数据——Hive基础

    Hive基础 什么是Hive Hive的优势和特点 Hive的发展里程碑和主流版本 Hive与MapReduce Hive的基本架构 Hive元数据管理 Hive体系架构 Hive操作 Hive Interface 命令窗口模式 1 Hiv
  • 鹤舞云天服务器稳定,《御剑红尘》手游新服“鹤舞云天”即将开启!

    亲爱的少主们 一念入微梦 月下与君酌 桃漫枝满头 缘聚玄天处 伴随着飘渺的莺莺婉歌 让我们一同走进清梦星河的梦境深处 御剑红尘 手游计划于12月19日10 00开启全新一组服务器 鹤舞云天 吹笙玄鹤舞 长望碧云天 届时欢迎各位探险家前来进驻
  • C++复习第二天:类与对象

    1 什么是面向过程 什么是面向对象 C语言是面向过程的 关注的是过程 分析出解题过程的步骤 调用函数来实现 C 是基于面向对象的 关注的是对象 将一件事物划分成不同的对象 通过不同对象之间相互交互完成 2 面向对象的三大特性 面向对象的三大
  • Unity3D开发环境安装(windows系统)

    1 首先先下载软件包 http pan baidu com s 1imYVv 4 2版本 2 下载完后 解压会看到两个文件 运行第二个安装包 3 准备安装 这里直接上图了 这里全选 里面包括运行媒体之类的 这里自己选择安装目录 如果你C盘空
  • 第三章内存管理

    1 内存的基础知识 内存可存放数据 程序执行前需要先放到内存中才能被CPU处理 缓和CPU与硬盘之间的速度矛盾 指令中的地址参数直接给出了变量x的实际存放地址 物理地址 1 绝对装入 绝对装入 在编译时 如果知道程序将放到内存中的哪个位置
  • 5G应用场景300例 附下载地址

    为加快5G在重点产业领域的推广应用 推动我省5G产业发展 我厅会同山东联通 山东移动 山东电信在全国范围内筛选了解决方案 编制了 5G应用场景300例 关注公众号 互联互通社区 回复 5G应用场景300例 获取全部内容 5G移动通信技术基本
  • 运行python脚本时传入参数的几种方式(接收外部参数)

    运行python脚本时传入参数时三种格式对应不同的参数解析方式 分别为sys argv argparse tf app run 前两者是python自带的功能 后者是tensorflow提供的便捷方式 1 sys argv sys模块是很常
  • Q_UNUSED()函数的作用

    Q UNUSED 函数在程序中的作用 就如它所代表的英文一样 unused 即无用的意思 即Q UNUSED 函数在程序中没有实质性的作用 用来避免编译器警告 下面我们来看一组程序 void ColorItem paint QPainter
  • Flutter 环境配置

    Flutter 环境配置 电脑上面安装配置JDK 1 下载安装JDK 下载地址 https www oracle com technetwork java javase downloads jdk8 downloads 2133151 ht
  • 刚拿到esp32-cam想测试该怎么办?看这篇文章就可以了

    无意间对esp32 cam感兴趣 就去某pdd买了一个模块玩玩 组装摄像头的时候不要硬插进去 有个活动卡槽可以扣开 如下图 接下来去arduino官网或者中文社区下载 arduino官网 https www arduino cc en so
  • LeetCode题目笔记——206. 反转链表

    文章目录 题目描述 题目难度 简单 方法一 顺序遍历 C 代码 Python代码 方法二 递归 代码 题目描述 题目难度 简单 方法一 顺序遍历 我们只需顺序遍历一次列表 在原地将它们的指向依次逆转 需要注意的是 当链表本身为空的时候我们直
  • python数据分析-超市客流量高峰期分析--调用matplotlib折线图

    python数据分析 超市客流量高峰期分析 调用matplotlib折线图 数据处理 有一份超市订单csv格式数据源导入后如下 导入需要使用的模块 import pandas as pd import matplotlib pyplot a
  • 6个 Python 办公黑科技,工作效率提升100倍!(附代码)

    下班晚 加班久感觉已经成为现代打工人的通病 每天将大部分时间浪费在一些机械 重复的工作上 如何提升你自己的工作效率才是关键 今天给大家分享6个 Python 办公小技巧 让你的工作效率倍增 欢迎大家学习收藏 喜欢点赞支持 废话不说 让我们开
  • 微信小程序遇到的坑系列---小程序上传图片线上失败

    微信小程序中 上传图片的代码如下 实现功能 1 上传图片到七牛云 2 上传成功后 对于返回的路径展示到页面 3 将返回的路径发送给后端 对于第一个需求 1 上传图片到七牛云 我们需要在七牛云上有一个账号去存自己的图片 于是不能忽略的一步 就
  • 【业务功能篇49】Springboot+EasyPoi 实现Excel 带图片列的导入导出

    SpringBoot整合EasyPoi实现Excel的导入和导出 带图片 51CTO博客 springboot easypoi导出excel
  • JDBC Utils 详解(通俗易懂)

    目录 一 前言 二 JDBCUtils说明 1 背景及起因 2 示意图 3 JDBCUtils类的定义 三 JDBCUtils应用 1 DML的应用 2 DQL的应用 四 总结 一 前言 第三节内容 up主要和大家分享一下JDBC Util
  • 输入权重和偏置的范围问题?

    对于张的单输入单输出的非线性函数 用黄的程序 隐层神经元的个数并没有太大的影响 而输入权重和偏置的范围有很大的影响 隐层神经元数50 InputWeight rand NumberofHiddenNeurons NumberofInputN
  • 龙芯+RT-Thread+LVGL实战笔记(1)——从移植开始

    过去的大半年时间 一直带着学生备战全国职业院校技能大赛 嵌入式系统应用开发 赛项 由于是首次参加该赛项 很多东西都是从0到1的摸索和积累 最后的成绩自然也不甚理想 作为指导教师 备赛期间除了给予学生必要的指导 自己也花了不少精力研究了大赛指