TFTLCD 16位并口屏幕驱动

TFTLCD 16位并口屏幕FSMC驱动

工作中LCD OLED是经常用到的,恰巧手里有个STM32F103ZET6开发板和TFTLCD 2.8寸屏16位并口屏幕,接下来我会通过FSMC接口来驱动这块屏幕。

原理图

在这里插入图片描述
CS: TFTLCD 片选信号。
WR:向 TFTLCD 写入数据。
RD:从 TFTLCD 读取数据。
D[15: 0]: 16 位双向数据线。
RST:硬复位 TFTLCD。
RS:命令/数据标志(0,读写命令; 1,读写数据)。

T开头是触摸屏用的暂不解释
注意:
1.写数据,RS管脚高电平写数据,片选CS管脚拉低, WR上升沿去读取0-15位数据。
2.读数据,RS管脚高电平写数据,片选CS管脚拉低, RD上升沿去读取0-15位数据。

驱动流程

在这里插入图片描述
1.硬复位 拉低 LCD_RST 等待100ms 然后拉高。
2.初始化序列去读屏幕ID。
3.向ILI9341写指令写数据画图,或者读指令读当前屏幕数据单片机处理。

ILI9341

液晶屏幕是通过这个芯片来驱动的所以先了解下他的特性。
ILI9341 液晶控制器自带显存,其显存总大小为 172800(24032018/8),即 18 位模式(26
万色)下的显存量。在 16 位模式下, ILI9341 采用 RGB565 格式存储颜色数据。
在这里插入图片描述
RGB565就是指红色5bit控制 绿色6bit控制 蓝色5bit。
控制命令
0XD3:这个是读 ID4 指令,用于读取 LCD 控制器的 ID。通过读ID进行初始化。
0X36:这是存储访问控制指令,可以控制 ILI9341 存储器的读写方向,简
单的说,就是在连续写 GRAM 的时候,可以控制 GRAM 指针的增长方向,从而控制显示方式。
在这里插入图片描述
其中最重要的是 MY、MX、MV、三个位,通过这三个位的设置,我们可以控制整个 ILI9341 的全部扫描方向,
在这里插入图片描述
例如:MY,MX,MV为0时从0.0坐标开始画点依次0.1 ,0.2,0.3… 0.239向下画点1.0.,1.1…1.239。以此类推画点。
0X2C:该指令是写 GRAM 指令,在发送该指令之后,我们便可以往 LCD的 GRAM 里面写入颜色数据了,该指令支持连续写。
在这里插入图片描述
0X2E:该指令是读 GRAM 指令,用于读取 ILI9341 的显存(GRAM),该指令在 ILI9341 的数据手册上面的描述是有误的。
在这里插入图片描述
ILI9341 在收到该指令后,第一次输出的是dummy 数据,也就是无效的数据,第二次开始,读取到的才是有效的 GRAM 数据(从坐标:SC, SP 开始),输出规律为:每个颜色分量占 8 个位,一次输出 2 个颜色分量。比如:第一次输出是 R1G1,随后的规律为: B1R2G2B2R3G3B3R4G4B4R5G5… 以此类推。如果我们只需要读取一个点的颜色值,那么只需要接收到参数 3 即可,如果要连续读取(利用 GRAM
地址自增,方法同上),那么就按照上述规律去接收颜色数据。

以上指令我们就可以通过单片机驱动ILI9341从而进行屏幕数据显示读取了。

ILI9341时序与FSMC

FSMC接口

FSMC,即灵活的静态存储控制器,能够与同步或异步存储器和 16 位 PC 存储器卡连接,
STM32 的 FSMC 接口支持包括 SRAM、 NAND FLASH、 NOR FLASH 和 PSRAM 等存储器。
在这里插入图片描述
对于这块屏幕而言我会选择把它当作SRAM来驱动,外部 SRAM 的控制一般有:地址线(如 A0~A18)、数据线(如 D0~D15)、写信号(WE)、读信号(OE)、片选信号(CS),如果 SRAM 支持字节控制,那么还有 UB/LB 信号。而 TFTLCD包括: RS、 D0~D15、 WR、 RD、 CS、 RST 和 BL 等,其中真正在操作 LCD 的时候需要用到的就只有: RS、 D0~D15、 WR、 RD 和 CS。其操作时序和 SRAM的控制完全类似,唯一不同就是 TFTLCD 有 RS 信号,但是没有地址信号。
TFTLCD屏幕写命令和写数据时由RS决定的所以可以将RS连接到FSMC的地址线A0,只占一位。来控制是写命令还是写数据。

STM32 的 FSMC 支持 8/16/32 位数据宽度,我们这里用到的 LCD 是 16 位宽度的,所以在设置的时候,选择 16 位宽就 OK 了。我们再来看看 FSMC 的外部设备地址映像,STM32 的 FSMC将外部存储器划分为固定大小为 256M 字节的四个存储块。在这里插入图片描述
从上图可以看出, FSMC 总共管理 1GB 空间,拥有 4 个存储块(Bank),我们用到的是块 1。
STM32 的 FSMC 存储块 1(Bank1)被分为 4 个区,每个区管理 64M 字节空间,每个区都有独立的寄存器对所连接的存储器进行配置。 Bank1 的 256M 字节空间由 28 根地址线
(HADDR[27:0])寻址。.
在这里插入图片描述
注意:当 Bank1 接的是 16 位宽度存储器的时候: HADDR[25:1] FSMC_A[24:0]。另外HADDR[27:26]的设置,是不需要我们干预的。

FSMC时序

在这里插入图片描述
在这里插入图片描述
A[25:0]地址线控制屏幕RS,控制写命令还是写数据
NBL没有用到
NEx:对应CS片选
NOE:对应RD(写操作时为高电平)
NWE:对应WR(读操作时为高电平)
D[15:0]对应数据线

ILI9341重要时序

在这里插入图片描述
读ID低电平脉宽(trdl)45ns
读ID高电平脉宽(trdh)90ns
读FM低电平脉宽(trdlfm)355ns
读FM高电平脉宽(trdhfm)90ns
写控制低电平脉宽(twrl)15ns
写控制高电平脉宽(twrh)15ns
注意:上图是手册中读写最小延时,可以看出屏幕驱动写的速度明显快过读的速度。编程一定注意最小延时。

FSMC寄存器

SRAM/NOR闪存片选控制寄存器(FSMC_BCRx)
在这里插入图片描述
EXTMOD:扩展模式使能位,控制是否允许读写不同的时序,需设置为1
WREN:写使能位。我们需要向TFTLCD写数据,故该位必须设置为1
MWID[1:0]:存储器数据总线宽度。00,表示8位数据模式;01表示16位数据模式;10和11保留。我们的TFTLCD是16位数据线,所以设置WMID[1:0]=01。
MTYP[1:0]:存储器类型。00表示SRAM、ROM;01表示PSRAM;10表示NOR FLASH;11保留。我们把LCD当成SRAM用,所以需要设置MTYP[1:0]=00。
MBKEN:存储块使能位。需设置为1。
SRAM/NOR闪存写时序寄存器(FSMC_BWTRx)与SRAM/NOR闪存片选时序寄存器(FSMC_BTRx)这两个寄存器编程一定要与上文中ILI9341读写时序所匹配。 参考手册编程

扫描二维码关注公众号,回复: 8980818 查看本文章

驱动软件实现

底层驱动

应用程序

效果展示

未完待续。。。。

发布了15 篇原创文章 · 获赞 1 · 访问量 511

猜你喜欢

转载自blog.csdn.net/weixin_42323243/article/details/104192286