TFT-LCD: Thin Film Transistor-Liquid Crystal Display, 即薄膜晶体管液晶显示器,也被叫做真彩液晶显示器。。其液晶显示屏的每一个像素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。
本文介绍4.3寸触摸屏,其分辨率为800*480,16位真彩显示,采用NT35510驱动,自带GRAM,无须外加驱动器。
TFT:薄膜晶体管,是开关器件,决定液晶是否充电(薄膜晶体管只起通或断的作用,当薄膜晶体管处于开时, 从其源极输出电压,给液晶及存储电容充电,充电电压的高低,由液晶屏驱动电路决定);
LCD模块采用 2*17 的 2.54 公排针与外部连接,接口定义如图
序号 | 名称 | 说明 |
---|---|---|
1 | CS | LCD片选信号(低电平有效) |
2 | RS | 命令/数据控制信号(0,命令:1,数据: ) |
3 | WR | 写使能信号(低电平有效) |
4 | RD | 读使能信号(低电平有效) |
5 | RST | 复位信号(低电平有效) |
6~21 | D0-D15 | 双向数据总线 |
22,26,27 | GND | 地线 |
23 | BL_CTR | 背光控制引脚(高电平点亮背光,低电平关闭) |
24,25 | VCC3.3 | 主电源供电引脚(3.3V) |
28 | VCC5 | 背光供电引脚(5V) |
29 | MISO | NC.电容触摸屏未用到 |
30 | MOSI | 电容触摸屏IIC_SDA信号(CT_SDA) |
31 | PEN | 电容触摸屏中断信号(CT_INT) |
32 | BUSY | NC.电容触摸屏未用到 |
33 | CS | 电容触摸屏复位信号(CTRST) |
34 | CLK | 电容触摸屏IICSCL信号(CT SCL) |
NT35510自带LCD GRAM(480* 864* 3字节),并且最高支持24位颜色深度(1600 万色),一般使用16位颜色深度(65K色),即RGB565格式,这样,在16位模式下,可以达到最快的速度。此时NT35510的低16位数据总线(高8位没有用到)与MCU的16位数据线以及24位LCD GRAM的对应关系如下:
从上表可以看出,NT35510的24位GRAM与16位RGB565的对应关系,其实就是分别将高位的R、G、B数据,搬运到低位做填充,“凑成”24位,再显示。
MCU的16位数据中,最低5位代表蓝色,中间6位为绿色,最高5位为红色。数值越大,表示该颜色越深。
NT35510的指令是16位宽,数据除了GRAM读写的时候是16位宽,其他都是8位宽的(高8位无效),这个和ILI9320等驱动器不一样,必须加以注意。
1.将与 TFTLCD 模块相连的 IO 口进行初始化 ;
2.初始化 TFTLCD 模块:向 LCD 控制器写入一系列的设置值;(比如伽马校准等)
3.通过函数将字符和数字显示到 TFTLCD 模块上,如下,即:设置坐标→写 GRAM 指令→写 GRAM 。
FSMC,即灵活的静态存储控制器,能够与同步或异步存储器和 16 位 PC 存储器卡连接,STM32 的 FSMC 接口支持包括 SRAM、 NAND FLASH、 NOR FLASH 和 PSRAM 等存储器。
STM32 的 FSMC 将外部设备分为 3 类: NOR/PSRAM 设备、 NAND设备、 PC 卡设备。三种共用地址数据总线等信号,但又具有不同的 CS 以区分不同的设备,本文的TFTLCD 就是用的 FSMC_NE4 做片选, 将TFTLCD 当成 SRAM 来控制 。
静态随机存取存储器(Static Random-Access Memory,SRAM)是随机存取存储器的一种。所谓的“静态”,是指这种存储器只要保持通电,里面储存的数据就可以恒常保持。
STM32的FSMC支持8/16/32位数据宽度,这里用到的LCD是16位宽度的,所以在设置的时候选择16位宽。FSMC的外部设备地址映像,STM32的FSMC将外部存储器划分为固定大小为256M字节的四个存储块,如下图:
STM32的FSMC存储块1 (Bank1)用于驱动NOR FLASH/SRAM/PSRAM,被分为4个区,每个区管理64M字节空间,每个区都有独立的寄存器对所连接的存储器进行配置。Bank1的256M字节空间由28根地址(HADDR[27:0])寻址。这里HADDR,是内部AHB地址总线,其中,HADDR[25:0]来自外部存储器地址FSMC A[25:0],而HADDR[26:27]对4个区进行寻址。如下表所示:
FSMC的相关内容还有很多,包括访问模式,相关寄存器等等,以后大概会单出笔记。正点原子大多数好像是操作外设,好像野火的视频对这方面介绍的比较详细。
1.FSMC相关
typedef struct
{
uint32_t FSMC_Bank;//存储使用的区域(内存库)
uint32_t FSMC_DataAddressMux;//设置是否复用数据地址
uint32_t FSMC_MemoryType;//指定附加到的外部内存的类型,即SRAM
uint32_t FSMC_MemoryDataWidth;//外部内存设备宽度。
uint32_t FSMC_BurstAccessMode;//闪存的突发访问模式,
uint32_t FSMC_AsynchronousWait;//在异步传输期间的等待信号,
uint32_t FSMC_WaitSignalPolarity;//等待信号的极性 (类似高低电平)
uint32_t FSMC_WrapMode;
uint32_t FSMC_WaitSignalActive;
uint32_t FSMC_WriteOperation;
uint32_t FSMC_WaitSignal;//wait状态插入信号
uint32_t FSMC_ExtendedMode;//扩展模式。
uint32_t FSMC_WriteBurst;//写突发操作。
FSMC_NORSRAMTimingInitTypeDef* FSMC_ReadWriteTimingStruct;
FSMC_NORSRAMTimingInitTypeDef* FSMC_WriteTimingStruct;
}FSMC_NORSRAMInitTypeDef;
2.LCD相关
typedef struct
{
u16 width; //LCD 宽度
u16 height; //LCD 高度
u16 id; //LCD ID
u8 dir; //横屏还是竖屏控制:0,竖屏;1,横屏。
u16 wramcmd; //开始写gram指令
u16 setxcmd; //设置x坐标指令
u16 setycmd; //设置y坐标指令
}_lcd_dev;
typedef struct//与地址有关,通过对对RS的控制
{
vu16 LCD_REG;//0 读写命令
vu16 LCD_RAM;//1 读写数据
} LCD_TypeDef;
1.颜色值获取
u16 LCD_BGR2RGB(u16 c)//c:GBR格式的颜色值
{
u16 r,g,b,rgb;
b=(c>>0)&0x1f;
g=(c>>5)&0x3f;
r=(c>>11)&0x1f;
rgb=(b<<11)+(g<<5)+(r<<0);
return(rgb);
}
2.快速画点
void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color)//相关参数为坐标及点的颜色
{
LCD_WR_REG(lcddev.setxcmd);LCD_WR_DATA(x>>8);
LCD_WR_REG(lcddev.setxcmd+1);LCD_WR_DATA(x&0XFF);
LCD_WR_REG(lcddev.setycmd);LCD_WR_DATA(y>>8);
LCD_WR_REG(lcddev.setycmd+1);LCD_WR_DATA(y&0XFF);
LCD->LCD_REG=lcddev.wramcmd;
LCD->LCD_RAM=color;
}
3.清屏函数
//color:要清屏的填充色
void LCD_Clear(u16 color)
{
u32 index=0;
u32 totalpoint=lcddev.width;
totalpoint*=lcddev.height; //得到总点数
LCD_SetCursor(0x00,0x0000); //设置光标位置
LCD_WriteRAM_Prepare(); //开始写入GRAM
for(index=0;index<totalpoint;index++)
{
LCD->LCD_RAM=color;
}
}