龙芯1b(LS1B200)使用LVGL7.0.1组件的初次体验

news/2024/11/17 0:44:54/

由比赛入坑龙芯1b(LS1B200),需要对板上驱动进行开发,使用LVGL库来做UI界面控制驱动。

网上资料难以查找,在本文中记录学习。

实现效果:

使用LVGL库的基本步骤:

1.硬件和需求设置LV_COLOR_DEPTH,LV_HOR_RES_MAX,LV_VER_RES_MAX等宏。

2.根据你的显示器和输入设备,选择或编写相应的驱动程序,并在你的项目中包含它们。

3.在你的项目中初始化lvgl库,并定期调用lv_task_handler()和lv_tick_inc()函数。

4.使用lvgl提供的各种控件和样式,创建你的用户界面,并设置事件回调函数和动画效果。

LVGL库需要设置好屏幕的分辨率,我使用的是4.3寸LCD横屏的触摸屏(龙芯驱动库只有竖屏,还需要修改驱动)

打开 Embedded IDE for Loongson - 龙芯嵌入式开发环境软件

文件 -> 新建项目向导

在创建项目时,main会自动帮我们调用install_3th_libraries 函数。

该函数会帮我们做好初始化LVGL库和LCD屏幕等驱动。我们只需要要在bsp.h文件中定义宏即可使用。

1.配置文件

打开bsp.h文件定义宏

选择触摸屏驱动,注释XPT2046驱动,定义GT1151驱动

2.修改分辨率大小

文件:main.c

文件:lv_conf.h

3.代码编写

绘制UI测试

#include "./lvgl-7.0.1/lvgl.h"/* Declare an event handler function for the button */
static void event_handler(lv_obj_t * obj, lv_event_t event)
{if(event == LV_EVENT_CLICKED){printf("Clicked\n");}else if(event == LV_EVENT_VALUE_CHANGED){printf("Toggled\n");}}/* Initialize the button */
void init_button(void)
{lv_obj_t * label;lv_obj_t * win = lv_win_create(lv_scr_act(), NULL);//创建一个窗口lv_obj_t * btn1 = lv_btn_create(win, NULL);//创建按钮1lv_obj_set_event_cb(btn1, event_handler);lv_obj_align(btn1, NULL, LV_ALIGN_CENTER, 0, -40);label = lv_label_create(btn1, NULL);//创建标签1 (按钮上的文字)lv_label_set_text(label, "Button1");lv_obj_t * btn2 = lv_btn_create(win, NULL);//创建按钮2lv_obj_set_event_cb(btn2, event_handler);lv_obj_align(btn2, NULL, LV_ALIGN_CENTER, 0, 40);label = lv_label_create(btn2, NULL);//创建标签1 (按钮上的文字)lv_label_set_text(label, "Button2");lv_btn_set_checkable(btn2, true);lv_btn_toggle(btn2);lv_btn_set_fit2(btn2, LV_FIT_NONE, LV_FIT_TIGHT);}

需要定期调用lv_tick_inc();和lv_task_handler(); LVGL才能正常运行

4.lv_tick_inc 和lv_task_handler函数介绍与调用

lv_task_handler函数

lv_task_handler 函数是 LVGL 的一个任务处理器函数,它用于处理 LVGL 的内部任务,如动画、事件、刷新等。你需要定期调用 lv_task_handler () 函数,可以在以下几种方式中选择一种:

- 在 main 函数中的 while (1) 循环中调用

- 在定时中断中调用 (优先级低于 lv_tick_inc ())

- 在操作系统的任务中调用

调用的周期不需要很严格,但是应该保持在大约 5 毫秒左右,

lv_tick_inc 函数

lv_tick_inc是 LVGL 的一个心跳函数,它用于告诉 LVGL 时间的流逝,从而实现动画和事件的处理。你需要定期调用 lv_tick_inc (tick_period) 函数,并以毫秒为单位告知调用周期。

例如, lv_tick_inc (1) 用于每毫秒调用一次。为了精确地知道经过的毫秒数。

lv_tick_inc 应该在比 lv_task_handler () 更高优先级的例程中被调用 (例如在中断中),即使 lv_task_handler 的执行花费较长时间。

使用 FreeRTOS 时,可以在 vApplicationTickHook 中调用 lv_tick_inc。

//-------------------------------------------------------------------------------------------------
//  定期调用 
//-------------------------------------------------------------------------------------------------
void vApplicationTickHook() {/*告诉lvgl已经过去了1毫秒在freeRTOS中 我们需要配置FreeRTOSConfig.h配置宏configUSE_TICK_HOOK 1然后定义void vApplicationTickHook()函数并调用lv_tick_inc(freeRTOS的tick是1ms);*/lv_tick_inc(1);
}static void gui_task(void *arg)
{unsigned int tickcount;for ( ; ; ){lv_task_handler();//必须调用,否则LVGL将无法正常使用vTaskDelay(5);}
}int main(void)
{ls1x_drv_init();                    /* Initialize device drivers */install_3th_libraries();              /* Install 3th libraies */init_button();xTaskCreate(gui_task,"guiTask",(2*1024),    NULL,20,          &gui_task);//创建UI线程 /** Start the tasks running.*/vTaskStartScheduler();/* If all is well we will never reach here as the scheduler will now be* running.  If we do reach here then it is likely that there was insufficient* heap available for the idle task to be created.*/for ( ; ; ){;}return 0;
}

注:由于使用的是4.3LCD横屏,龙芯只自带了竖屏触摸驱动,获取触点坐标与实际不符合,还需修改。(自己修改触摸驱动即可)


http://www.ppmy.cn/news/146742.html

相关文章

HTML5+CSS大作业——简约个性高逼格博客(5页) web网页制作期末大作业模板

HTML5CSS大作业——简约个性高逼格博客(5页) web网页制作期末大作业模板 常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 明星、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 军事、 游戏、 节…

叉车AGV小车调度系统介绍

我们AGV小车调度系统的系统名称为鹰眼系统,系统界面如下: 叉车AGV小车调度系统 智能叉车AGV小车调度系统主界面功能区可分为五块区域: 1是工具栏功能区域,用于功能参数设置 2是车辆功能管理区域,用于管理车辆和查看…

利用SVG的path元素中的A命令绘制圆形

## 利用SVG的path元素中的A命令绘制圆形 <path d"M cx, cym -r, 0a r,r 0 1,0 (r * 2),0a r,r 0 1,0 -(r * 2),0"/>或者<path d"M cx - r, cya r,r 0 1,0 (r * 2),0a r,r 0 1,0 -(r * 2),0"/> cx,cy开始坐标&#xff0c;r圆弧半径&#xff1b;…

WPF:Path详解,包括直线(LineSegment)弧线(ArcSegment)贝塞尔曲线(BezierSegment)

使用Path作图&#xff0c;有两种方法设置Path.Data&#xff1a; 使用PathGeometry对象 如&#xff1a;画的是一个带箭头边框。Path.Data由一系列的Segment组合而成。 <Path Stroke"Red"><Path.Data><PathGeometry><PathFigure StartPoint&quo…

TensorFlow 删除 YAML 支持,建议 JSON 作为替补方案!

TensorFlow&#xff0c;作为一个主流的开源 Python 库&#xff0c;最初由 Google 开发用于机器学习领域&#xff0c;逐渐成为 GitHub 顶级开源 TOP 10 项目之一。 近日&#xff0c;Google TensorFlow 项目团队宣布了一项重大的改变&#xff0c;由于存在一个关键代码执行漏洞&a…

svg画半圆详解(L指令、M指令、A指令)

svg画半圆 了解画半圆的各个指令L指令M指令A指令画整半圆 推荐&#xff1a;svg画整圆详解推荐&#xff1a;svg的text标签字体、颜色、样式、大小、居中详解 接到需求&#xff0c;要求做出一个这样的活动转盘&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c;所有文…

倍福---通过EL6070授权流程

TwinCAT 3.1提供了通过EtherCAT终端EL6070管理TwinCAT软件许可证的选项。EL6070包含模块化EtherCAT I/O系统中的硬件许可证密钥。本文介绍基于EL6070模块做授权的操作流程。 操作流程 1.1. EL6070模块介绍 1.1.1. 外观 TwinCAT 3.1提供了通过EtherCAT终端EL6070管理TwinCAT软件…

使用HbuilderX3.8.3_把开发的小程序发布为Html5页面上传到_免费托管空间---uniapp_小程序开发工作笔记009

首先使用hbuider开发完程序,然后,再去,点击发型,然后选择 上传网站到服务器,然后选择 选择新建,然后点击 新建以后然后这里点击新建服务空间,然后再去 这里选择免费服务空间,然后 然后点击立即购买,然后 点