由比赛入坑龙芯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);//创建按钮1
lv_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);//创建按钮2
lv_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。文章来源:https://www.toymoban.com/news/detail-481889.html
//-------------------------------------------------------------------------------------------------
// 定期调用
//-------------------------------------------------------------------------------------------------
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横屏,龙芯只自带了竖屏触摸驱动,获取触点坐标与实际不符合,还需修改。(自己修改触摸驱动即可)文章来源地址https://www.toymoban.com/news/detail-481889.html
到了这里,关于龙芯1b(LS1B200)使用LVGL7.0.1组件的初次体验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!