RT-Thread ART-PI 学习笔记:轻量化GUI框架LVGL的使用和配置

本文档详细记录了在RT-Thread开发板ART-PI上配置和使用LVGL图形库的过程,包括初始化触摸屏、配置LVGL以及尝试通过DMA2D提高屏幕刷新率。作者在实践中遇到一些问题,如触摸屏适配不佳和启用DMA2D后的白屏现象,并计划后续完善解决方案。博客提供了相关参考资料和代码示例。
摘要由CSDN通过智能技术生成

前言

本文记录RT-Thread官方开发板ART-PI配置和使用LVGL图形库的过程

旨在以ART-PI学习LVGL,但是在配置的过程中遇到不少问题,ART-PI对LVGL的适配并没有TOUCHGFX那么好,还存在不少问题,其中一些还有待解决

以这篇博客作为记录配置和使用过程,之后有时间会完善这篇博客

参考资料

https://club.rt-thread.org/ask/article/2464.html

https://blog.csdn.net/weixin_37127273/article/details/110134225

https://www.jianshu.com/p/e01bf5b628bc

实验步骤

image-20210813111840289 image-20210813112836674

在这里插入图片描述

image-20210813114505991 image-20210813114524630 image-20210813114849205 image-20210813115623593 image-20210813120135440 image-20210813142506705 image-20210813142621201

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sw13Jwv6-1629166235105)(https://raw.githubusercontent.com/FranHawk/blogpic/main/image-20210813144052366.png)]

https://github.com/RT-Thread-Studio/sdk-bsp-stm32h750-realthread-artpi/blob/master/documents/board/ART-Pi_HW_V1.5/ART-Pi_SCH_V1.5_Release.pdf

image-20210813145319027

image-20210813145336358

image-20210813150213630

image-20210813150253189

#include "drv_common.h"
#define GT9147_IRQ_PIN GET_PIN(G,12)
#define GT9147_RST_PIN GET_PIN(D,3)

int rt_hw_gt9147_port(void)
{
    struct rt_touch_config config;
    rt_uint8_t rst;

    rst = GT9147_RST_PIN;
    config.dev_name = "i2c1";
    config.irq_pin.pin  = GT9147_IRQ_PIN;
    config.irq_pin.mode = PIN_MODE_INPUT_PULLDOWN;
    config.user_data = &rst;

    rt_hw_gt9147_init("gt", &config);

    return 0;
}
INIT_DEVICE_EXPORT(rt_hw_gt9147_port);

image-20210813150415372

void touch_init(void)
{
    gt9147_sample("gt",800,480);
}

INIT_APP_EXPORT(touch_init);

image-20210813151036707

image-20210813151635140

别忘了加头文件

#include "littlevgl2rtt.h"

#define TOUCH_LCD_WIDTH  800
#define TOUCH_LCD_HEIGHT 480

static void gt9147_entry(void *parameter)
{
    uint16_t x;
    uint16_t y;
    
    rt_device_control(dev, RT_TOUCH_CTRL_GET_INFO, &info);

    read_data = (struct rt_touch_data *)rt_malloc(sizeof(struct rt_touch_data) * info.point_num);

    while (1)
    {
        rt_sem_take(gt9147_sem, RT_WAITING_FOREVER);

        if (rt_device_read(dev, 0, read_data, info.point_num) == info.point_num)
        {
            for (rt_uint8_t i = 0; i < info.point_num; i++)
            {
                x = TOUCH_LCD_WIDTH-(uint16_t)read_data[i].x_coordinate;
                y = TOUCH_LCD_HEIGHT-(uint16_t)read_data[i].y_coordinate;
                littlevgl2rtt_send_input_event(x,y,read_data[i].event);
                if (read_data[i].event == RT_TOUCH_EVENT_DOWN || read_data[i].event == RT_TOUCH_EVENT_MOVE)
                {
//                    rt_kprintf("%d %d %d %d %d\n", read_data[i].track_id,
//                               read_data[i].x_coordinate,
//                               read_data[i].y_coordinate,
//                               read_data[i].timestamp,
//                               read_data[i].width);
                    rt_kprintf("(%d,%d)\n",x,y);
                }
            }
        }
        rt_device_control(dev, RT_TOUCH_CTRL_ENABLE_INT, RT_NULL);
    }
}

下面是启用DMA2D提高LVGL的屏幕刷新率,但是最后出现白屏的现象不知道为什么,有待解决

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

image-20210813173601592

image-20210813173623234

image-20210813173640673

/**
* @brief DMA2D MSP Initialization
* This function configures the hardware resources used in this example
* @param hdma2d: DMA2D handle pointer
* @retval None
*/
void HAL_DMA2D_MspInit(DMA2D_HandleTypeDef* hdma2d)
{
  if(hdma2d->Instance==DMA2D)
  {
  /* USER CODE BEGIN DMA2D_MspInit 0 */

  /* USER CODE END DMA2D_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_DMA2D_CLK_ENABLE();
    /* DMA2D interrupt Init */
    HAL_NVIC_SetPriority(DMA2D_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(DMA2D_IRQn);
  /* USER CODE BEGIN DMA2D_MspInit 1 */

  /* USER CODE END DMA2D_MspInit 1 */
  }

}

/**
* @brief DMA2D MSP De-Initialization
* This function freeze the hardware resources used in this example
* @param hdma2d: DMA2D handle pointer
* @retval None
*/
void HAL_DMA2D_MspDeInit(DMA2D_HandleTypeDef* hdma2d)
{
  if(hdma2d->Instance==DMA2D)
  {
  /* USER CODE BEGIN DMA2D_MspDeInit 0 */

  /* USER CODE END DMA2D_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_DMA2D_CLK_DISABLE();

    /* DMA2D interrupt DeInit */
    HAL_NVIC_DisableIRQ(DMA2D_IRQn);
  /* USER CODE BEGIN DMA2D_MspDeInit 1 */

  /* USER CODE END DMA2D_MspDeInit 1 */
  }

}

image-20210813190103577

在这里插入图片描述

DMA2D_HandleTypeDef hdma2d;

static void MX_DMA2D_Init(void)
{

  /* USER CODE BEGIN DMA2D_Init 0 */

  /* USER CODE END DMA2D_Init 0 */

  /* USER CODE BEGIN DMA2D_Init 1 */

  /* USER CODE END DMA2D_Init 1 */
  hdma2d.Instance = DMA2D;
  hdma2d.Init.Mode = DMA2D_M2M;
  hdma2d.Init.ColorMode = DMA2D_OUTPUT_RGB565;
  hdma2d.Init.OutputOffset = 0;

  hdma2d.LayerCfg[1].InputOffset = 0;
  hdma2d.LayerCfg[1].InputColorMode = DMA2D_INPUT_RGB565;
  hdma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
  hdma2d.LayerCfg[1].InputAlpha = 0;
  hdma2d.LayerCfg[1].AlphaInverted = DMA2D_REGULAR_ALPHA;
  hdma2d.LayerCfg[1].RedBlueSwap = DMA2D_RB_REGULAR;
  hdma2d.LayerCfg[1].ChromaSubSampling = DMA2D_NO_CSS;
  if (HAL_DMA2D_Init(&hdma2d) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_DMA2D_ConfigLayer(&hdma2d, 1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN DMA2D_Init 2 */

  /* USER CODE END DMA2D_Init 2 */
}

image-20210813190435208

drv_lcd_hw_init()

littlevgl2rtt_init

image-20210813192314323

    lv_color_t *buf1 = rt_malloc(sizeof(lv_color_t)*LV_HOR_RES_MAX*LV_VER_RES_MAX);
    rt_memset(buf1, 0, sizeof(lv_color_t)*LV_HOR_RES_MAX*LV_VER_RES_MAX);

    lv_color_t *buf2 = rt_malloc(sizeof(lv_color_t)*LV_HOR_RES_MAX*LV_VER_RES_MAX);
    rt_memset(buf2, 0, sizeof(lv_color_t)*LV_HOR_RES_MAX*LV_VER_RES_MAX);

image-20210813192519216

``

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
作者:Signx 概述 当前的人脸识别摄像头,价格昂贵,拟改造成stm32单片机版本的,节省成本 功能: 1.连接摄像头OV2640,用fish指令开启摄像头 2.将摄像头数据传到电脑显示图片 3.将摄像头数据传到spi显示屏显示(未完成) 4.用人脸识别算法识别人脸开锁(未完成) 5.可登录到tencent Cloud云平台,实现上云 开发环境: 硬件:Art-pi+OV2640 RT-Thread版本:4.0.2 开发工具及版本:rt-stuidio V2.0.0 RT-Thread使用情况概述: 硬件框架:art-pi官方开发板+OV2640(dma+DCMI) 软件框架说明: 见思维导图 软件模块说明: 见思维导图 该系统的思维脑图如下: 演示效果: 视频: 实物图如下: 实现的效果如图: 连接电路如图所示: 实现功能: 1.连接摄像头OV2640,用fish指令开启摄像头 2.将摄像头数据传到电脑显示图片 3.将摄像头数据传到spi显示屏显示(未完成) 4.用人脸识别算法识别人脸开锁(未完成) 5.可登录到tencent Cloud云平台,实现上云主要碰到的技术难点: 1.art-pi组建库里有ov2640的软件包,本以为直接能用的,结果发现有很多缺失 首先是io口的确实,没有定义到足够的io口,所以代码里又加上了io口的定义以及初始化: io口定义代码: typedef enum { BMP_QQVGA = 0x00, /* BMP Image QQVGA 160x120 Size */ BMP_QVGA = 0x01, /* BMP Image VGA 800*480 Size */ JPEG_160x120 = 0x02, /* JPEG Image 160x120 Size */ JPEG_176x144 = 0x03, /* JPEG Image 176x144 Size */ JPEG_320x240 = 0x04, /* JPEG Image 320x240 Size */ JPEG_352x288 = 0x05 /* JPEG Image 352x288 Size */ }ImageFormat_TypeDef; /*摄像头接口 */ //IIC SCCB //#define CAMERA_I2C I2C1 //#define CAMERA_I2C_CLK_ENABLE() __HAL_RCC_I2C1_CLK_ENABLE() // //#define CAMERA_I2C_SCL_PIN GPIO_PIN_8 //#define CAMERA_I2C_SCL_GPIO_PORT GPIOB //#define CAMERA_I2C_SCL_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() //#define CAMERA_I2C_SCL_AF GPIO_AF4_I2C1 // //#define CAMERA_I2C_SDA_PIN GPIO_PIN_9 //#define CAMERA_I2C_SDA_GPIO_PORT GPIOB //#define CAMERA_I2C_SDA_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() //#define CAMERA_I2C_SDA_AF GPIO_AF4_I2C1 //VSYNC #define DCMI_VSYNC_GPIO_PORT GPIOI #define DCMI_VSYNC_GPIO_CLK_ENABLE() __HAL_RCC_GPIOI_CLK_ENABLE() #define DCMI_VSYNC_GPIO_PIN GPIO_PIN_5 #define DCMI_VSYNC_AF GPIO_AF13_DCMI // HSYNC #define DCMI_HSYNC_GPIO_PORT GPIOH #define DCMI_HSYNC_GPIO_CLK_ENABLE() __HAL_RCC_GPIOH_CLK_ENABLE() #define DCMI_HSYNC_GPIO_PIN GPIO_PIN_8 #define DCMI_HSYNC_AF GPIO_AF13_DCMI //PIXCLK #define DCMI_PIX
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 的魅力,使用在嵌入式系统上是非常不错的选择。
Light Gui的新特性。 1图层和绘图: 支持多图层,使用与有多图层支持的处理器平台。 支持多图层的软件模拟,支持图层的alpha合并和滑动。 同时支持多种颜色格式的图层,如ragb8888模式、rgb565模式、256色调色板模式。 对每个图层,支持双缓存(double buffer)模式,内部进行了窗口剪切优化。 也支持直画(direct draw)模式,支持内存设备,两者可以配合使用。 支持图层和窗口之前的映射,支持一组窗口动态切换显示到不同大小、不同颜色格式的图层。 支持窗口旋转90度、180度、270度,无需硬件支持。 2风格支持: 支持css风格配置,代码中设置控件的类名,就可以和css配置配合使用。 支持css配置控件不同状态的背景属性,如图片、填充色;前景属性,如图片、颜色;字体属性,如大小、颜色;边框属性,如宽度、颜色、调色板位图、补白等。 支持css配置窗口的一些基本属性,如高宽,透明等。 支持皮肤特性,皮肤的属性包括图标、css配置和调色板位图。 支持多种皮肤,支持在线切换皮肤。 3window模拟器支持: 支持完整的window模拟器,使用visual studio 2005,可以独立于设备,在window环境编写界面代码。 全部由C代码编写,自带基本的C函数库,数学函数库,可以在window,嵌入式设备间无缝移植。 模拟器带来良好的调试特性,界面的相关bug,可以方便的在模拟器上调试,极大的加快软件的开发进度。 支持内存调试模式,可以方便的追踪内存越界,泄漏等问题。 4xml支持: 自带xml解释器,配置文件都使用xml编写,有很好的可读性。 实现了基于xml配置文件的多国语言支持,支持在线切换语言。 5简明易用的控件: 自带多种基本的控件,包括静态文本框、按钮、单行和多行编辑框、列表框、进度条、滚动条、图片、等等。 支持自定义控件,控件代码清晰、简明、容易编写。支持组合控件、对话框控件。配合皮肤配置,能快速实现美工效果和风格。 支持一些较复杂的控件,如文本控件、html显示、软件盘等 6良好的应用移植性 自带基本的C函数库,数学函数库等,可以方便的移植程序库和应用程序。 Light Gui的弱点: 实时性能不是Light GUI强项,不建议使用在实时性要就很高的环境。 在使用风格属性的情况下需要有系统盘的支持,用于存放配置文件和资源。 Light Gui目前是一个图形开发包,没有跨任务的窗口管理系统。 目前只有ucos(增强型,支持系统盘),linux,window平台的移植版本。 Light Gui使用的场合: 需要使用图形库快速实现自有风格的嵌入式设备,比如消费电子设备的二次开发,UI设计。 需要使用Light Gui特性的window程序设计。 Light Gui的商业模式: Light Gui是商业收费软件。 提供软件定制服务。 提供自主设计所需的源代码和库。 Light Gui 的其他特性 Light Gui 主要针对嵌入式操作系统,如嵌入式linux, uC/OS-II 等提供支持。在这些 OS 上,Light Gui 支持以多线程模式运行。其主要技术特性描述如下。 1) 硬件适配性: 可支持各种 32 位处理器架构,如 ARM、MIPS、PowerPC、Blackfin等。 支持各种灰度,彩色显示设备。 可支持各种输入设备,键盘(Keypad)、触摸屏、遥控器等等。 2) 资源消耗: Light GUI 的静态存储随配置选项的不同而不同,最少需占用 800K 静态存储空间。 Light GUI 启动后,初始占用动态存储空间最小为128k。建议系统内存为 2MB 以上。 3) 操作系统适配性: 目前支持uC/OS-II 等操作系统,也可以运行在 Linux/uClinux 操作系统之上,Light GUI自带基础的c函数库,可以方便的移植到支持frambuffer的设备上。 针对嵌入式系统的特殊支持,包括一般性的 I/O 流操作,字节序相关函数等。 4) 窗口子系统特性: 完备的任务内窗口机制和消息传递机制。 5) 图形子系统特性: 提供有增强 GDI 函数,包括光栅操作、复杂区域处理、椭圆、圆弧、多边形以及区域填充等函数。 在提供有兼容于 C99 规范的数学库平台上,还提供有高级二维绘图函数。 通过 Light GUI 的图形抽象层及图形引擎技术,我们也可以让上述高级 GDI 接口在低端显示屏上实现。 各种流行图像文件的支持,包括 Windows BMP、GIF、JPEG、PNG 等(JPEG
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值