历史上的今天
返回首页

历史上的今天

今天是:2025年06月03日(星期二)

正在发生

2018年06月03日 | 基于STM32F429的RGB屏使用

2018-06-03 来源:eefocus

使用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部分初始化代码如下:


  1. void MX_LTDC_Init(void)  

  2. {  

  3.     LTDC_LayerCfgTypeDef pLayerCfg;  

  4.       

  5.     hltdc.Instance = LTDC;  

  6.     hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;         //水平同步极性:低有效  

  7.     hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;         //垂直同步极性:低有效  

  8.     hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL;         //数据使能极性:低有效  

  9.     hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;        //像素时钟极性:输入像素时钟  

  10.     hltdc.Init.HorizontalSync = 0;                      //水平同步宽度,1个时钟信号  

  11.     hltdc.Init.VerticalSync = 0;                        //垂直同步宽度,1行像素对应的时钟  

  12.     hltdc.Init.AccumulatedHBP = 40;                     //水平后沿宽度:40  

  13.     hltdc.Init.AccumulatedVBP = 8;                      //垂直后沿宽度:8  

  14.     hltdc.Init.AccumulatedActiveW = 520;                //显示有效宽度:520-40=480  

  15.     hltdc.Init.AccumulatedActiveH = 280;                //显示有效高度:280-8=272  

  16.     hltdc.Init.TotalWidth = 525;                        //总宽度:525(包含了5个水平前沿宽度)  

  17.     hltdc.Init.TotalHeigh = 288;                        //总高度:288(包含了8个垂直前沿宽度)  

  18.     hltdc.Init.Backcolor.Blue = 0;                      //屏幕背景层蓝色部分  

  19.     hltdc.Init.Backcolor.Green = 0;                     //屏幕背景层绿色部分  

  20.     hltdc.Init.Backcolor.Red = 0;                       //屏幕背景层红色部分  

  21.     if (HAL_LTDC_Init(&hltdc) != HAL_OK)  

  22.     {  

  23.         _Error_Handler(__FILE__, __LINE__);  

  24.     }  

  25.   

  26.     pLayerCfg.WindowX0 = 0;                                     //窗口起点x坐标  

  27.     pLayerCfg.WindowX1 = 480;                                   //窗口终点x坐标  

  28.     pLayerCfg.WindowY0 = 0;                                     //窗口起点y坐标  

  29.     pLayerCfg.WindowY1 = 272;                                   //窗口终点y坐标  

  30.     pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565;           //像素格式RGB565格式  

  31.     pLayerCfg.Alpha = 255;                                      //恒定alpha值  

  32.     pLayerCfg.Alpha0 = 0;                                       //默认alpha值  

  33.     pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;    //混合系数1:像素alpha*恒定alpha  

  34.     pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;    //混合洗漱2:像素alpha*恒定alpha  

  35.     pLayerCfg.FBStartAdress = 0xC0000000;                       //颜色数据所在的内存起始地址  

  36.     pLayerCfg.ImageWidth = 480;                                 //图像宽度  

  37.     pLayerCfg.ImageHeight = 272;                                //图像高度  

  38.     pLayerCfg.Backcolor.Blue = 0;                               //屏幕背景层蓝色部分  

  39.     pLayerCfg.Backcolor.Green = 0;                              //屏幕背景层绿色部分  

  40.     pLayerCfg.Backcolor.Red = 0;                                //屏幕背景层红色部分  

  41.     if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK)  

  42.     {  

  43.         _Error_Handler(__FILE__, __LINE__);  

  44.     }  

  45. }  

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

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

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


  1. /** 

  2.   * @brief : LCD清屏,使用DMA2D将颜色数据传输到内存中 

  3.   * @par Full description : 填充范围是坐标(sx,sy),(ex,ey)形成的矩形区域, 

  4.   *                         区域大小像素点个数是:(ex-sx+1)*(ey-sy+1) 

  5.   * @param :  

  6.   *     sx -- x轴起点坐标 

  7.   *     sy -- y轴起点坐标 

  8.   *     ex -- x轴终点坐标 

  9.   *     ey -- y轴终点坐标 

  10.   *     Colour -- 填充的颜色 

  11.   * @retval : 无 

  12.   */  

  13. void LcdClear(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint32_t Colour)  

  14. {  

  15.     __HAL_RCC_DMA2D_CLK_ENABLE();                               //使能DMA2D时钟  

  16.     DMA2D->CR &= ~(DMA2D_CR_START);                             //先停止DMA2D  

  17.     DMA2D->CR = DMA2D_R2M;                                      //寄存器到存储器模式  

  18.     DMA2D->OPFCCR = LTDC_PIXEL_FORMAT_RGB565;                   //设置颜色格式  

  19.     DMA2D->OOR = 0;                                             //设置行偏移  

  20.     DMA2D->OMAR = uhLtdcFrameBuf;                               //输出存储器地址  

  21.     DMA2D->NLR = (ey - sy + 1) | ((ex - sx + 1) << 16);         //设定行数寄存器  

  22.     DMA2D->OCOLR = Colour;                                      //设定输出颜色寄存器  

  23.     DMA2D->CR |= DMA2D_CR_START;                                //启动DMA2D  

  24.     while((DMA2D->ISR & DMA2D_FLAG_TC) == 0);                   //等待传输完成  

  25.     DMA2D->IFCR |= DMA2D_FLAG_TC;                               //清除传输完成标志  

  26. }  

  27.   

  28. void LcdInit(void)  

  29. {  

  30.     LCD_BIAS_LIGHT_ENALBE;                                      //使能LCD背光  

  31.     LcdClear(0, 0, 479, 271, 0xFFFF);                           //清屏全白,0xFFFF是全白  

  32. }  

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

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


推荐阅读

史海拾趣

Dowosemi公司的发展小趣事

在电子保护器件领域,Dowosemi公司以其创新的TVS二极管技术崭露头角。该公司研发团队经过数年的努力,成功开发出具有PS级响应速度、大瞬态功率和低漏电流的TVS二极管。这一技术突破大大提高了产品的性能,满足了市场对高效能过电压保护元件的需求。Dowosemi公司凭借这一优势,迅速在市场上确立了领先地位。

Grand Halo Technology Co Ltd公司的发展小趣事

在电子保护器件领域,Dowosemi公司以其创新的TVS二极管技术崭露头角。该公司研发团队经过数年的努力,成功开发出具有PS级响应速度、大瞬态功率和低漏电流的TVS二极管。这一技术突破大大提高了产品的性能,满足了市场对高效能过电压保护元件的需求。Dowosemi公司凭借这一优势,迅速在市场上确立了领先地位。

埃派克森微电子(Apexone)公司的发展小趣事

自2002财年以来,埃派克森微电子的业绩呈现出连续增长的态势。公司凭借出色的产品性能和市场竞争力,成功打入多家国内外知名企业,逐渐在目标市场占据了一席之地。经过数年的发展,埃派克森在全球模拟芯片供应商中已占据重要地位,其产品在通讯核心芯片、多媒体电子、消费电子、汽车电子等领域均有着广泛的应用。

百佳(BAIJIA)公司的发展小趣事

在多年的发展过程中,百佳公司始终坚守品质至上的原则。他们严格把控产品质量,从原材料采购到生产制造的每一个环节都进行严格的监控和检测。同时,百佳公司还注重提升客户服务水平,为客户提供及时、专业的技术支持和售后服务。正是这种对品质的坚持和对客户的尊重,使得百佳公司赢得了广大客户的信赖和长期合作。

这五个故事只是百佳公司在电子行业发展中的一部分缩影。它们展示了百佳公司从初创时期的艰苦与坚持,到抓住市场机遇迅速崛起,再到技术创新引领发展、拓展国际市场实现全球化布局,以及坚持品质至上赢得客户信赖的完整历程。这些故事不仅见证了百佳公司的成长和成功,也展现了电子行业的蓬勃发展和无限可能。

Bogen Communications Inc公司的发展小趣事

Bogen Communications Inc公司起初只是一个小型的电子设备制造商,但公司高层看到了市场的巨大潜力,决心进行市场拓展。通过精准的市场定位和有效的营销策略,公司成功地将产品打入多个国家和地区。同时,公司还注重品牌建设,通过提升产品质量、优化客户服务等方式,逐渐树立了良好的品牌形象。

Computer Conversions Corp公司的发展小趣事

随着公司技术的成熟和知名度的提升,Computer Conversions Corp开始将目光投向国际市场。公司派出专业的市场拓展团队,深入欧洲、亚洲等多个地区进行市场调研。经过一系列精准的市场分析和产品定位,公司成功地将产品推向了全球市场。这一过程中,他们不仅赢得了众多国际客户的信赖,还通过与当地企业的合作,进一步提升了品牌的影响力和市场份额。

问答坊 | AI 解惑

图形点阵液晶显示模块介绍

图形点阵液晶显示模块介绍 [ 打印 ] [ 返回 ] 1.概述 ZJM12864BSBD是一低功耗的点阵图形式LCD模块。 1)显示格式:128点(列) × 64 点(行)。 2)显示类型:STN 黄绿模式、半反半透、6:00视角、正向显示。 3)驱动方式:1/64占 ...…

查看全部问答>

数码管字形码自动生成器

这是一款非常小巧实用的软件,可以快速计算出任意接法的8段数码管字形码,很不错的东西,拿出来分享分享…

查看全部问答>

PCB板型

如何用ProtelDXP将pcb板型设计成大半圆形(即圆形切掉了一小部分),是板子的外观。我知道在机械层放置圆圆弧可以。我的意思是能不能利用重新定义板型把PCB板画成大半圆形状?…

查看全部问答>

高分征解:初学者学FPGA应该遵循什么样的路线,注意些什么?

在这方面是个文盲,买了块Altera Cyclone II 的开发板,想由简单的开始学习一些模块,但我对开发SOC很感兴趣,未来也有这种需求。需要的模块至少有:简单的CPU,中断控制器(2个中断就行了),定时器/计数器,PWM输出,简单的URAT,简 ...…

查看全部问答>

如何快速显示对话框的背景图片?

我使用2440+wince5.0的平台,显示器的分辨率为800*480,我在对话框中使用一个800*480的256色的bmp文件作为对话框的背景图片,在OnPaint函数中将背景图片贴上,代码如下: void CMainMenuDlg::OnPaint() {          & ...…

查看全部问答>

月薪1w以上的Linux内核专家需具备怎样的条件?

如题 用1w月薪聘请Linux内核专家的公司多不多? 成为Linux内核具备的条件是什么? 1、精通内核移植、裁剪和优化 2、精通一个领域的ARM驱动开发(比如说VOIP) 符合这两个条件够不够?要不要懂编译器的编写等知识?…

查看全部问答>

有没有FSMC的中文文档

                                 FSMC最近看的晕里糊涂的?有没有什么中文文档而且讲清楚一点的呢?有的话,哪位说一说在哪里?…

查看全部问答>

为什么keil无法编译

我最近在做一个SMbus的红外测温写了一个程序但不知道为什么无法编译。。求大侠们指点啊具体代码如下啊#include <reg51.h>#include\"intrins.h\"//************************************ #define    uint unsigned int#defi ...…

查看全部问答>

具有温湿度显示、报警功能的数字时钟

根据实际情况进行功能的扩展,如添加定时功能。…

查看全部问答>

提问+三维场景如何建立

小弟最近在做手势识别方面的试验,不知道像下图这样的三维场景如何建立呢。 查了资料,基本都是OpenGL的,但是目测有点难呢,教程怎么都是2002年左右的呀,正在纳闷难道就没更新了。坛子里的前辈们,有哪位能给指点下的,谢谢啦。 …

查看全部问答>