STM32 RGB屏幕

news2024/10/6 12:25:15

使用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;                        //水平后沿宽度: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清屏成全白的测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/668824.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue----Vue项目的目录结构

【原文链接】Vue----Vue项目的目录结构 Vue 项目的目录结构 VUE项目的目录结构如下所示 .vscode VSCode工具的配置文件&#xff0c;和VUE项目没有什么关系 node_modules VUE项目运行依赖文件&#xff0c;通过npm install 安装的文件即存放在此文件夹 public 资源文件夹&am…

【现代密码学】(网安)期末复习笔记

现代密码学 【考后感悟】还是得注重简答题&#xff0c;需每个密码算法都要有所了解&#xff08;有些难的可以不用了解完整算法过程&#xff0c;估计考不上&#xff1f;&#xff09;&#xff0c;并对几个重要密码算法&#xff08;重点下面会讲&#xff09;着重复习&#xff08;会…

部署kubernets v1.27.3集群

本文将演示如何使用kubeadm快速部署一个Kubernetes v1.27.1集群&#xff0c;并会简单说明如何在集群上部署nginx容器 主机环境预设 本示例中的Kubernetes集群部署将基于以下环境进行。 OS: Ubuntu 20.04 Kubernetes&#xff1a;v1.27.3 Container Runtime: Docker CE 23.0.…

【并发编程】深入探索AQS

文章目录 一、AQS 介绍二、通过ReentrantLock分析AQS的实现2.1、获取锁流程2.2、获取锁源码分析2.2.1、acquire2.2.2、tryAcquire2.2.3、addWaiter2.2.4、acquireQueued2.2.5、shouldParkAfterFailedAcquire 2.3、解锁源码分析2.3.1、unlock2.3.2、release2.3.3、tryRelease2.3…

实验篇(7.2) 17. 站对站安全隧道 - FortiGate作为SSL客户端(SSL) ❀ 远程访问

【简介】虽然常用的站到站的连接用的是IPsec VPN&#xff0c;但是在某些特殊情况下&#xff0c;UDP500或4500端口被阻断&#xff0c;IPsec VPN无法连接&#xff0c;那么还有其它办法实现站到站的连接吗&#xff1f;SSL VPN也可以的。 实验要求与环境 OldMei集团深圳总部部署了域…

NodeJS File Upload⑩

文章目录 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持&#x1f618;前言文件上传 后端接口 Form表单上传 Axios前后端分离上传 实现效果演示 记录 读取图片文件总结 ✨文章有误请指正&#xff0c;如果觉得对你有用&a…

RK3568平台开发系列讲解(外设篇)四线风扇驱动实验

🚀返回专栏总目录 文章目录 一、硬件连接二、原理图分析三、驱动适配3.1、内核配置3.2、修改设备树3.3、实验沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们将讲解四线风扇的使用。 一、硬件连接 风扇模块如下所示,黑线是负,红线是正,黄线是测速,蓝线是…

算法——字符串匹配算法——BM(Boyer-Moore) 算法

字符串匹配算法——BM &#xff08;Boyer-Moore&#xff09; 算法 概述场景一 坏字符场景且模式串中没有匹配字符场景二 坏字符场景且模式串中有匹配字符场景三 好后缀场景且模式串中没有匹配字符场景四 好后缀场景且模式串中有匹配字符场景五 好后缀场景且模式串中有匹配子串后…

EfficientDet-pytorch目标检测训练

目录 1. EfficientDet-pytorch版本代码下载 2.数据集准备 2.1数据集格式 2.2 定义自己数据集的yml文件 3. 训练配置 4.模型评估 5.测试模型性能 1. EfficientDet-pytorch版本代码下载 GitHub - zylo117/Yet-Another-EfficientDet-Pytorch: The pytorch re-implement…

chatgpt赋能python:Python提取指定数据的方法与技巧

Python提取指定数据的方法与技巧 在SEO优化中&#xff0c;数据的提取和分析是非常重要的环节之一。而Python具有方便易用的数据处理能力&#xff0c;成为了SEO优化工程师们的重要工具之一。本文将介绍Python中提取指定数据的方法与技巧&#xff0c;以及实现的具体案例。 数据…

python:使用Scikit-image库进行单波段遥感图像颜色直方图特征提取(histogram)

作者:CSDN @ _养乐多_ 本文记录了使用Scikit-image库对单波段遥感图像做颜色直方图特征提取的代码。 文章目录 一、颜色直方图特征详解二、代码一、颜色直方图特征详解 颜色直方图是一种用于描述图像中颜色分布的特征表示方法。它将图像中每个像素的颜色值作为输入,统计并显…

Java 基础进阶篇(十七):反射概述及获取对象的方式

文章目录 一、反射概述二、反射获取类对象三、反射获取构造器对象四、反射获取成员变量对象五、反射获取方法对象六、 反射的作用6.1 绕过编译阶段为集合添加数据6.2 通用框架的底层原理 一、反射概述 反射是指对于任何一个Class类&#xff0c;在 “运行的时候”&#xff0c;不…

PHP实战开发23-PHP结合Nginx获取用户真实IP地址

文章目录 一、前言二、关于用户IP的背景知识2.1 HTTP请求2.2 HTTP代理服务器2.3 X-Forwarded-For头部 三、代码实现3.1 Nginx配置3.2 PHP代码处理 总结 一、前言 本文已收录于PHP全栈系列专栏&#xff1a;PHP快速入门与实战 在Web应用程序中&#xff0c;IP地址是常见的数据项…

Flink 学习四 Flink 基础架构

Flink 学习四 Flink 基础架构&算子链&槽位 文章大部分数据来源 : https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/concepts/flink-architecture/ Flink 是一个分布式系统,需要有效的分配和管理计算资源才可以执行流式程序; 集成了常见的资源管理…

chatgpt赋能python:Python简介

Python简介 Python是一种高级编程语言&#xff0c;具有易读性和简洁性的特点。它被广泛使用于Web开发、数据科学、人工智能、机器学习和自动化测试等领域。Python也是一种非常适合新手学习编程的语言。 在本篇文章中&#xff0c;我们将讨论如何使用Python提取指定内容以进行S…

【BMS】电池包硬件方案选型指南

🔋电池包硬件方案选型指南🔋 BMS硬件系统需求主要包括:测温模块、测流模块、测压模块、系统电源、保护电路、故障检测电路,本文阐述各个功能模块在不同场景下的电池包硬件系统方案选择。 一、测温 NTC(热敏电阻) 电池包测温一般包括表皮温度、内部温度、PCB温度(极片布…

[自定义组件]微信小程序自定义组件实现缩略图和原图分离及可缩放效果

目录 目标及基础环境背景 实现原理左右滑动缩放图片菜单 开发实现自定义组件wxml组件结构wxss 样式控制js定义属性及回调json声明为组件 使用添加组件声明及地址声明为全局组件(也可声明为局部)声明为全局组件&#xff08;也可以声明为全局组件&#xff09;使用组件 效果展示 附…

pycharm安装, 汉化 , 使用教程

目录 1.下载安装包 2.汉化 3.使用 1.下载安装包 访问Pycharm官网 根据自己的操作系统下载对应版本的Pycharm Community或Professional Edition。 2.汉化 点击“file”选项&#xff0c;然后点击“setting”&#xff0c;再点击“plugins”选项&#xff1b; 输入“Chinese”找…

使用Frp进行反向代理实现远程桌面控制[teamviewer/nomachine]

.使用Frp进行反向代理实现远程桌面控制 V1.0.0 – by Holden Date : 2023-06-20 文章目录 .使用Frp进行反向代理实现远程桌面控制1. 简介2. 工具准备3. 服务器端搭建4. 受控端配置&&运行teamviewer5. 控制机端运行teamviewer6. 切换成nomachine 1. 简介 ​ frp 是一…

winform多语言资源管理

SailingEase WinForm Framework WinForm开发框架开发手册&#xff1a;http://docs.shengxunwei.com/Home/Browser/sewinformfw/ 这是我2010年左右&#xff0c;写 Winform IDE &#xff08;使用 .NET WinForm 开发所见即所得的 IDE 开发环境&#xff0c;实现不写代码直接生成应用…