STM32 RGB屏幕

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

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

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

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

RGBLCD的信号线如下表:

STM32 RGB屏幕

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

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

RGBLCD接口的原理图如下:

STM32 RGB屏幕

除了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;                        //水平后沿宽度:40
    hltdc.Init.AccumulatedVBP = 8;                        //垂直后沿宽度:8
    hltdc.Init.AccumulatedActiveW = 520;                //显示有效宽度:520-40=480
    hltdc.Init.AccumulatedActiveH = 280;                //显示有效高度:280-8=272
    hltdc.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*恒定alpha
    pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;    //混合洗漱2:像素alpha*恒定alpha
    pLayerCfg.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);                             //先停止DMA2D
    DMA2D->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;                                //启动DMA2D
    while((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清屏成全白的测试。文章来源地址https://www.toymoban.com/news/detail-493046.html

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

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

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

相关文章

  • 通过STM32使用PWM实现的RGB调光

    最近看看,买的器材发现还有一个RGB灯,想了一下发现可以用PWM来实现一个RGB的调光 首先就是PWM,PWM就是脉冲调制,是一种控制信号的占空比,是指在一秒内,信号从高电平到低电平在回到高电平的次数表示为一个周期。 下面就是PWM配置的代码 通过上述代码配置好当前的

    2024年04月22日
    浏览(71)
  • 基于stm32物联网开发板(2)--LCD屏幕

    LCD应用展示: LCD屏幕应用 屏幕尺寸为1.3寸,分辨率240*240,颜色格式RGB565,驱动IC:ST7789VW; 超大可视角度:大于160°(显示屏中可视角度最大的一种屏幕); 宽电压供电(3V~5V),兼容3.3V和5V电平逻辑,无需电平转换芯片; 采用7线制SPI接口; 工作温度范围为工业级(-20℃~60℃); 军工

    2024年02月04日
    浏览(44)
  • 使用vscode + gcc进行 STM32 单片机开发(一)编译及调试

    众所周知,单片机MCU的开发通常是使用keil来进行的,但是keil作为一款有几十年历史的IDE,bug层出不穷,界面也越来越丑,加上使用盗版jlink,导致keil各种崩溃卡死。 故越来越多的单片机IDE也如雨后春笋般冒出,例如 st官方出版的st studio、rt-thread出版的rt-studio,至于好不好用

    2023年04月08日
    浏览(50)
  • 【STM32】STM32F411RET6(NUCLEO)开发板基于HAL库创建工程模板及屏幕驱动

    驱动单色0.96英寸七针OLED 显示屏 串口调试等功能 本文如题采用STM32F411RET6(NUCLEO)开发板如图所示。 开发环境使用MDK(keil5)和STM32CubeMX,不了解的同学可以去百度一下。 首先选择对应的开发板型号,然后进入图形化配置界面。 第一步是时钟配置,每个板子在不考虑功耗的情况下

    2024年02月09日
    浏览(46)
  • 使用Simulink代码生成工具基于STM32开发板对永磁同步电机进行开环控制

    代码链接:【免费】使用Simulink代码生成工具对永磁同步电机进行开环控制资源-CSDN文库 本文介绍使用Simulink代码生成功能在STM32开发板平台上运行永磁同步电机。 硬件基础: Nucleo-G431RB开发板 X-NUCLEO-IHM07M1驱动扩展板 57BLDC-24V-210W时代超群直流电机 软件基础: MATLAB 2022b 安装

    2023年04月14日
    浏览(63)
  • STM32初学入门笔记(5):使用STM32CubeMX通过SPI,IIC驱动OLED屏幕

    随着时代的进步,OLED显示屏成为了继LCD显示屏之后的新一代显示屏技术,OLED具有可视角高,功耗低,厚度薄,耐冲击、振动能力强,像素响应时间低等优点,在嵌入式开发中,OLED显示器也是一个主要的部分,制作OLED显示模块的驱动也是学习STM32路上的重要一部分,本篇将从

    2024年02月04日
    浏览(44)
  • STM32 驱动4.3寸TFT LCD 触摸屏

    STM32的FSMC接口是并行总线接口,可以用于驱动存储芯片如FLASH/SRAM等,也可以用于驱动并口LCD屏。触摸屏是在显示屏上覆盖一层触摸感应的外屏,有单独的接口输出坐标数据。 这里以STM32F103VET6开发板连接4.3寸TFT LCD触摸屏,将正点原子的参考代码,移植到STM32CUBEIDE开发环境,实

    2024年02月11日
    浏览(43)
  • FPGA驱动RGB888屏幕——基于正点原子达芬奇FPGA开发板

    RGB888简介 一个像素点由三种颜色控制,每个颜色8bit,共24bit,三个字节,这就是RGB888。同样的还有RGB565等。 LCD屏幕介绍 1、HSYNC(水平同步信号、行同步信号):产生此信号,说明开始显示新的一行。 2、VSYNC(垂直同步信号、帧同步信号):当产生此信号的话就表示开始显示

    2024年02月04日
    浏览(48)
  • STM32 FSMC接口驱动4.3寸TFT LCD屏

    STM32的FSMC接口是并行总线接口,可以用于驱动存储芯片如FLASH/SRAM等,也可以用于驱动并口LCD屏。 这里以STM32F103VET6开发板连接4.3寸TFT LCD屏,将正点原子的参考代码,移植到STM32CUBEIDE开发环境,实现TFT LCD屏的显示。 TFT LCD模块的管脚连接: 其中: LCD_CS是总线片选, WR/CLK是写使

    2024年02月10日
    浏览(49)
  • [FOC-Simulink]使用Simulink代码生成工具基于STM32开发板对永磁同步电机进行开环控制

    代码链接:【免费】使用Simulink代码生成工具对永磁同步电机进行开环控制资源-CSDN文库 本文介绍使用Simulink代码生成功能在STM32开发板平台上运行永磁同步电机。 硬件基础: Nucleo-G431RB开发板 X-NUCLEO-IHM07M1驱动扩展板 57BLDC-24V-210W时代超群直流电机 软件基础: MATLAB 2022b 安装

    2024年02月13日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包