天天看点

STM32学习--FMSC 和 LCD(1)

FMSC 和 LCD

1.      简述

        TFT-LCD也叫做真彩液晶显示器,即薄膜晶体管液晶显示器。价格便宜量又足,在设备仪表显示中经常被用到。一般情况下,仪备用的LCD都可以直接采购市场上成熟的LCD模块,可以降低开发成本,提高开发速度。当然,有些便携式设备可能由于空间体积的限制也只能一体化设计来减小体积,达到更好的工业设计效果。

在我的学习过程中,采用的是成熟的LCD模块,以后若有需要再针对LCD设计开展专题学习。TFTLCD 模块的驱动芯片有很多种类型,我选择的是正点原子3.5寸的LCD模块,其驱动芯片采用的是ILI9341。80并口在上文已描述过,其使用非常广泛,LCD大多的驱动芯片均支持该接口。

        在StM32中,大多芯片具备FSMC 接口。FSMC,即灵活的静态存储控制器,能够与同步或异步存储器和 16 位 PC 存储器卡连接,STM32F1 的FSMC 接口支持包括SRAM、NAND FLASH、 NORFLASH 和PSRAM 等存储器。

        STM32 的 FSMC 将外部设备分为 3 类:NOR/PSRAM 设备、NAND设备、PC 卡设备。他们共用地址数据总线等信号,他们具有不同的 CS 以区分不同的设备,将 TFTLCD 当成SRAM 来控制使用。

2.      ILI9341功能描述

2.1  ILI9341简介

         LI9341是一个用于TFT液晶显示的单芯片控制驱动器。有262,144色的240RGB X 320像素显示解决方案。内部显存172800字节用于图形显示的GRAM。

ILI9341支持 8/9/16/18位数据总线的MCU接口,6/16/18位数据总线的RGB接口, 以及3/4线的SPI接口。 移动图像区域可以通过窗口地址功能在内部GRAM 来指定。 指定的窗口区域可以选择性地更新。它的接口选择可以通过外部IM[3:0]引脚来控制,一般在LCD模块内部已选择完成,提供跳线以供选择。这里我们选的是16部数据总线。

2.2 模块接口

         LCD模块与STM32的接口,其本也是驱动芯片ILI9341与STM32接口,主要也是80并口,与OLeD接口区别就是数据带宽不一样,LCD是16位的,有16条数据线。

CS: LED 片选信号。

WR:向 LED 写入数据。

RD:从 LED 读取数据。

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

RST(RES):硬复位 LED

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

       另外我们还需要一个背光控制线来控制 TFTLCD 的背光。

       16位总线模式下,ILI9341 采用RGB565 格式存储颜色数据。如图所示,在该模式下,输入18位 ( D17-D0) , D0和D12这两个位是无效的位。 实际上只有D11-D1,D17-D13是有 效的。也正是这16位,最终被送到GRAM中显示出某一个颜色的像素点出来。

STM32学习--FMSC 和 LCD(1)

       MCU 的 16 位数据, 最低 5 位代表蓝色,中间 6 位为绿色,最高5 位为红色。数值越大,表示该颜色越深。

2.3   常用指令

       ILI9341 所有的指令都是 8 位的(高8 位无效),且参数除了读写 GRAM 的时候是 16 位,其他操作参数,都是 8 位的。

       ILI9341的一级指令46个,二级指令28个,扩展指令7个,具体可以参与其数据手册,有中文版的,参考比较方便 。

       在这里,主要学习0XD3,0X36,0X2A,0X2B,0X2C,0X2E 等 6 条指令的使用。

       0XD3:读 ID4 指令,用于读取LCD 控制器的ID。它有4个参数,最后 2 个参数,读出来是 0X93 和 0X41,就是驱动芯片的ID,用来确定我们使用的是这个型号的芯片。

STM32学习--FMSC 和 LCD(1)

       0X36:存储访问控制指令,可以控制 ILI9341 存储器的读写方向,就是在连续写 GRAM 的时候,可以控制 GRAM 指针的增长方向,从而控制显示方式参数中MY、 MX、 MV这三个位,通过这三个位的设置,我们可以控制整个 ILI9341 的全部扫描方向。

STM32学习--FMSC 和 LCD(1)

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

STM32学习--FMSC 和 LCD(1)

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

STM32学习--FMSC 和 LCD(1)

      0X2B:页地址设置指令, 在从左到右,从上到下的扫描方式(默认)下面,该指令用于设置纵坐标( y 坐标)。该指令用于设置 y 坐标,该指令带有 4 个参数,实际上是 2 个坐标值:SP和 EP,即页地址的起始值和结束值, SP 必须小于等于 EP,且 0≤SP/EP≤319。

      0X2C,该指令是写 GRAM 指令,在发送该指令之后,便可以往 LCD的 GRAM 里面写入颜色数据了,支持连续写。

STM32学习--FMSC 和 LCD(1)

          0X2E指令:读 GRAM 指令,用于读取ILI9341 的显存(GRAM)。

STM32学习--FMSC 和 LCD(1)

       该指令的参数为16位,对应每个点的RGB值。连续写时,GRAM 的地址将根据 MY/MX/MV 设置的扫描方向进行自增。

       例如:假设设置的是从左到右,从上到下的扫描方式,那么设置好起始坐标(通过 SC, SP 设置)后,每写入一个颜色值, GRAM 地址将会自动自增 1( SC++),如果碰到 EC,则回到SC,同时SP++,一直到坐标:EC, EP 结束,其间无需再次设置的坐标,从而大大提高写入速度。

0X2E指令:读 GRAM 指令,用于读取ILI9341 的显存(GRAM)。

       ILI9341 在收到该指令后,第一次输出的是dummy 数据,也就是无效的数据,第二次开始,读取到的才是有效的 GRAM 数据(从坐标:SC, SP 开始),输出规律为:每个颜色分量占 8 个位,一次输出2 个颜色分量。