STM32 RGB屏幕驱动+LVGL移植 从底层到应用小项目

这篇具有很好参考价值的文章主要介绍了STM32 RGB屏幕驱动+LVGL移植 从底层到应用小项目。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目使用正点原子STM32F767阿波罗开发板+IPS TFT-LCD屏幕(非正点原子屏幕)进行开发,应用层移植轻量级GUI库LVGL实现列表按键点击,切换,显示当前内部工作电压功能。重点在于对于RGB屏幕驱动普适性的学习和LVGL开发的理解。希望我实习期间的项目学习过程能对大家有所帮助。

一.RGB LCD屏幕开发所需基础知识

1.颜色格式及帧缓冲区大小

与接线较少的MCU屏幕不同,RGB屏幕采用并口连接通常像素点颜色数据传输采用RGB888,RGB565,RGB666,ARGB8888等格式进行传输。这意味着开发过程中如果不使用专用LCD驱动IC,在MCU选择过程中应选择引脚数足够的MCU进行开发。

另外,对于屏幕开发,我们在MCU选型过程中还应注意所开发屏幕显示过程中需要占用的显存,并选择足够RAM的MCU或外扩SDRAM。其中RGB LCD的占用显存是这样计算出来的:

以一块分辨率为240*320的屏幕为例:屏幕在显示过程中经过设定可选择为从左到右,从上到下的扫描方式(或者通过改变驱动选择其他方式),LCD控制器将从一块专门的帧缓冲区(frame buffer)中将各像素点的颜色数据取出并在屏幕上呈现。每一个像素都由R(红色)G(绿色)B(蓝色)三种颜色的数据组合而成。我们之前提到的RGB565/RGB888等即为各颜色在一个像素点里所占的位数(bit)大小,项目中使用的屏幕为RGB565格式,即为红色数据占5bits,绿色占6bits,蓝色占5bits。

5bits+6bits+5bits=16bits=2bytes 即为RGB565接口格式屏幕每个像素显示需要占用2字节(bytes)大小空间。分辨率240*320意思就是一帧完整的图像显示需要显示240*320个像素点。一般项目中需要较为流畅的显示,项目中为帧缓冲区预留了一帧图像大小的显存,所占用的RAM=2bytes*240*320=153.6KB

STM32 RGB屏幕驱动+LVGL移植 从底层到应用小项目,stm32,单片机,嵌入式硬件,arm,Powered by 金山文档

2.屏幕刷新率

我们常说的屏幕刷新率,60Hz,144Hz等等意思显而易见,结尾屏幕在1s内显示了多少帧图像。在屏幕厂家的datasheet没有描述时,我们该如何计算呢?这就要去看datasheet中的时钟频率了。

STM32 RGB屏幕驱动+LVGL移植 从底层到应用小项目,stm32,单片机,嵌入式硬件,arm,Powered by 金山文档

项目中的屏幕的时钟频率为6.49Mhz,意为在1s中有6490000次时钟脉冲,每次对应一次像素数据的传输,datasheet中的如图两个数据前者为一次行扫描所需时钟数,后者为一次帧扫描所需行扫描数

STM32 RGB屏幕驱动+LVGL移植 从底层到应用小项目,stm32,单片机,嵌入式硬件,arm,Powered by 金山文档
STM32 RGB屏幕驱动+LVGL移植 从底层到应用小项目,stm32,单片机,嵌入式硬件,arm,Powered by 金山文档

它们的乘积即为显示一帧图像的时钟数,用6490000/(320*338)=60Hz即为屏幕的刷新率。

二.方案及硬件连接

在实际开发中如不外加LCD驱动IC,使用MCU直接驱动的方式需要尽量选择内部带有LCD控制器的MCU,模拟时序的方式既不方便又不能很快发现问题。项目使用的STM32F767开发板内部带有专用LCD控制器LTDC和图形加速器DMA2D。很方便进行开发。以下为本项目的硬件连接,其它屏幕开发时需注意接口对应的MCU LCD控制器引脚,并且注意为背光引脚供电。

STM32 RGB屏幕驱动+LVGL移植 从底层到应用小项目,stm32,单片机,嵌入式硬件,arm,Powered by 金山文档
STM32 RGB屏幕驱动+LVGL移植 从底层到应用小项目,stm32,单片机,嵌入式硬件,arm,Powered by 金山文档

三.代码部分注意事项

我使用CUBEMX+HAL的方式直接进行开发,详细代码及配置可自行下载。下面我来讲述一下在开发过程中需要注意的点。

1.LTDC屏幕参数配置

在配置cubemx的ltdc时需要严格对应datasheet中的lcd显示参数的值,包括vd,vbl,hd,hbl等。

2.LCD驱动编写

利用DMA2D外设,编写LCD控制器绘制矩形函数,并且注意函数参数的设定之后要与LVGL的API接口相对应。实际上我们使用LVGL库时,LCD的驱动代码只需要写这一个即可,如果想自己写类似于画圆、画点做的函数、画线也可以加进去。

void LTDC_Color_Fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey,uint16_t *color)
{    uint32_t timeout=0;
    uint32_t psx,psy,pex,pey;    
    uint16_t offline;
    uint32_t addr; 
        psx=sx;psy=sy;
        pex=ex;pey=ey;
    offline=240-(pex-psx+1);
    RCC->AHB1ENR|=1<<23;            //使能DM2D时钟
    DMA2D->CR=0<<16;                //存储器到存储器模式
    DMA2D->FGPFCCR=LCD.ColorMode;    //设置颜色格式
    DMA2D->FGOR=0;                    //前景层行偏移为0
    DMA2D->OOR=offline;            //设置行偏移 
    DMA2D->CR&=~(1<<0);                //先停止DMA2D
    DMA2D->FGMAR=(uint32_t)color;        //源地址
    DMA2D->OMAR=LCD.LayerMemoryAdd + LCD.BytesPerPixel*(LCD_Width * sy + sx);                //输出存储器地址
    DMA2D->NLR=(pey-psy+1)|((pex-psx+1)<<16);    //设定行数寄存器 
    DMA2D->CR|=1<<0;                //启动DMA2D
    while((DMA2D->ISR&(1<<1))==0)    //等待传输完成
    {
        timeout++;
        if(timeout>0X1FFFFF)break;    //超时退出
    } 
    DMA2D->IFCR|=1<<1;                //清除传输完成标志      
} 

3.LVGL相关API

(1)lv_port_disp.c

在配置中需要注意刷新的方式,我选择了一次刷新一整屏,实际调试时才不会出现卡顿,在其它屏幕开发时需要根据实际而定。

在此驱动与我们的LCD驱动需要对应的API为如下函数,需要于我们自己驱动的绘制矩形函数相对应,建议使用DMA2D绘制。

static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p);

这里的函数里只需加入之前写好的绘制矩形函数并添加函数lv_disp_flush_ready(disp_drv);

LTDC_Color_Fill(area->x1,area->y1,(area->x2)-(area->x1),(area->y1)-(area->y2),(uint16_t*)color_p);

这里的area结构体中的(x1,y1),(x2,y2)分别对应绘制矩形区域的左上角和右下角,写入参数时需严格对应自己之前编写的参数值。

(2)lv_port_indev.c

在调试中因为屏幕非触屏且开发板仅有4个按键,我在相关api中选择了以按键对应坐标点的方式对应屏幕位置,在其它开发调试中可针对实际需要完善方案.

static const lv_point_t btn_points[4] = {
            {10, 10},      /*Button 0 -> x:10; y:10*/
            {80, 70},      /*Button 1 -> x:80; y:70*/
            {180,10},      /*button 2 -> x:180; y:10*/   
            {80,100}       /*button 3 -> x:80; y:100*/                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
    };
    lv_indev_set_button_points(indev_button, btn_points);

4.LVGL编程

在LVGL编程中要善用c++思想父类子类的关系,我认为这也是LVGL开发的关键之处。还需要将相关事件和功能底层函数对应起来,实现屏幕显示和具体功能的对应。

5.LVGL心跳时钟配置

了解过LVGL后大家应该知道,在LVGL的实际运行时,我们需要为其配置心跳始终才能正常运行,在这里我们使用定时器中断来为LVGL配置心跳。并将lv_tick_inc()函数在定时器的中断回调函数中调用。

在初始化过程中我们需要注意的是,如果使用的是CUBEMX进行的定时器配置,我们在初始化函数中需要启动定时器的计时。只进行初始化是没有用的。

HAL_TIM_Base_Start_IT(&htim3);

四.调试结果

使用官方demo提供和的背景图片,对LVGL的基本功能进行了简单的运用并和外设驱动实际联系起来。

STM32 RGB屏幕驱动+LVGL移植 从底层到应用小项目,stm32,单片机,嵌入式硬件,arm,Powered by 金山文档
STM32 RGB屏幕驱动+LVGL移植 从底层到应用小项目,stm32,单片机,嵌入式硬件,arm,Powered by 金山文档
STM32 RGB屏幕驱动+LVGL移植 从底层到应用小项目,stm32,单片机,嵌入式硬件,arm,Powered by 金山文档

gitee:https://gitee.com/frederickning/rgblcd-lvgl.git文章来源地址https://www.toymoban.com/news/detail-610679.html

到了这里,关于STM32 RGB屏幕驱动+LVGL移植 从底层到应用小项目的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LVGL触摸移植——stm32野火F103

    目录 系列文章目录 章目录 目标 一、认识端口文件 二、使能 lv_port_indev.c  三、接口函数 1.输入设备初始化 四、Main函数 五、过程中的疑难杂症 1.内存不足 2、LCD白屏 五、效果 总结 在显示的基础上添加触摸输入 提示:以下是本篇文章正文内容,下面案例可供参考 这两个是

    2024年02月11日
    浏览(32)
  • STM32移植LVGL+旋转编码器接口对接

    写在前面:本菜鸟结合了许多大佬的文章,成功实现了基于LVGL的GUI设计,小开心~浅浅记录一下!~ 本文以单片机STM32F103VET6为核心,利用ST7796芯片驱动分辨率为480*320的LCD液晶屏模块,移植LVGL,对接显示接口,对接外部接口——旋转编码器,完成以上两步,就可以实现LVGL的显

    2024年02月10日
    浏览(34)
  • SquareLine studio设计LVGL工程,移植到stm32的过程

            本文主要是给大家介绍一下如何将SquareLine studio设计的LVGL工程,移植到stm32的LCD液晶显示屏上。 本文做好的移植模板在这(移植模板),模板可以直接在正点原子stm32f103ze系列板子上运行测试。显示屏使用的是4.3寸屏幕(像素800*480)         ·以我自己设计的LVGL工程

    2024年02月03日
    浏览(57)
  • STM32 CubeMX (H750)RGB屏幕 LTDC

    RGB屏幕线束定义: 这里设置的时钟,关于刷新速度 举例子 :LCD_CLK=24MHz 时 刷新率 = 24MHz /((Width + HSYNC_W + HBP + HFP) (Height + VSYNC_W + VBP + VFP)) = 24000000/((800 + 96 + 10 + 10) (480 + 2 + 10 + 10)) = 24000000/(916*502) = 52Hz

    2024年02月10日
    浏览(26)
  • LVGL学习笔记(二):从0到1移植LVGL8.1到STM32平台上(完结篇)

    目录 一:TFT-LCD屏触摸 二:STM32CubeMX配置 三:FT5206触摸芯片驱动代码移植 四:LVGL 移植 4.1 源码下载 4.2 代码移植  4.3 添加源码至工程 4.4 指定头文件路径 4.5 设置编译参数  4.6 修改LVGL源文件   4.7 修改显示驱动接口    4.8 修改输入设备驱动接口  五:下载验证  六:工

    2024年02月03日
    浏览(35)
  • STM32移植LVGL8.0.2超详细的保姆级教程附移植好的工程文件

    网上教程那么多,为什么你要写这个教程? 问的好,csnd上很多类似的教程,他们写的都很好,但是有些过于简洁,对刚上手的小伙伴不太友好,移植到一半遇到bug就想放弃。一些第三方的教程很详细,但是由于lvgl的版本迭代很快,移植的过程有了一些变化,所谓失之毫厘差

    2024年02月03日
    浏览(32)
  • 【LVGL】STM32F103ZET6——LVGL_GUI_GUIDER移植过程成功

    STM32F103ZET6——LVGL_GUI_GUIDER移植过程 STM32F103ZET6——LVGL_GUI_GUIDER移植过程 使用工具: 1.LVGL库8.02 2.GUI_GUIDER 3.keil5 设计出来的总体是这样 提示:以下是本篇文章正文内容,下面案例可供参考 这部分有很多大佬已经写的很成熟了,我就不赘述了 安装包在这里硬件资源 右上角可将

    2024年02月12日
    浏览(41)
  • stm32f407移植LVGL8.3.1实况(所有bug调试现场,最终成功点灯)

    声明: 本文主要参考 stm32移植lvgl_NULL_1969的博客-CSDN博客_lvgl stm32 及 STM32移植LVGL8.0.2超详细的保姆级教程附移植好的工程文件 ,底层驱动主要采用正点原子触摸屏实验和定时器实验 1.1 主要硬件接口 1.1.1 触摸屏 主要需要触摸屏来实现屏幕的显示及触摸。 触摸屏需要底层的接

    2024年01月16日
    浏览(42)
  • GUI——LVGL移植+STM32f407zgt6(正点原子最小系统板+GUI Guider

    首先是GUI Guider的介绍 GUI Guider是NXP公司开发的一个图形化软件,对于初学GUI或者写ui界面的小白们非常合适,也非常方便,现在就示例写一个demo  首先是初始化界面,在相应的位置填写相关信息(文件名,是否使用模板,以及数据位,最重要的 是大小),这个显示的大小要和

    2023年04月24日
    浏览(45)
  • 立创梁山派GD32F450ZGT6--屏幕扩展板LVGL应用

    该文章工程是基于裸机情况下运行的LVGL,通过GUI-Guider-1.4.0进行页面布局配置。 GUI Guider是恩智浦为LVGL开发了一个上位机GUI设计工具,可以通过拖放控件的方式设计LVGL GUI页面,加速GUI的设计。设计完成的GUI页面可以在PC上仿真运行,确认设计完毕之后可以生成C代码,再整合到

    2024年02月13日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包