使用RT-Thread studio 把LVGL移植到RT-Thread 上
使用RT-Thread studio 移植 LVGL到RT-Thread中
其实RT-Thread 移植LVGL 官方已经出来很多教程,但是但是他出的教程都是基于一些他们适配的BSP,但是其他不适配的怎么办呢? 当然是手搓了。
前期准备
1 在本次移植前,你必须要有在RT-Thread studio中你屏幕的显示和触摸驱动。
这个简单拉,直接把正点原子的代码移植一下就好拉。
2.你最好还是先在裸机上移植一次,这个可以跟着正点原子litleVGL(LVGL旧版本名称 要
用 这个搜索视频才能搜索的到)视频教程移植一次,这样你移植就会块很多,但是不弄也行。
捞的话就不说了,开始
在移植好屏幕驱动的的工程中,添加LVGL包
编译一下(会把软件包添加进来) ,这里编译肯定是有错误的,因为我们还有几个文件没有添加进去。添加文件,首先我们是要有这些文件。
找到我们studio安装目录下 ,添加包工程下的下面4个文件
直接复制这4个文件,在studio中,选择applications 粘贴,顺便把名字改一下,必须改这样LVGL才能调用。把每个文件后面的_template去掉,
1.点开 lv_port_disp.c 修改 ,修改这三处
接下来的三个也修改一下看图。
大家,体谅一下哈,没写几次博客,可能有些啰嗦,有些地方没表达清楚
接下来就是把我们自己的打点函数和LVGL对接拉
找到下面的函数,具体修改看我下面的注释
如果没错的话,你现在编译是不会出错了的。但是别急,还有些东西没弄
现在我们移植触摸接口,
由于我们只使用到触摸功能,LVGL还有一些按键功能什么鬼的,但是我们不用所以我们要修改
还有哈,还有哈。是有点麻烦,
我们需要添加一个 lv_conf.h 头文件,本来我们是直接要和前面一样使用他的工程模板的,但是那个改起来太麻烦了,所有我们就抄的别的工程的
//添加一个头文件名字别错了, 把这些复制进去
#ifndef LV_CONF_H
#define LV_CONF_H
#define LV_COLOR_16_SWAP 0
#define LV_COLOR_DEPTH 16
#define LV_USE_PERF_MONITOR 1
#include <rtconfig.h>
#define LV_HOR_RES_MAX 480 //你屏幕的高
#define LV_VER_RES_MAX 800 //你屏幕的宽
//我们要使能的demo 假如你要使能其他的可以去,packages文件夹下找到
//lv_conf_template.h 下找到对应的宏复制过来哈,就不详述拉
#define LV_USE_DEMO_RTT_MUSIC 1
#define LV_DEMO_RTT_MUSIC_AUTO_PLAY 1
#define LV_FONT_MONTSERRAT_12 1
#define LV_FONT_MONTSERRAT_16 1
#endif
==我们知道,操作系统中运行需要一个一个线程,LVGL好像也有一个任务调度的所以我们添加一个 lv_demo.c ==
//复制进去哈,假如你自己写的话,最好也看看这个模板,有些地方要注意
#include <rtthread.h>
#include <lvgl.h>
#include <lv_port_indev.h>
#define DBG_TAG "LVGL.demo"
#define DBG_LVL DBG_INFO
#include <rtdbg.h>
#include "MyApplication.h"
#ifndef LV_THREAD_STACK_SIZE
#define LV_THREAD_STACK_SIZE 4096
#endif
#ifndef LV_THREAD_PRIO
#define LV_THREAD_PRIO (RT_THREAD_PRIORITY_MAX*2/3)
#endif
static lv_obj_t * label;
static void slider_event_cb(lv_event_t * e)
{
lv_obj_t * slider = lv_event_get_target(e);
/*Refresh the text*/
lv_label_set_text_fmt(label, "%"LV_PRId32, lv_slider_get_value(slider));
lv_obj_align_to(label, slider, LV_ALIGN_OUT_TOP_MID, 0, -15); /*Align top of the slider*/
}
/**
* Create a slider and write its value on a label.
*/
void lv_example_get_started_3(void)
{
/*Create a slider in the center of the display*/
lv_obj_t * slider = lv_slider_create(lv_scr_act());
lv_obj_set_width(slider, 200); /*Set the width*/
lv_obj_center(slider); /*Align to the center of the parent (screen)*/
lv_obj_add_event_cb(slider, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL); /*Assign an event function*/
/*Create a label below the slider*/
label = lv_label_create(lv_scr_act());
lv_label_set_text(label, "0");
lv_obj_align_to(label, slider, LV_ALIGN_OUT_TOP_MID, 0, -15); /*Align top of the slider*/
}
static void lvgl_thread(void *parameter)
{
lv_example_get_started_3();
while(1)
{
lv_task_handler(); //必须要哈 LVGL任务调度
rt_thread_mdelay(5);
}
}
static int lvgl_demo_init(void)
{
MX_GPIO_Init();
MX_FSMC_Init();
LCD_Init(); //LCD初始化
tp_dev.init(); //触摸屏初始化
lv_init(); //LVGL 初始化
rt_thread_t tid;
tid = rt_thread_create("LVGL", lvgl_thread, RT_NULL, LV_THREAD_STACK_SIZE, LV_THREAD_PRIO, 0);
if(tid == RT_NULL)
{
LOG_E("Fail to create 'LVGL' thread");
}
rt_thread_startup(tid);
return 0;
}
INIT_APP_EXPORT(lvgl_demo_init);
最后,编译------报错 --吐了。
这个好像是LVGL和cubemx冲突了,找到cubemx把
void Error_Handler(void); 注释掉
编译-------下载,屏幕中出现一个可以滑动的进度条
恭喜你------
移植了一个星期,把所有踩过的坑都分享给大家,最后祝大家头发早日掉光!
更多推荐
所有评论(0)