OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 25761|回复: 3

【正点原子探索者STM32F407开发板例程连载+教学】第18章 TFT LCD显示实验-FSMC

[复制链接]

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2014-12-6 12:09:10 | 显示全部楼层 |阅读模式

第十八章 TFT LCD显示实验


[mw_shl_code=c,true]1.硬件平台:正点原子探索者STM32F407开发板 2.软件平台:MDK5.1 3.固件库版本:V1.4.0 [/mw_shl_code]


上一章我们介绍了OLED模块及其显示,但是该模块只能显示单色/双色,不能显示彩色,而且尺寸也较小。本章我们将介绍ALIENTEK 2.8寸TFT LCD模块,该模块采用TFTLCD面板,可以显示16位色的真彩图片。在本章中,我们将使用探索者STM32F4开发板上的LCD接口,来点亮TFTLCD,并实现ASCII字符和彩色的显示等功能,并在串口打印LCD控制器ID,同时在LCD上面显示。本章分为如下几个部分:

18.1 TFTLCD & FSMC简介

18.2 硬件设计

18.3 软件设计

18.4 下载验证

 

18.1 TFTLCD&FSMC简介

本章我们将通过STM32F4的FSMC接口来控制TFTLCD的显示,所以本节分为两个部分,分别介绍TFTLCD和FSMC。

18.1.1 TFTLCD简介

TFT-LCD即薄膜晶体管液晶显示器。其英文全称为:Thin Film Transistor-Liquid Crystal Display。TFT-LCD与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。TFT-LCD也被叫做真彩液晶显示器。

上一章介绍了OLED模块,本章,我们给大家介绍ALIENTEK TFTLCD模块,该模块有如下特点:

1,2.4’/2.8’/3.5’/4.3’/7’ 5种大小的屏幕可选。

2,320×240的分辨率(3.5’分辨率为:320*480,4.3’和7’分辨率为:800*480)。

3,16位真彩显示。

4,自带触摸屏,可以用来作为控制输入。

本章,我们以2.8寸(其他3.5寸/4.3寸等LCD方法类似,请参考2.8的即可)的ALIENTEK TFTLCD模块为例介绍,该模块支持65K色显示,显示分辨率为320×240,接口为16位的80并口,自带触摸屏。

该模块的外观图如图18.1.1.1所示:



                 图18.1.1.1 ALIENTEK 2.8寸TFTLCD外观图

       模块原理图如图18.1.1.2所示:

图18.1.1.2  ALIENTEK 2.8寸TFTLCD模块原理图

TFTLCD模块采用2*17的2.54公排针与外部连接,接口定义如图18.1.1.3所示:


图18.1.1.3  ALIENTEK 2.8寸TFTLCD模块接口图

从图18.1.1.3可以看出,ALIENTEK TFTLCD模块采用16位的并方式与外部连接,之所以不采用8位的方式,是因为彩屏的数据量比较大,尤其在显示图片的时候,如果用8位数据线,就会比16位方式慢一倍以上,我们当然希望速度越快越好,所以我们选择16位的接口。图18.1.1.3还列出了触摸屏芯片的接口,关于触摸屏本章我们不多介绍,后面的章节会有详细的介绍。该模块的80并口有如下一些信号线:

       CS:TFTLCD片选信号。

       WR:向TFTLCD写入数据。

       RD:从TFTLCD读取数据。

       D[15:0]:16位双向数据线。

       RST:硬复位TFTLCD。

       RS:命令/数据标志(0,读写命令;1,读写数据)。

80并口在上一节我们已经有详细的介绍了,这里我们就不再介绍,需要说明的是,TFTLCD模块的RST信号线是直接接到STM32F4的复位脚上,并不由软件控制,这样可以省下来一个IO口。另外我们还需要一个背光控制线来控制TFTLCD的背光。所以,我们总共需要的IO口数目为21个。这里还需要注意,我们标注的DB1~DB8,DB10~DB17,是相对于LCD控制IC标注的,实际上大家可以把他们就等同于D0~D15,这样理解起来就比较简单一点。

ALIENTEK提供的2.8寸TFTLCD模块,其驱动芯片有很多种类型,比如有:ILI9341/ILI9325/RM68042/RM68021/ILI9320/ILI9328/LGDP4531/LGDP4535/SPFD5408/SSD1289/1505/B505/C505/NT35310/NT35510等(具体的型号,大家可以通过下载本章实验代码,通过串口或者LCD显示查看),这里我们仅以ILI9341控制器为例进行介绍,其他的控制基本都类似,我们就不详细阐述了。

ILI9341液晶控制器自带显存,其显存总大小为172800(240*320*18/8),即18位模式(26万色)下的显存量。在16位模式下,ILI9341采用RGB565格式存储颜色数据,此时ILI9341的18位数据线与MCU的16位数据线以及LCD GRAM的对应关系如图18.1.1.4所示:

图18.1.1.4  16位数据与显存对应关系图

从图中可以看出,ILI9341在16位模式下面,数据线有用的是:D17~D13和D11~D1,D0和D12没有用到,实际上在我们LCD模块里面,ILI9341的D0和D12压根就没有引出来,这样,ILI9341的D17~D13和D11~D1对应MCU的D15~D0。

这样MCU的16位数据,最低5位代表蓝色,中间6位为绿色,最高5位为红色。数值越大,表示该颜色越深。另外,特别注意ILI9341所有的指令都是8位的(高8位无效),且参数除了读写GRAM的时候是16位,其他操作参数,都是8位的,这个和ILI9320等驱动器不一样,必须加以注意。

接下来,我们介绍一下ILI9341的几个重要命令,因为ILI9341的命令很多,我们这里就不全部介绍了,有兴趣的大家可以找到ILI9341的datasheet看看。里面对这些命令有详细的介绍。我们将介绍:0XD3,0X36,0X2A,0X2B,0X2C,0X2E等6条指令。

首先来看指令:0XD3,这个是读ID4指令,用于读取LCD控制器的ID,该指令如表18.1.1.1所示:

顺序

控制

各位描述

HEX

RS

RD

WR

D15~D8

D7

D6

D5

D4

D3

D2

D1

D0

指令

0

1

XX

1

1

0

1

0

0

1

1

D3H

参数1

1

1

XX

X

X

X

X

X

X

X

X

X

参数2

1

1

XX

0

0

0

0

0

0

0

0

00H

参数3

1

1

XX

1

0

0

1

0

0

1

1

93H

参数4

1

1

XX

0

1

0

0

0

0

0

1

41H

表 18.1.1.1 0XD3指令描述

       从上表可以看出,0XD3指令后面跟了4个参数,最后2个参数,读出来是0X93和0X41,刚好是我们控制器ILI9341的数字部分,从而,通过该指令,即可判别所用的LCD驱动器是什么型号,这样,我们的代码,就可以根据控制器的型号去执行对应驱动IC的初始化代码,从而兼容不同驱动IC的屏,使得一个代码支持多款LCD。

       接下来看指令:0X36,这是存储访问控制指令,可以控制ILI9341存储器的读写方向,简单的说,就是在连续写GRAM的时候,可以控制GRAM指针的增长方向,从而控制显示方式(读GRAM也是一样)。该指令如表18.1.1.2所示:

顺序

控制

各位描述

HEX

RS

RD

WR

D15~D8

D7

D6

D5

D4

D3

D2

D1

D0

指令

0

1

XX

0

0

1

1

0

1

1

0

36H

参数

1

1

XX

MY

MX

MV

ML

BGR

MH

0

0

0

表 18.1.1.2 0X36指令描述

       从上表可以看出,0X36指令后面,紧跟一个参数,这里我们主要关注:MY、MX、MV这三个位,通过这三个位的设置,我们可以控制整个ILI9341的全部扫描方向,如表18.1.1.3所示:

控制位

效果
LCD扫描方向(GRAM自增方式)

MY

MX

MV

0

0

0

从左到右,从上到下

1

0

0

从左到右,从下到上

0

1

0

从右到左,从上到下

1

1

0

从右到左,从下到上

0

0

1

从上到下,从左到右

0

1

1

从上到下,从右到左

1

0

1

从下到上,从左到右

1

1

1

从下到上,从右到左

表18.1.1.3 MY、MX、MV设置与LCD扫描方向关系表

       这样,我们在利用ILI9341显示内容的时候,就有很大灵活性了,比如显示BMP图片,BMP解码数据,就是从图片的左下角开始,慢慢显示到右上角,如果设置LCD扫描方向为从左到右,从下到上,那么我们只需要设置一次坐标,然后就不停的往LCD填充颜色数据即可,这样可以大大提高显示速度。

       接下来看指令:0X2A,这是列地址设置指令,在从左到右,从上到下的扫描方式(默认)下面,该指令用于设置横坐标(x坐标),该指令如表18.1.1.4所示:

顺序

控制

各位描述

HEX

RS

RD

WR

D15~D8

D7

D6

D5

D4

D3

D2

D1

D0

指令

0

1

XX

0

0

1

0

1

0

1

0

2AH

参数1

1

1

XX

SC15

SC14

SC13

SC12

SC11

SC10

SC9

SC8

SC

参数2

1

1

XX

SC7

SC6

SC5

SC4

SC3

SC2

SC1

SC0

参数3

1

1

XX

EC15

EC14

EC13

EC12

EC11

EC10

EC9

EC8

EC

参数4

1

1

XX

EC7

EC6

EC5

EC4

EC3

EC2

EC1

EC0

表 18.1.1.4 0X2A指令描述

       在默认扫描方式时,该指令用于设置x坐标,该指令带有4个参数,实际上是2个坐标值:SC和EC,即列地址的起始值和结束值,SC必须小于等于EC,且0≤SC/EC≤239。一般在设置x坐标的时候,我们只需要带2个参数即可,也就是设置SC即可,因为如果EC没有变化,我们只需要设置一次即可(在初始化ILI9341的时候设置),从而提高速度。

       与0X2A指令类似,指令:0X2B,是页地址设置指令,在从左到右,从上到下的扫描方式(默认)下面,该指令用于设置纵坐标(y坐标)。该指令如表18.1.1.5所示:

顺序

控制

各位描述

HEX

RS

RD

WR

D15~D8

D7

D6

D5

D4

D3

D2

D1

D0

指令

0

1

XX

0

0

1

0

1

0

1

0

2BH

参数1

1

1

XX

SP15

SP14

SP13

SP12

SP11

SP10

SP9

SP8

SP

参数2

1

1

XX

SP7

SP6

SP5

SP4

SP3

SP2

SP1

SP0

参数3

1

1

XX

EP15

EP14

EP13

EP12

EP11

EP10

EP9

EP8

EP

参数4

1

1

XX

EP7

EP6

EP5

EP4

EP3

EP2

EP1

EP0

表 18.1.1.5 0X2B指令描述

在默认扫描方式时,该指令用于设置y坐标,该指令带有4个参数,实际上是2个坐标值:SP和EP,即页地址的起始值和结束值,SP必须小于等于EP,且0≤SP/EP≤319。一般在设置y坐标的时候,我们只需要带2个参数即可,也就是设置SP即可,因为如果EP没有变化,我们只需要设置一次即可(在初始化ILI9341的时候设置),从而提高速度。

接下来看指令:0X2C,该指令是写GRAM指令,在发送该指令之后,我们便可以往LCD的GRAM里面写入颜色数据了,该指令支持连续写,指令描述如表18.1.1.6所示:

顺序

控制

各位描述

HEX

RS

RD

WR

D15~D8

D7

D6

D5

D4

D3

D2

D1

D0

指令

0

1

XX

0

0

1

0

1

1

0

0

2CH

参数1

1

1

D1[15:0]

XX

……

1

1

D2[15:0]

XX

参数n

1

1

Dn[15:0]

XX

表 18.1.1.6 0X2C指令描述

       从上表可知,在收到指令0X2C之后,数据有效位宽变为16位,我们可以连续写入LCD GRAM值,而GRAM的地址将根据MY/MX/MV设置的扫描方向进行自增。例如:假设设置的是从左到右,从上到下的扫描方式,那么设置好起始坐标(通过SC,SP设置)后,每写入一个颜色值,GRAM地址将会自动自增1(SC++),如果碰到EC,则回到SC,同时SP++,一直到坐标:EC,EP结束,其间无需再次设置的坐标,从而大大提高写入速度。

       最后,来看看指令:0X2E,该指令是读GRAM指令,用于读取ILI9341的显存(GRAM),该指令在ILI9341的数据手册上面的描述是有误的,真实的输出情况如表18.1.1.7所示:

顺序

控制

各位描述

HEX

RS

RD

WR

D15~D11

D10

D9

D8

D7

D6

D5

D4

D3

D2

D1

D0

指令

0

1

XX

0

0

1

0

1

1

1

0

2EH

参数1

1

1

XX

dummy

参数2

1

1

R1[4:0]

XX

G1[5:0]

XX

R1G1

参数3

1

1

B1[4:0]

XX

R2[4:0]

XX

B1R2

参数4

1

1

G2[5:0]

XX

B2[4:0]

XX

G2B2

参数5

1

1

R3[4:0]

XX

G3[5:0]

XX

R3G3

参数N

1

1

按以上规律输出

表 18.1.1.7 0X2E指令描述

       该指令用于读取GRAM,如表18.1.1.7所示,ILI9341在收到该指令后,第一次输出的是dummy数据,也就是无效的数据,第二次开始,读取到的才是有效的GRAM数据(从坐标:SC,SP开始),输出规律为:每个颜色分量占8个位,一次输出2个颜色分量。比如:第一次输出是R1G1,随后的规律为:B1R2àG2B2àR3G3àB3R4àG4B4àR5G5... 以此类推。如果我们只需要读取一个点的颜色值,那么只需要接收到参数3即可,如果要连续读取(利用GRAM地址自增,方法同上),那么就按照上述规律去接收颜色数据。

       以上,就是操作ILI9341常用的几个指令,通过这几个指令,我们便可以很好的控制ILI9341显示我们所要显示的内容了。

一般TFTLCD模块的使用流程如图18.1.1.5:

图18.1.1.5 TFTLCD使用流程

       任何LCD,使用流程都可以简单的用以上流程图表示。其中硬复位和初始化序列,只需要执行一次即可。而画点流程就是:设置坐标à写GRAM指令à写入颜色数据,然后在LCD上面,我们就可以看到对应的点显示我们写入的颜色了。读点流程为:设置坐标à读GRAM指令à读取颜色数据,这样就可以获取到对应点的颜色数据了。

       以上只是最简单的操作,也是最常用的操作,有了这些操作,一般就可以正常使用TFTLCD了。接下来我们将该模块用来来显示字符和数字,通过以上介绍,我们可以得出TFTLCD显示需要的相关设置步骤如下:

1)设置STM32F4与TFTLCD模块相连接的IO

这一步,先将我们与TFTLCD模块相连的IO口进行初始化,以便驱动LCD。这里我们用到的是FSMC,FSMC将在18.1.2节向大家详细介绍。

2)初始化TFTLCD模块。

即图18.1.1.5的初始化序列,这里我们没有硬复位LCD,因为探索者STM32F4开发板的LCD接口,将TFTLCD的RST同STM32F4的RESET连接在一起了,只要按下开发板的RESET键,就会对LCD进行硬复位。初始化序列,就是向LCD控制器写入一系列的设置值(比如伽马校准),这些初始化序列一般LCD供应商会提供给客户,我们直接使用这些序列即可,不需要深入研究。在初始化之后,LCD才可以正常使用。

3)通过函数将字符和数字显示到TFTLCD模块上。

这一步则通过图18.1.1.5左侧的流程,即:设置坐标à写GRAM指令à写GRAM来实现,但是这个步骤,只是一个点的处理,我们要显示字符/数字,就必须要多次使用这个步骤,从而达到显示字符/数字的目的,所以需要设计一个函数来实现数字/字符的显示,之后调用该函数,就可以实现数字/字符的显示了。

18.1.2 FSMC简介

STM32F407或STM32F417系列芯片都带有FSMC接口,ALIENTEK探索者STM32F4开发板的主芯片为STM32F407ZGT6,是带有FSMC接口的。

FSMC,即灵活的静态存储控制器,能够与同步或异步存储器和16位PC存储器卡连接,STM32F4的FSMC接口支持包括SRAM、NAND FLASH、NOR FLASH和PSRAM等存储器。FSMC的框图如图18.1.2.1所示:

图18.1.2.1 FSMC框图

    

       


后面内容由于篇幅问题,请直接下载附件的pdf文档查看。

 实验详细手册和源码下载地址:http://www.openedv.com/posts/list/41586.htm 

正点原子探索者STM32F407开发板购买地址http://item.taobao.com/item.htm?id=41855882779

  


 

第十八章 TFTLCD显示实验-STM32F4开发指南-正点原子探索者STM32开发板.pdf

2.25 MB, 下载次数: 3536

实验13 TFT LCD显示实验.zip

515.88 KB, 下载次数: 1630

我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2014-3-29
在线时间
6 小时
发表于 2015-7-19 17:48:25 | 显示全部楼层
好文章,尤其是对ILI9341不懂的人来说,非常好用了
这几天刚刚才将ILI9341不明白的地方了解了。
回复 支持 反对

使用道具 举报

13

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2015-3-8
在线时间
1 小时
发表于 2015-8-12 11:16:12 | 显示全部楼层
这个实验的源码能直接下载到ILI9320控制的TFTLCD中吗
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2020-5-14
在线时间
7 小时
发表于 2020-5-14 21:39:02 | 显示全部楼层
STM32F407 配2.8’的 ILI9320 的TFTLCD  针脚是反的,怎么 TFTLCD  板搁在 232 串口上去了?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-1 21:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表