STM32 RGB屏幕

news/2024/11/17 15:51:34/

使用ST的HAL库进行开发,RGB屏幕是480*272的4.3寸LCD,由于驱动RGB屏幕需要较多的内存,

所以使用了外部SDRAM,内存是32M字节,关于SDRAM的驱动本文不进行讨论。

RGB屏幕常用的像素格式有:ARGB8888、RGB888、RGB565、ARGB1555、ARGB4444等格式,本文讨论RGB565格式的使用。

RGBLCD的信号线如下表:

上表共有24根颜色信号线,RGB565格式只用了其中的16根颜色信号线,分别是:R[3:7],G[2:7],B[3:7],共16位,

这样在表示颜色的时候就可以用16位长度的数据进行表示了,增加了数据的传输速度。

RGBLCD接口的原理图如下:

除了16位数据线之外,还有用到如下几个信号线:

LCD_BL:背光;

LCD_DE:数据使能信号;

LCD_VSYNC:垂直同步信号;

LCD_HSYNC:水平同步信号;

LCD_CLK:时钟信号;

STM32F429有自带的RGBLCD外设接口LTDC,可以用来直接驱动RGBLCD,另外配上专用于图像处理的DMA2D,

使得RGBLCD用起来更加方便快速。

下面开始介绍使用到的单片机引脚对应:

    PI9     ------> LTDC_VSYNC
    PI10     ------> LTDC_HSYNC
    PF10     ------> LTDC_DE
    PG7     ------> LTDC_CLK
    PH9     ------> LTDC_R3
    PH10     ------> LTDC_R4
    PH11     ------> LTDC_R5
    PH12     ------> LTDC_R6
    PG6     ------> LTDC_R7
    PH13     ------> LTDC_G2
    PH14     ------> LTDC_G3
    PH15     ------> LTDC_G4
    PI0     ------> LTDC_G5
    PI1     ------> LTDC_G6
    PI2     ------> LTDC_G7
    PG11  ------> LTDC_B3
    PI4     ------> LTDC_B4
    PI5     ------> LTDC_B5
    PI6     ------> LTDC_B6
    PI7     ------> LTDC_B7 

通过配置STM32CubeMx直接生成的LTDC部分初始化代码如下:

void MX_LTDC_Init(void)
{LTDC_LayerCfgTypeDef pLayerCfg;hltdc.Instance = LTDC;hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;            //水平同步极性:低有效hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;            //垂直同步极性:低有效hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL;            //数据使能极性:低有效hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;        //像素时钟极性:输入像素时钟hltdc.Init.HorizontalSync = 0;                        //水平同步宽度,1个时钟信号hltdc.Init.VerticalSync = 0;                        //垂直同步宽度,1行像素对应的时钟hltdc.Init.AccumulatedHBP = 40;                        //水平后沿宽度:40hltdc.Init.AccumulatedVBP = 8;                        //垂直后沿宽度:8hltdc.Init.AccumulatedActiveW = 520;                //显示有效宽度:520-40=480hltdc.Init.AccumulatedActiveH = 280;                //显示有效高度:280-8=272hltdc.Init.TotalWidth = 525;                        //总宽度:525(包含了5个水平前沿宽度)hltdc.Init.TotalHeigh = 288;                        //总高度:288(包含了8个垂直前沿宽度)hltdc.Init.Backcolor.Blue = 0;                        //屏幕背景层蓝色部分hltdc.Init.Backcolor.Green = 0;                        //屏幕背景层绿色部分hltdc.Init.Backcolor.Red = 0;                        //屏幕背景层红色部分if (HAL_LTDC_Init(&hltdc) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}pLayerCfg.WindowX0 = 0;                                        //窗口起点x坐标pLayerCfg.WindowX1 = 480;                                    //窗口终点x坐标pLayerCfg.WindowY0 = 0;                                        //窗口起点y坐标pLayerCfg.WindowY1 = 272;                                    //窗口终点y坐标pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565;            //像素格式RGB565格式pLayerCfg.Alpha = 255;                                        //恒定alpha值pLayerCfg.Alpha0 = 0;                                        //默认alpha值pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;    //混合系数1:像素alpha*恒定alphapLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;    //混合洗漱2:像素alpha*恒定alphapLayerCfg.FBStartAdress = 0xC0000000;                        //颜色数据所在的内存起始地址pLayerCfg.ImageWidth = 480;                                    //图像宽度pLayerCfg.ImageHeight = 272;                                //图像高度pLayerCfg.Backcolor.Blue = 0;                                //屏幕背景层蓝色部分pLayerCfg.Backcolor.Green = 0;                                //屏幕背景层绿色部分pLayerCfg.Backcolor.Red = 0;                                //屏幕背景层红色部分if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}
}

函数MX_LTDC_Init()将外设LTDC进行了初始化配置,在配置好ltdc之后,我们只需要改变对应的内存的数据,

ltdc就会自动帮我们改变LCD上对应像素点的颜色。

下面通过初始化LCD的函数,将LCD屏幕清屏为全白:

/*** @brief : LCD清屏,使用DMA2D将颜色数据传输到内存中* @par Full description : 填充范围是坐标(sx,sy),(ex,ey)形成的矩形区域,*                            区域大小像素点个数是:(ex-sx+1)*(ey-sy+1)* @param : *        sx -- x轴起点坐标*        sy -- y轴起点坐标*        ex -- x轴终点坐标*        ey -- y轴终点坐标*        Colour -- 填充的颜色* @retval : 无*/
void LcdClear(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint32_t Colour)
{__HAL_RCC_DMA2D_CLK_ENABLE();                               //使能DMA2D时钟DMA2D->CR &= ~(DMA2D_CR_START);                             //先停止DMA2DDMA2D->CR = DMA2D_R2M;                                      //寄存器到存储器模式DMA2D->OPFCCR = LTDC_PIXEL_FORMAT_RGB565;                   //设置颜色格式DMA2D->OOR = 0;                                             //设置行偏移DMA2D->OMAR = uhLtdcFrameBuf;                               //输出存储器地址DMA2D->NLR = (ey - sy + 1) | ((ex - sx + 1) << 16);         //设定行数寄存器DMA2D->OCOLR = Colour;                                      //设定输出颜色寄存器DMA2D->CR |= DMA2D_CR_START;                                //启动DMA2Dwhile((DMA2D->ISR & DMA2D_FLAG_TC) == 0);                   //等待传输完成DMA2D->IFCR |= DMA2D_FLAG_TC;                               //清除传输完成标志
}void LcdInit(void)
{LCD_BIAS_LIGHT_ENALBE;                                      //使能LCD背光LcdClear(0, 0, 479, 271, 0xFFFF);                           //清屏全白,0xFFFF是全白
}

使用DMA2D将大量的数据传输到指定的内存之中,0xFFFF对应的是白色,对应的内存地址是uhLtdcFrameBuf数组的首地址。

至此,我们就完成了将RGBLCD清屏成全白的测试。


http://www.ppmy.cn/news/484998.html

相关文章

数字图像处理 基于matlab、opencv计算图像的梯度方向和梯度幅值

一、图像的梯度 1、简述 图像可以被视为标量场(即二维函数)。 通过微分将标量场转换为矢量场。 梯度是一个向量,描述了在x或y方向上移动时,图像变化的速度。我们使用导数来回答这样的问题,图像梯度的大小告诉图像变化的速度,而梯度的方向告诉图像变化最…

Three.js教程:Canvas画布布局和全屏

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 其他系列工具&#xff1a; NSDT简石数字孪生 Canvas画布布局和全屏 threejs渲染输出的结果就是一个Cavnas画布&#xff0c;canvas画布也是HTML的元素之一&#xff0c;这意味着three.js渲染结果的布局和普通web前端习惯是一…

Android studio自动登录和记住密码的实现

Android studio自动登录和记住密码的实现 文章目录 Android studio自动登录和记住密码的实现前言一、效果二、设计思路三、知识点介绍1. SharedPreferenced2. checkButton就不介绍了 四、自动登录及记住密码实现总结与补充 前言 大家好&#xff0c;我是oy&#xff0c;今天介绍…

dell屏幕亮度调节不了_戴尔笔记本无法调节亮度怎么办?如何找回调节亮度?

笔记本调节亮度的拉条不见了&#xff0c;无法调节亮度怎么办&#xff0c;也找不到了。键盘上的快捷键调节亮度也不行了。小编的电脑是戴尔的&#xff0c;所以以戴尔为例。为大家介绍戴尔笔记本无法调节亮度怎么办以及如何找回调节亮度方法介绍&#xff0c;希望能对大家有所帮助…

多功能电压输出家用应急电源设计

摘要 本设计基于STC89C52单片机设计的多功能电压输出应急电源&#xff0c;以应急电源为研究对象&#xff0c;单片机设计为控制集成IC&#xff0c;ADC为模数转换控制模块&#xff0c;无源蜂鸣器作为报警电路。系统分为单片机设计最小系统&#xff0c;AD转换控制模块&#xff0c;…

浏览器向网站或服务器端发出请求时,GET与POST有何区别?

在浏览器向网站或服务器端发出请求时&#xff0c;主要有两种常用的HTTP方法&#xff1a;GET和POST。它们有以下区别&#xff1a; GET方法&#xff1a; GET方法用于从服务器获取资源或数据。当使用GET方法时&#xff0c;浏览器将请求参数附加在URL的查询字符串中&#xff0c;以便…

jQuery 基础语法使用指南

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 1. 引入 jQuery 2. jQuery 语法 3. 选择器 …

单点触摸屏与多点触摸屏的异同

应该通过什么方法来获得多点触摸屏的数据呢&#xff1f; 控制IC与cpu一般来说是通过I2C或者SPI接口来连接。cpu如何得知控制IC有了数据呢&#xff1f;这个地方是通过中断来实现的。当发生中断以后&#xff0c;驱动程序就可以通过I2C或SPI总线来读取控制IC&#xff0c;获取电容屏…