STM32F4+LCD屏幕驱动原理

以下为LCD屏幕简单的驱动原理(屏幕型号为4.3寸 TFTLCD模块 驱动IC为NT35510):

1、首先介绍一下这个模块的引脚以及功能:

STM32F4+LCD屏幕驱动原理_第1张图片

LCD_CS:LCD片选信号

LCD_WR:LCD写信号

LCD_RD:LCD读信号

DB[17:1]:16位双向数据线

LCD_RST:硬复位LCD信号

LCD_RS:命令/数据标志(0:命令,1:数据)

BL_CTR:背光控制信号

T_MISO/T_MOSI/T_PEN/T_CS/T_CLK:触摸屏接口信号(屏幕只显示时,这几个接口用不到)

2、用FSMC驱动LCD

FSMC是灵活的静态存储控制器,能够与同步或异步存储器和16位PC存储器卡连接。FSMC可以驱动LCD的主要原因是因为FSMC的读写时序和LCD的读写时序相似,于是把LCD当成一个外部存储器来用。利用FSMC在相应的地址读或写相关数值时,STM32的FSMC会在硬件上自动完成时序上的控制,所以我们只要设置好读写相关时序寄存器后,FSMC就可以帮我们完成时序上的控制了。这里连接的时候有一个数据宽度连接的问题,根据STM32F4中文参考手册介绍,当LCD使用16位宽度的数据传输(也就是有16条数据线)的时候,HADDR数据传输到FSMC_A地址时需要右移一位。也就是HADDR[25:1]-->FSMC_A[24:0]对应相接。

STM32F4+LCD屏幕驱动原理_第2张图片

FSMC_A是STM32的硬件的外部接口 ,这个是看得见的,然后HADDR是需要转换到外部存储器的内存AHB地址线,这个是看不见的,但是我们可以用代码来控制它,我们代码直接操作着HADDR,而会间接操作到FSMC_A,所以当我们STM32的FSMC接口外接LCD屏幕时,要操作的就是HADDR,因为HADDR会间接操作到FSMC_A。因为AHB地址线一个地址为1个字节(8位),而LCD的一个地址为两个字节(16位),所以有如下图对应关系:

STM32F4+LCD屏幕驱动原理_第3张图片

可以看出当使用16数据宽度的时候,HADDR[0]这个地址是没用的。而因为我们的LCD的LCD_RS(命令/数据标志线)是接在STM32的外部接口FSMC_A[6]上,所以实际上我们要操作的是HADDR[7]这个地址线。这就是当使用16位数据宽度的时候,HADDR自动右移一位对其的原理。

3、LCD硬复位+初始化

初始化及复位是屏幕厂商给的,直接移植过来用就可以

4、设置坐标

在设置坐标参数时,需要先向寄存器发指令。0X2A,该指令是列地址设置指令,在从左到右,从上到下的扫描方式(默认)下面,该指令用于设置横坐标(x坐标)

STM32F4+LCD屏幕驱动原理_第4张图片

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

0X2B,该指令是页地址指令,在从左到右,从上到下的扫描方式(默认)下面,该指令用于设置纵坐标(y坐标)

STM32F4+LCD屏幕驱动原理_第5张图片

同上面设置横坐标一样,该指令带有4个参数,实际只是2个坐标值:SP和EP,即页地址的起始值和结束值,SP必须小于等于EP,一般在设置y坐标时候,我们只需要带2个参数即可,也就是设置SP即可,因为如果EP没有变化,我们只需设置一次即可,(在初始化时候设置),从而提高速度。简单代码如下:

STM32F4+LCD屏幕驱动原理_第6张图片

STM32F4+LCD屏幕驱动原理_第7张图片

5、写 GRAM指令

写GRAM指令为 0X2C 在发送这个指令后,我们便可以向LCD的GRAM里面写入颜色数据了,该指令支持连续写(地址自动递增)

STM32F4+LCD屏幕驱动原理_第8张图片

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

6、RGB565格式

NT35510 自带LCD GRAM(480*864*3字节),并且最高支持24位颜色深度(1600万色),不过我们一般使用16位颜色深度(65k),RGB565格式,这样,在16位模式下,可以达到最快的速度。在16位模式下,NT35510采用RGB565格式存储颜色数据,此时NT35510的低16位数据总线(高8位没有用到)与MCU的16位数据线以及24位LCD GRAM的对应关系如下图所示:

 从上表可以看出,NT35510的24位GRAM与16位RGB565的对应关系,其实就是分别将高位的R、G、B数据,搬运到低位做填充,“凑成”24位,再显示。MCU的16位数据中,最低5位代表颜色,中间6位为绿色,最高5位为红色。数值越大,表示该颜色越深。另外,特别注意NT33510的指令是16位宽,数据除了GRAM读写的时候是16位宽,其他都是8位宽(高8位无效),这个和ILI9320等驱动器不一样,必须加以注意。

STM32F4+LCD屏幕驱动原理_第9张图片

STM32F4+LCD屏幕驱动原理_第10张图片

 STM32F4+LCD屏幕驱动原理_第11张图片

你可能感兴趣的:(STM32F4+LCD屏幕驱动原理)