首页 > 其他分享 >lvgl移植以及使用记录(1)

lvgl移植以及使用记录(1)

时间:2024-03-29 17:29:19浏览次数:13  
标签:disp draw 记录 color void area lv lvgl 移植

LVGL 使用记录

一、移植LVGL

使用LVGL的V8.3.10版本,移植对照正点原子或者网上的教程。

1.1 移植部分

  1. 打开LVGL Porting中lv_port_disp的宏,将if 0改为if 1,需要使用按键、旋转编码器、触摸屏则需要再打开lv_port_indev中的宏,配置好接口。(习惯先把屏幕调通,再去调其他组件)
#if 1

/*********************
 *      INCLUDES
 *********************/
#include "lv_port_disp.h"
#include <stdbool.h>
...

  1. 我是用的是单缓冲方式,由于内存不足,只开了10行,也是LVGL的最低要求,实际看自身的屏幕,我用的是320*172方式,刷17次可以刷新一次整屏,感觉还可以。
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); 

  1. 配置lvgl刷新函数disp_flush,采用DMA刷屏效果会更好,由于使用了Freertos操作系统,所以利用中断完成回调函数可以避免死等,充分发挥操作系统的优势,但是在这里并没有试过用信号量同步的方式来刷屏,后续可以尝试一下,目前刷屏效果还是很理想的。(注释部分是没有采用DMA刷屏时想到更换8位到16位来增加传输速率的方法,经测试,相比8位提升也很明显,DMA资源不够的时候也可以试试)。
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
    if(disp_flush_enabled) {
//        int32_t x;
//        int32_t y;
//        spi2_set_TB(1);
//        LCD_Address_Set(area->x1, area->y1, area->x2, area->y2);
//        spi2_set_TB(2);
//        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_WR_DATA16(color_p->full);
//                color_p++;
//            }
//        }
        lcd_draw_fast_rgb_color(area->x1,area->y1,area->x2,area->y2,(uint16_t*)color_p);
    }

    /*IMPORTANT!!!
     *Inform the graphics library that you are ready with the flushing*/
//    lv_disp_flush_ready(disp_drv);
}

/**
 * @brief       LCD加速绘制函数
 * @param       (sx,sy),(ex,ey):填充矩形对角坐标,区域大小为:(ex - sx + 1) * (ey - sy + 1)
 * @param       color:要填充的颜色
 * @retval      无
 */
void lcd_draw_fast_rgb_color(int16_t x1, int16_t y1,int16_t x2, int16_t y2, uint16_t *color)
{
    uint16_t w = x2-x1+1;
    uint16_t h = y2-y1+1;

    spi2_set_TB(1);
    LCD_Address_Set(x1, y1, x2, y2);
    spi2_set_TB(2);
    uint32_t draw_size = w * h;

    LCD_CS_Clr();
    HAL_SPI_Transmit_DMA(&hspi2,(uint8_t*)color,draw_size);
}

// DMA刷屏
void HAL_SPI_TxCpltCallback( SPI_HandleTypeDef *hspi )
{
    if( hspi->Instance == SPI2 )
    {
        if( hspi->State == HAL_SPI_STATE_READY )
        {
            LCD_CS_Set();
            lv_disp_flush_ready(&disp_drv);
        }
    }
}

  1. freertos创建任务进行调度,运行例程,一定要将 lv_timer_handler()运行在循环中,非os系统可以开定时器运行或者暂时放在主循环,加入延迟可以在空闲时间运行其他任务
#include "FreeRTOS.h"
#include "task.h"
#include "lvgl.h"
#include "lv_port_disp.h"
#include "lv_demo_stress.h"

#define LV_DEMO_TASK_PRIO 3 /* 任务优先级 */
#define LV_DEMO_STK_SIZE 1024 /* 任务堆栈大小 */
TaskHandle_t LV_DEMOTask_Handler; /* 任务句柄 */
void lv_demo_task(void *pvParameters); /* 任务函数 */

void lvgl_demo(void)
{
    lv_init();
    lv_port_disp_init(); /* lvgl 显示接口初始化,放在 lv_init()的后面 */
    lv_port_indev_init();
//    /* 创建 LVGL 任务 */
     xTaskCreate((TaskFunction_t )lv_demo_task,"lv_demo_task",LV_DEMO_STK_SIZE,NULL,LV_DEMO_TASK_PRIO,&LV_DEMOTask_Handler);
}

void lv_demo_task(void *pvParameters)
{
    lv_demo_stress();
    while(1)
    {
        lv_timer_handler(); /* LVGL 计时器 */
        vTaskDelay(5);
    }
}

移植后出现错误的原因大概率是draw中gpu部分未选择对。

剩下的慢慢总结,后面会讲解如何使用内部字体和外部字体,有兴趣请点个赞,有问题丢评论区,看到就回!

标签:disp,draw,记录,color,void,area,lv,lvgl,移植
From: https://blog.csdn.net/WLXB210/article/details/137119060

相关文章

  • Android.bp语法记录
    参考资料:https://www.cnblogs.com/linhaostudy/p/12361659.htmlhttps://blog.csdn.net/hxp1994/article/details/113853459https://blog.csdn.net/tkwxty/article/details/104395820 Android.bpAndroid.bp文件首先是Android系统的一种编译配置文件,是用来代替原来的Android.......
  • Android杂项知识记录
    Android启动流程:https://blog.csdn.net/xingyu19911016/article/details/120023396https://blog.csdn.net/ldxlz224/article/details/123238353init进程为第一个用户级别的进程,PID为1,它通过一系列的初始工作以及解析init.rc(一个脚本文件)文件构建出Android系统运行的初始......
  • 如何使用V免签+彩虹易支付个人支付对接支付宝、微信搭建安装流程记录
    这两天没事闲的折腾了下个人免签支付,我相信有很多小伙伴也有这个痛点!这里记录下安装流程,年纪大了以免下次重搭忘记!源码下载以后开始服务器安装,简单点就上宝塔或aapanel(宝塔海外版)!首先ssh登录服务器,然后sudo-i切换到root用户。我这里选择安装宝塔海外版aapanel(英文界面......
  • YOLOv5-小知识记录(三)
    0.写在前面    本篇介绍SPP模块、FPN模块模块,主要也是对YOLOv5的内容的补充:Yolo系列算法-理论部分-YOLOv4-CSDN博客Yolo系列算法-理论部分-YOLOv5-CSDN博客    上一篇:        YOLOv5-小知识记录(二)-CSDN博客1.SPP模块    SpatialPy......
  • Avalonia 运行在Ubuntu20.04上,记录发布到运行的过程,已解决默认字体问题
    目录1.安装.NET8.0环境2.发布Avalonia程序3.默认字体问题解决Demo程序下载(开箱即用):https://download.csdn.net/download/rotion135/890489371.安装.NET8.0环境下载微软dotnet安装脚本:sudowgethttps://dot.net/v1/dotnet-install.sh-Odotnet-install.sh运行......
  • CF1874F 做题记录
    link太绝了。首先容易想到要用容斥,具体的,我们钦定区间集合\(S=\{[l,r]|p_{l...r}\text{是}l...r\text{的排列}\}\),贡献为\((-1)^{|S|}\)乘上对应方案数。然后仔细观察,不难发现对于选出来的区间\([l_1,r_1],[l_2,r_2]\),若满足\(l_1<l_2<r_1<r_2\),则\([l_1,l_2-1],[l_2,r......
  • H5项目设置接口报错预警警报,需记录什么信息能有效排查报错问题
    在H5项目中,如果要有效地排查接口报错问题,记录以下信息可能会有所帮助:错误信息:记录报错信息的具体内容,包括错误代码、错误描述等。这将是你开始排查问题的关键信息。接口地址:记录发生错误的接口地址,包括请求的URL、接口路径等。这有助于定位问题所在的具体接口。请求......
  • 跨时钟域学习记录(二)——XPM_CDC
      本文以Xilinx提供的xpm_cdc代码为例,整理处理跨时钟域数据传输的常见方法。宏定义  Xilinx定义了多个宏定义代替描述触发器行为的always块,列举如下宏名称含义XPM_XSRREG带同步复位/置位的同步寄存器XPM_XSRREGEN带同步复位/置位和使能的寄存器XPM_XARREG带异步复位/......
  • ARM 芯片的嵌入式代码移植注意事项
    嵌入式系统在我们的日常生活中无处不在,从智能手机和可穿戴设备到汽车和工业控制系统。ARM架构是嵌入式系统中广泛使用的处理器架构,以其高性能、低功耗和成本效益而闻名。然而,在将代码从一个ARM芯片移植到另一个ARM芯片时,需要注意一些关键事项,以确保移植的成功。处理器......
  • FLASK学习记录-宏、模板继承
    宏{%macroname%}{%endmacro%}app.pyfromflaskimportFlask,render_templateapp=Flask(__name__)@app.route('/')defindex1():returnrender_template("macro1.html")@app.route("/")defindex2():returnrend......