RTT下移植LVGL到W601_显示驱动移植

RTT下移植LVGL到W601_显示驱动移植

声明

个人学习笔记,不保证正确

效果展示

移植lvgl到w601

工程源码

工程源码

参考资料

https://blog.csdn.net/h451884098/article/details/119086173

http://www.openedv.com/docs/book-videos/zdyzshipin/4free/littleVGL.html

环境

win10

keil5

硬件

正点原子w601开发板

步骤流程

1.在06_driver_lcd基础上添加lvgl

添加软件包

更新软件包
 pkgs --update

生成keil工程
scons --target=mdk5

2.添加配置文件

添加配置文件

lvg提供了一个配置模板

将lv_conf_template.h复制到上级目录,并将文件名修改为lv_conf.h

使能配置文件

移植显示接口

1.lvgl官方提供了一个模板,复制文件,并修该为文件名为lv_port_disp

2.在工程中添加文件,并适配驱动

#include "lv_port_disp.h"
#include "lvgl.h"
#define MY_DISP_HOR_RES 240
static void disp_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p);

void lv_port_disp_init(void)
{
  static lv_disp_draw_buf_t draw_buf_dsc_1;
  static lv_color_t buf_1[MY_DISP_HOR_RES * 10];                             /*A buffer for 10 rows*/
  lv_disp_draw_buf_init(&draw_buf_dsc_1, buf_1, NULL, MY_DISP_HOR_RES * 10); /*Initialize the display buffer*/

  static lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/
  lv_disp_drv_init(&disp_drv);   /*Basic initialization*/

  disp_drv.hor_res = 240;
  disp_drv.ver_res = 240;
  disp_drv.flush_cb = disp_flush;
  disp_drv.draw_buf = &draw_buf_dsc_1;
  lv_disp_drv_register(&disp_drv);
}

#include <rtthread.h>
#include <drv_lcd.h>
static void disp_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p)
{
  int32_t x;
  int32_t y;
  uint8_t temp_data;
  const rt_uint8_t *start_addr = (const rt_uint8_t *)color_p;

  for (y = area->y1; y <= area->y2; y++)
  {
    for (x = area->x1; x <= area->x2; x++)
    {
      temp_data = color_p->full; //低八位
      color_p->full = (color_p->full >> 8) + (temp_data << 8);
      color_p++;
    }
  }
  lcd_show_image(area->x1, area->y1, area->x2 - area->x1 + 1, area->y2 - area->y1 + 1, start_addr);
  lv_disp_flush_ready(disp_drv);
}

3.添加初始化

/*
 * Copyright (c) 2006-2018, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2019-05-07     yangjie      first implementation
 */

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include <drv_lcd.h>
#include <rttlogo.h>

#define DBG_TAG "MIAN"
#define DBG_LVL DBG_LOG

#include <rtdbg.h>

static rt_thread_t lvgl_tid = RT_NULL;
static rt_timer_t lvgl_timer = RT_NULL;

#include "lv_port_disp.h"
#include "lv_obj.h"

void demo(void)
{
    lv_obj_t *label1 = lv_label_create(lv_scr_act());
    lv_label_set_long_mode(label1, LV_LABEL_LONG_WRAP); /*Break the long lines*/
    lv_label_set_recolor(label1, true);                 /*Enable re-coloring by commands in the text*/
    lv_label_set_text(label1, "#0000ff Re-color# #ff00ff words# #ff0000 of a# label, align the lines to the center "
                              "and wrap long text automatically.");
    lv_obj_set_width(label1, 150); /*Set smaller width to make the lines wrap*/
    lv_obj_set_style_text_align(label1, LV_TEXT_ALIGN_CENTER, 0);
    lv_obj_align(label1, LV_ALIGN_CENTER, 0, -40);

    lv_obj_t *label2 = lv_label_create(lv_scr_act());
    lv_label_set_long_mode(label2, LV_LABEL_LONG_SCROLL_CIRCULAR); /*Circular scroll*/
    lv_obj_set_width(label2, 150);
    lv_label_set_text(label2, "It is a circularly scrolling text. ");
    lv_obj_align(label2, LV_ALIGN_CENTER, 0, 40);
}
MSH_CMD_EXPORT(demo, demo);

static void lvgl_thread_entry(void *parameter)
{

    lv_init();
    lv_port_disp_init();
    demo();
    while (1)
    {
        lv_task_handler();
        rt_thread_mdelay(5); /* 官方手册是提议至少 5 ms */
    }
}

static void lvgl_timeout(void *parameter)
{
    lv_tick_inc(10); /* 因为一个时钟是 10ms */
}

int main(void)
{
    char ret;
    uint32_t tick;
    lcd_clear(WHITE);

    lvgl_tid = rt_thread_create("lvgl",
                                lvgl_thread_entry,
                                RT_NULL,
                                4096, /* stack size */
                                12,   /* priority */
                                5);   /* time slice */
    if (lvgl_tid != RT_NULL)
        rt_thread_startup(lvgl_tid);

    lvgl_timer = rt_timer_create("lvgl_timer",
                                 lvgl_timeout,
                                 RT_NULL,
                                 1, /* 超时时间,单位是时钟节拍 */
                                 RT_TIMER_FLAG_PERIODIC);
    if (lvgl_timer != RT_NULL)
        rt_timer_start(lvgl_timer);

    return 0;
}

踩坑记录

一开始驱动显示适配的是打点函数,导致刷新一个页面要二十几秒,在这基础上不停的优化,结果还是要十几秒,

被逼无奈开始认真看代码,突然发现回调其实就是画一片区域

	for (y = area->y1; y <= area->y2; y++)
	{
		for (x = area->x1; x <= area->x2; x++)
		{
			/*Put a pixel to the display. For example:*/
			/*put_px(x, y, *color_p)*/
			lcd_draw_point_color(x, y, color_p->full);
			color_p++;
		}
	}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【RT-Thread作品秀】基于 lvgl 的漏电保护装置校验仪 UI 界面设计作者:赵加文 概述低压漏电引起的各种安全事故已经严重影响到生产生活,威胁到生命财产安全。而解决这一现象的设备就是漏电保护开关,漏电保护开关的漏报率、误报率是很关键的参数,因此有必要对漏电保护开关的性能进行测试。因此,漏电保护装置校验仪是很有必要的。 开发环境硬件:ART-Pi 开发板,正点原子 480*272 4.3寸 RGB 屏幕 RT-Thread版本:4.0.3 开发工具及版本: RT-Thread Studio 2.0.0 :编写 编译 调试 下载代码 STM32CubeMX 6.1.0: codeBlocks 20.03:用于在 PC 机上进行 lvgl 模拟 MCU_Font V2.0: 用于转换中文,然后使得中文能够在 lvgl显示 RT-Thread使用情况概述在 UI 设计的整个过程中,使用到 RT-Thread 的部分主要有以下几个方面: 内核部分:动态线程,信号量 组件部分:PIN 设备、I2C 设备、TOUCH 设备框架、LCD 设备框架、finsh 组件 软件包部分:littlevgl2rtt、gt9147 硬件框架软件框架说明系统整体流程图: 软件模块说明整个UI 系统设计所遵循的是 lvgl 图形库的一个回调函数的机制,将各个事件与对应的操作所绑定起来,当滑动滑条时对应的滑条的回调函数就会被触发,那么就会执行滑条回调函数的内容,当滑动点击文本框时,文本框对应的回调函数就会被触发,进而创建键盘的控件,通过键盘输入所需要的数据。 演示效果图片展示: 演示视频: 比赛感悟这次参赛,之前还没有使用过 RT-Thread studio 这个集成开发环境,这次在使用 ART-Pi 的时候全程是使用 RT-Thread studio 这个开发环境,在使用的过程中也碰到了很多问题,有时候明明配置了相关组件,但是保存之后,并没有代码添加到工程里。现在也没有弄明白问题出在哪里,虽然存在着这里问题,但是在使用的过程中,还是非常的方便,整个开发过程就如同搭积木一样方便,与 RTT操作系统贴合的非常的紧密。 除此之外,便是在使用 lvgl 的过程中碰到了很多的问题,现在网上的教程基本是 lvgl v6 版本的教程,关于 lvgl v7 版本的教程很少,而且 v6版本与 V7 版本的 API 相差很大,不能按照 V6 版本来使用 V7 ,在这个过程中摸索了好多,同时也感受到了 lvgl 的魅力,使用在嵌入式系统上是非常不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值