STM32-LCD液晶屏(ILI9341)

news2024/11/23 15:42:14

MCU:STM32F103VET6

开发环境:STM32CubeMX+MDK5

目录

STM32液晶屏LCD(ILI9341)

LCD液晶显示

液晶控制原理

ILI9341液晶控制器简介

8080写时序

8080读时序

FSMC模拟8080时序

液晶屏的信号线

STM32CubeMX配置FSMC

测试部分

知识点分析


STM32液晶屏LCD(ILI9341)

本文章使用STM32F103VET6,野火指南者的3.2寸电阻屏,进行学习。

LCD液晶显示

针对野火指南者配套资料:3.2寸 LCD电阻屏,屏幕里自带ILI9341液晶控制器芯片,该控制器芯片中存在GRAM(即显存)。该液晶控制器使用8080接口与单片机通讯,液晶面板引出来的FPC信号线为8080接口,单片机把要显示的数据通过引出的8080接口发送到液晶控制器,要显示的数据存储到它内部的显存中,然后液晶控制器不断把显存的内容刷新到液晶面板,显示内容。

还有个电阻触摸屏的控制器XPT2046,实际上是一个ADC芯片,通过检测电压值来计算触摸坐标。

液晶屏的每个像素点都是数据,在实际应用中需要把每个像素点的数据缓存起来,再传输给液晶屏,一般会使用SRAM和SDRAM性质的存储器,而这些专门用于存储显示数据的存储器,被称为显存。显存一般至少要能存储一帧显示数据,如分辨率为800*480的液晶屏,若使用RGB888格式显示,一帧数据大小 = 3 * 800 * 480 = 1152000字节;若使用RGB565格式显示,一帧数据大小 = 2 * 800 * 480 = 768000字节。

一般来说,外置的液晶控制器会自带显存,而像STM32F429等集成液晶控制器的芯片可使用内部SRAM或外扩SDRAM用于显存空间。

液晶控制原理

因为控制液晶面板需要比较多的资源,所以大部分低级微处理器都不能直接控制液晶面板,需要额外配套一个专用液晶控制器来处理显示过程,外部微控制器只要把它希望显示的数据直接交给液晶控制器即可。而不带液晶控制器的PCB底板,只有小部分的电源管理电路,液晶面板的信号线与外部微控制器相连,直接控制。

STM32F429系列的芯片不需要额外的液晶控制器,即它把专用液晶控制器的功能集成到STM32F429芯片内部了,节省了额外的控制器成本。而STM32F1系列的芯片由于没有继承液晶控制器到芯片内部,所以只能驱动只带控制器的屏幕。

ILI9341液晶控制器简介

内部结构复杂。芯片中含有GRAM(即显存),GRAM中每个存储单元都对应液晶面板的一个像素点。通过液晶控制器内部各种模块共同作用把GRAM存储单元的数据转化为液晶面板的控制信号,使像素点呈现特定的颜色,而像素点组合起来则成为了一幅完整的图像。

ILI9341液晶控制器根据自身的IM[3:0]信号线电平决定了它与MCU的通讯方式支持SPI、8080通讯方式。野火指南者中固定搭配8080(内部硬件电路处理)使用16根数据线的RGB565格式。即当IM[3:0]=0x8时,MCU接口模式为8080 MCU 16-bit bus interface II

8080写时序

8080读时序

FSMC模拟8080时序

因为8080时序与FSMC(SRAM,NorFlash等)时序类似,所以只需将ILI9341液晶控制器当成一个存储器来使用。这样STM32就可以通过FSMC外设与ILI9341液晶控制器通信。

Tips:

        百度上都是使用NorFlash的FSMC模式B时序模拟8080时序,但是其实SRAM的FSMC模式A时序模拟8080时序也是可行的。如果有读者有详细的说法可以在评论区更详细的展开

液晶屏的信号线

FSCM_D[15:0]:数据信号。

FSMC_NE1:片选信号,低电平有效。

FSMC_NOE:读数据信号,低电平有效。

FSMC_NWE:写数据信号,低电平有效。

FSMC_RS:数据/命令信号。

        高电平时,D[15:0]表示的是数据(RGB像素数据或命令数据)

        低电平时,D[15:0]表示的是控制命令

LCD_RST:复位信号,低电平有效。

LCD_BL:背光信号,低电平有效。

LCD_TP:用于触摸屏的,它们是直接连接到xpt2046(触摸控制芯片),此处不讲。

STM32CubeMX配置FSMC

常规配置不展开,配置主频为72MHz。记住额外配置引脚(推挽输出):PE1-LCD_RST、PD12-LCD_BL。

HCLK周期:HCLK配置为72MHz,即一个HCLK周期为1/72us = 13.8ns

13.8 * 26 = 358.8 > 355ns

13.8 * 1 = 13.8 > 10ns 

测试部分

添加工程主目录下添加UserCode文件夹,将野火《液晶显示》的bsp_ili9341.c、bsp_ili9341.h、fonts.c和fonts.h文件放入文件夹中。

ILI9341_Init函数中注释掉ILI9341_GPIO_Config();ILI9341_FSMC_Config();

然后main函数中调用ILI9341_Init();

然后在添加测试函数:LCD_Test();

Tips:需要把编译优化等级跳-O0或-O1才能正常显示。-O2会出现碎花屏,-O3会出现白屏。 

实验现象:

知识点分析

在FSMC中,Bank1一个存储块有4个区,每个区可以扩展SRAM或者NorFlash存储器,相当于一个Bank1可以扩展4个SRAM或者NorFlash存储器

实验中使用了FSNC_NE1作为片选引脚。即选择了FSMC的Bank1的第一区,地址范围是0x6000 0000 - 0x63FF FFFF

使用了D0~D15数据线,数据宽度16bit。即HADDR[25:1]与FSMC_A[24:0]对应连接,HADDR[0]未接。

        相当于:

                FSMC的地址为1时,对应HADDR的地址为10。

                FSMC的地址为10时,对应HADDR的地址为100。

        可发现,相对于FSMC地址,HADDR左移一位,即*2。

FSMC_A16接LCD的D/C引脚。

当A16高电平时,D[15:0]为数据。所以控制地址线A16输出1,则0x6000 0000 | (1<<17) = 0x6002 0000。这相当于数据地址

当A16低电平时,D[15:0]为命令。所以控制地址线A16输出0,则0x6000 0000 | (0<<17) = 0x6000 0000。这相当于命令地址

因此,

/***************************************************************************************
2^26 =0X0400 0000 = 64MB,每个 BANK 有4*64MB = 256MB
64MB:FSMC_Bank1_NORSRAM1:0X6000 0000 ~ 0X63FF FFFF
64MB:FSMC_Bank1_NORSRAM2:0X6400 0000 ~ 0X67FF FFFF
64MB:FSMC_Bank1_NORSRAM3:0X6800 0000 ~ 0X6BFF FFFF
64MB:FSMC_Bank1_NORSRAM4:0X6C00 0000 ~ 0X6FFF FFFF
****************************************************************************************/

/******************************* ILI9341 显示屏的 FSMC 参数定义 ***************************/
//FSMC_Bank1_NORSRAM用于LCD命令操作的地址
#define      FSMC_Addr_ILI9341_CMD         ( ( uint32_t ) 0x60000000 )

//FSMC_Bank1_NORSRAM用于LCD数据操作的地址
#define      FSMC_Addr_ILI9341_DATA        ( ( uint32_t ) 0x60020000 )

/**
  * @brief  向ILI9341写入命令
  * @param  usCmd :要写入的命令(寄存器地址)
  * @retval 无
  */
void ILI9341_Write_Cmd(uint16_t usCmd)
{
    * (__IO uint16_t *)(FSMC_Addr_ILI9341_CMD) = usCmd;
}

/**
  * @brief  向ILI9341写入数据
  * @param  usData :要写入的数据
  * @retval 无
  */
void ILI9341_Write_Data(uint16_t usData)
{
    * (__IO uint16_t *)(FSMC_Addr_ILI9341_DATA) = usData;
}

/**
  * @brief  从ILI9341读取数据
  * @param  无
  * @retval 读取到的数据
  */
uint16_t ILI9341_Read_Data(void)
{
    return (* (__IO uint16_t *)(FSMC_Addr_ILI9341_DATA));
}

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

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

相关文章

工作玩手机监测识别摄像机

工作场所的员工玩手机已经成为了一种常见的现象&#xff0c;特别是在办公室、生产车间等地方。而这种现象不仅仅影响了员工的工作效率&#xff0c;还可能会对工作安全造成一定的隐患。为了监测和识别员工玩手机的情况&#xff0c;工作玩手机监测识别摄像机应运而生。工作玩手机…

05 | 如何确保消息不会丢失?

检测消息丢失的方法 我们可以利用消息队列的有序性来验证是否有消息丢失。在 Producer 端,我们给每个发出的消息附加一个连续递增的序号,然后在 Consumer 端来检查这个序号的连续性。 如果没有消息丢失,Consumer 收到消息的序号必然是连续递增的,或者说收到的消息,其中的…

物联网实战--平台篇之(六)应用管理后台

目录 一、应用数据库 二、登录记忆 三、新建应用 四、获取应用列表 五、重命名应用 本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_126313…

2024统计建模成品论文39页(附带完整数据集和代码)

2024统计建模成品论文完整版一等奖论文【1.5w字全网最佳】2024统计建模大赛高质量成品论文39页配套完整代码运行全套数据集https://www.jdmm.cc/file/2710661/

华为配置带反射器的iNOF功能实验

配置带反射器的iNOF功能示例 适用产品和版本 安装了SAN系列单板的CE16800系列交换机V300R020C10或更高版本。 安装了P系列单板的CE16800系列交换机V300R021C00或更高版本。 CE6866、CE6866K、CE8851-32CQ8DQ-P、CE8851K系列交换机V300R020C00或更高版本。 CE6860-SAN、CE8850-S…

【全开源】商会招商项目系统基于FastAdmin+ThinkPHP+Uniapp(源码搭建/上线/运营/售后/维护更新)

一款基于FastAdminThinkPHPUniapp开发的商会招商项目系统&#xff0c;是一个集PC和移动端功能于一体的解决方案&#xff0c;线上线下进行服务&#xff0c;围绕 活动报名、在线课程、项目大厅、线下签到、会员系统等。为商会提供了更加便捷高效的管理方式&#xff0c;提升了商会…

python数据分析——seaborn绘图1

参考资料&#xff1a;活用pandas库 matplotlib库是python的和兴绘图工具&#xff0c;而seaborn基于matplotlib创建&#xff0c;它为绘制统计图提供了更高级的接口&#xff0c;使得只用少量代码就能生成更美观、更复杂的可视化效果。 seaborn库和pandas以及其他pydata库&#xf…

括号匹配(栈)

20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; c有栈 但是C语言没有 到那时我们可以自己造 这里的代码是直接调用栈&#xff0c;然后调用 等于三个左括号的任意一个 我们就入栈 左括号&#xff08;入栈&#xff09; 右括号 取出栈顶数据&#xff0c;出栈并且进行匹配…

用Transformers实现简单的大模型文本生成

根据输入的prompt&#xff0c;生成一段指定长度的文字。Llama跑起来太慢了&#xff0c;这里用GPT-2作为列子。 from transformers import GPT2LMHeadModel, GPT2Tokenizer import torchtokenizer GPT2Tokenizer.from_pretrained("gpt2") model GPT2LMHeadModel.fr…

Java 实现Mybatis plus 批量删除

数据库实体字段并不映射的情况&#xff0c;直接请求体集合接收。 PostMapping("/removeIdsInfo")public R<Void> removeIdsInfo(RequestBody List<Integer> ids) {return exStudentService.removeIdsInfo(ids);} /**** 学生模块根据集合id 批量删除数据*…

BGP基础配置实验

BGP基础配置实验 一、实验拓扑 初始拓扑&#xff1a; 最终拓扑&#xff1a; 二、实验要求及分析 实验要求&#xff1a; 1&#xff0c;R1为AS 100区域&#xff1b;R2、R3、R4为AS 200区域且属于OSPF协议&#xff1b;R5为AS 300区域&#xff1b; 2&#xff0c;每个设备上都有…

AIM可以像 LLM 一样进行扩展的自回归图像模型

0.引言 AIM&#xff08;Autoregressive Image Model&#xff09;是一种自回归学习图像模型&#xff0c;它是对语言模型的图像版本进行了推广。该模型的预训练图像特征质量会随着模型大小和数据质量的提高而提高&#xff0c;从而带来更好的性能。同时&#xff0c;下游任务的性能…

Linux 中 alarm 函数详解

目录 简介函数原型函数参数返回值使用示例设置 3 秒闹钟修改闹钟与取消闹钟设置 1 秒周期定时器 更多内容 简介 alarm 函数的功能是设置一个闹钟&#xff08;定时器&#xff09;&#xff0c;当闹钟时间到时&#xff0c;内核会向当前进程发送一个 SIGALRM 信号。 打开 Linux 终…

AI智能体|手把手教你申请一个Kimi(Moonshot)的API KEY

大家好&#xff0c;我是无界生长。 今天分享一下如何申请一个Kimi(Moonshot)的API KEY&#xff0c;为后面Kimi(Moonshot)接入微信机器人做铺垫。学会了的话&#xff0c;欢迎分享转发&#xff01; 前提 拥有一个Kimi(Moonshot)账号 使用手机号注册即可&#xff0c;新用户可免费…

五、Linux二进制安装MariaDB 六、MariaDB主从复制

目录 五、Linux二进制安装MariaDB1 卸载mariadb1.1 卸载相关的服务(mysql和mariadb都查询一下)1.2 查找MySQL和mariadb相关的文件目录 2 安装mariadb2.1 mariadb下载地址2.2 将安装包放入到服务器中并解压 (我放到opt下)2.3 将解压后的目录移动到安装目录下2.4 创建数据目录(根…

【iOS】架构模式

文章目录 前言一、MVC二、MVP三、MVVM 前言 之前写项目一直用的是MVC架构&#xff0c;现在来学一下MVP与MVVM两种架构&#xff0c;当然还有VIPER架构&#xff0c;如果有时间后面会单独学习 一、MVC MVC架构先前已经详细讲述&#xff0c;这里不再赘述&#xff0c;我们主要讲一…

YOLOv9改进策略目录 | 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制

&#x1f451; YOLOv9有效涨点专栏目录 &#x1f451; 专栏视频介绍&#xff1a;包括专栏介绍、得到的项目文件、模型二次创新、权重文件的使用问题&#xff0c;点击即可跳转。 前言 Hello&#xff0c;各位读者们好 本专栏自开设两个月以来已经更新改进教程50余篇其中包含Re…

持续集成-Git

重要步骤命令 git init (初始化一个仓库) git add [文件名] (添加新的文件) git commit -m [关于本次提交的相关说明] (提交) git status (查看文件状态) git diff (如果文件改变&#xff0c;比较两个文件内容) git add[文件名] || git commit -a -m [关于本次提交的相关说…

Java入门1: 基础语法

Java入门1: 基础语法 MangoGO 芒狗狗 目录 1 基础语法1.1 Hello World1.2 常量1.3 数据类型1.4 String1.5 StringBuilder1.6 运算符1.7 位运算符1.8 逻辑运算符1.9 关系运算符1.10 练习&#xff1a;计算数字和1.11 关键字和语句1.12 流程控制1.13 数组1.14 用户输入操作参考代码…

WCF 双工 回调模式

wcfInterface 项目 》》》wcf服务端提供的服务协议 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.ServiceModel; namespace wcfInterface {[ServiceContract(CallbackContract typeo…