背景介绍
近几年,由于半导体行业的大力发展,配备图形界面的嵌入式设备已经越来越多的出现在我们的生活中。传统家电,比如洗衣机、微波炉,原始的机械按键都逐渐被显示触控按键替代;穿戴设备,配备显示屏的电子款手表手环,开始占据越来越大的市场份额;汽车领域,开始使用触控屏按键取代传统机械按键,lcd仪表盘也几乎将指针仪表盘淘汰。因此,能够进行界面显示、交互的微控制器也越来越受市场的青睐。
恩智浦i.mx rt系列mcu性能强大、主频高,并且其中部分mcu配备了图形处理外设,是绘制图形界面非常好的选择。
本文通过一个基于恩智浦推出的lvgl图形设计工具gui guider,和运行在i.mx rt1170上的图形界面工程,来介绍在i.mx rt系列mcu上进行图形界面的设计。
工程演示视频如下所示:
界面设计软件gui guider
gui guider是恩智浦为lvgl推出的一个gui软件设计工具,旨在让客户在使用恩智浦芯片开发lvgl图形界面工程时,能够更方便的设计出精美的界面。
打开工具,选择新建项目,接着可以选择你所用的lvgl版本以及你所用的mcu、显示屏、项目模板等。需要注意的是,本项目选用1280*720的显示屏(即landscape模式),在设备选择时注意不要选成720*1280。
图1. gui guider工程创建&屏幕选择
在界面基本创建好之后,gui guider工程如下图所示:
图2. 界面创建完成
本文只用gui guider做界面布局,界面的图标都用了贴图控件,并未选择工具中的其他功能控件。
如果想了解gui guider的用法以及各种控件的知识,可以翻阅本站前期的文章和nxp官方网站,在此不对gui guider做过多的介绍。
功能任务
在gui guider工程创建完成后,可以在对应的文件夹下找到创建好的工程文件(gui-guider-projectsxxxxgenerated),其中包含了在工具中绘制的界面文件、添加的事件文件及图片字体的存储文件等。
值得注意的是,当我们创建好界面工程,开始添加自己的逻辑功能代码时,需要放在’custom’文件夹中,如果放在了你工程的源文件中(gui-guider-projectsxxxxsdkcoresource),那么当你不小心进行了工程的更新之后,你所写的逻辑功能代码将会被覆盖,别问我是怎么知道的。。。
介绍完了在gui guider中创建工程的注意事项之后,开始介绍本文的功能任务。
1、lvgl任务 利用gui guider创建的lvgl工程,可以参考sdk中的“sdk_2_12_0_mimxrt1170-evkoardsevkmimxrt1170lvgl_exampleslvgl_guider”,两者具有相同的结构。 在前面的演示视频中,可以看到,本工程模拟一个汽车仪表盘,在开机以及行驶过程中的显示情景。本工程用于展示其显示功能并未展示gui的交互功能,绝大部分都是用了贴图来进行界面的填充,想要达到动画的效果,可以通过创建、删除图像控件或者对图像控件进行透明度设定来实现。 在lvgl中参考如下两种方法:
lv_obj_create(lv_obj_t * obj) //创建对象
lv_obj_del(lv_obj_t * obj) //删除对象,结合创建对象功能以实现动画效果;
lv_style_set_img_opa(lv_style_t * style, lv_opa_t value) //设置某个样式的透明度值
lv_obj_add_style(lv_obj_t * obj, lv_style_t * style, lv_style_selector_t selector) //给所选的图像添加透明度为0或者1的样式,以实现动画效果;
本工程所选用的方式为设置图像透明度。先利用gui guider工具将所需要的全部图像按照上下层顺序贴好,注意,一定要确定好放置的次序,否则在后续添加逻辑代码实现动画效果时会与预期效果不同。
比如界面中的右转向灯,在设置相应的位置后,在工具右侧‘attributes’栏下面,可以通过‘opacity’选项设置其初始透明度。
图3.设置对象透明度
在后续程序运行中,再通过逻辑函数修改各图像控件的透明度来达到动画的效果。
为了充分利用有限的存储空间,我们往往需要将代码进行最大化的“瘦身”。而在lvgl工程中,很重要的一点,就是将我们没有用到的模块裁剪掉。打开’ sdkcoresource’文件夹下的lv_conf.h文件,我们可以看到有许多开关宏,lvgl中的控件都通过这些开关宏来确定是否加入编译。这里我们将没有用到的控件,比如arc, bar, checkbox等都关闭其宏定义,这样可以减少编译的文件,从而给代码“瘦身”。
图4. 进行lvgl控件裁剪
2.rtc任务
在常见的汽车仪表盘中,都会有日期时间的显示。本工程中在界面绘制时也添加上了此模块。在上面视频演示中可以看到,在初始开机界面没有添加此部分,而后在表盘界面就添加上。我们需要做的是在gui guider布局界面时,在对应位置添加上对应格式的文本控件。
图5. 添加日期、时间对象
在界面布局完成后,添加我们的逻辑代码。首先进行rtc模块的初始化,通过宏设定初始的日期以及时间,添加时钟任务,并设定好每一秒钟进行计时的更新。再添加时间文本转换函数以及文本更新函数,就可以开始进行日期、时钟的显示。
但是,我总不能每次都通过修改宏来设定时间吧?别急,本工程还添加了运行中修改时间的功能。接着往下看。
3. shell命令任务
shell命令任务可以帮助在程序运行时候进行负载分析等功能。本工程中添加了通过shell命令设置时间的功能,现在就来以此功能为例,讲讲shell命令任务的添加。
首先添加一个shell_task线程,在此线程中,进行虚拟串口的配置,shell命令的添加等操作。在’settime’命令中,以“settime y/m/d/h/m/s”的格式进行日期及时间的设置,之后你所设置的文本将被传到rtc任务中设置时间的函数中,这样就达成了利用shell命令,通过usb口设置当前时间的功能。
图6. shell命令修改界面时间
为了配合shell命令任务,在时钟任务中,需要将更新时间函数分为手动更新和自动更新。手动更新时,shell任务中配置一个值,当时钟任务判定这个值为手动配置信号时,将shell任务中更新的日期时间值传到时钟任务中,完成时间修改操作;自动更新则是当时钟任务判定到非手动更新信号,则进行时间的自动更新,不过需要注意的是,当我们进行自动更新,调用更新函数时,需要在界面配置函数完成日期时间文本控件的创建之后,否则函数运行会出错,这里也通过一个来自lvgl任务中创建日期时间文本控件之后的值,来进行时间自动更新的操作。
if (g_timeupdated) { /* set rtc time to default time and date and start the rtc*/ snvs_hp_rtc_stoptimer(snvs); snvs_hp_rtc_setdatetime(snvs, &g_rtcdate); snvs_hp_rtc_starttimer(snvs); rtcdate = g_rtcdate; g_timeupdated = 0; } else { /* get date time */ snvs_hp_rtc_getdatetime(snvs, &rtcdate); if (s_time_initialized){ draw_date_time_update(); } }
总结
在创建图形界面工程的时候,我们可以先利用gui guider工具将所需要的界面布局设计好,对于各控件,可以在工具中修改其各项参数,但值得注意的是,工具中并未包含所有的参数,有些时候我们可以通过自己修改代码来进行界面的设置。之后将没有用到的模块裁剪掉,以减少代码的大小。
在界面创建完成之后,我们可以添加自己的逻辑代码,实现自己想要的效果。
本文以一个汽车仪表盘图形界面的工程为例,给出了其开发的过程以供参考。
如何制作18650电池充电器
基于采用指纹识别模块、微控制器为控制机构的指纹锁设计
出色的计算密集型系统开发平台-Xilinx全可编程器件
电机从变频转到工频,要注意哪些问题
并行超算云服务在多个地区开始试用
在i.MX RT平台上开发图形界面工程
传祺GS3终于要上市了!售价七万起,看到它都后悔买宝骏510
RA2L1驱动1.8寸LCD TFT步骤
异步电机混合模型转子磁链观测器学习
地震预警上怎样融合rfid技术
联想发布笔记本新品,高通8cx平台续航长达24小时
惊喜不意外不?1.5T版本在同级别家用车里177匹,思域两厢版欧洲NCAP仅得4星
基于Verilog FPGA 流水灯设计
中央计算架构升级、多款新品亮相,芯驰引领智能汽车新时代
针对涂胶,ABB机器人有专门的dispense软件
迪士尼研发VR/AR头显,可产生风感和气味
影响PCB阻抗的主要因素 PCB设计50欧姆阻抗控制的原因
还在迷信洋品牌?MAXHUB会议平板告诉你“中国心”更靠谱
半导体制造工艺之快速加热退火(RTA)系统
人工智能距离现代化目标还需要解决哪些问题