STM32学习笔记(13)通过FSMC控制TFTLCD(NT35510芯片)

文章目录

  • TFTLCD简介
    • 颜色相关
    • 驱动时序
    • 使用流程
  • FSMC简介
    • 框图
    • FSMC 存储块地址映像
  • 代码相关
    • 相关结构体
    • 部分实现函数

TFTLCD简介

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

本文介绍4.3寸触摸屏,其分辨率为800*480,16位真彩显示,采用NT35510驱动,自带GRAM,无须外加驱动器。

TFT:薄膜晶体管,是开关器件,决定液晶是否充电(薄膜晶体管只起通或断的作用,当薄膜晶体管处于开时, 从其源极输出电压,给液晶及存储电容充电,充电电压的高低,由液晶屏驱动电路决定);

LCD模块采用 2*17 的 2.54 公排针与外部连接,接口定义如图

STM32学习笔记(13)通过FSMC控制TFTLCD(NT35510芯片)_第1张图片

序号 名称 说明
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等驱动器不一样,必须加以注意。

驱动时序

STM32学习笔记(13)通过FSMC控制TFTLCD(NT35510芯片)_第2张图片

使用流程

1.将与 TFTLCD 模块相连的 IO 口进行初始化 ;
2.初始化 TFTLCD 模块:向 LCD 控制器写入一系列的设置值;(比如伽马校准等)
3.通过函数将字符和数字显示到 TFTLCD 模块上,如下,即:设置坐标→写 GRAM 指令→写 GRAM 。
STM32学习笔记(13)通过FSMC控制TFTLCD(NT35510芯片)_第3张图片

FSMC简介

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

框图

STM32学习笔记(13)通过FSMC控制TFTLCD(NT35510芯片)_第4张图片
STM32 的 FSMC 将外部设备分为 3 类: NOR/PSRAM 设备、 NAND设备、 PC 卡设备。三种共用地址数据总线等信号,但又具有不同的 CS 以区分不同的设备,本文的TFTLCD 就是用的 FSMC_NE4 做片选, 将TFTLCD 当成 SRAM 来控制 。

静态随机存取存储器(Static Random-Access Memory,SRAM)是随机存取存储器的一种。所谓的“静态”,是指这种存储器只要保持通电,里面储存的数据就可以恒常保持。

FSMC 存储块地址映像

STM32的FSMC支持8/16/32位数据宽度,这里用到的LCD是16位宽度的,所以在设置的时候选择16位宽。FSMC的外部设备地址映像,STM32的FSMC将外部存储器划分为固定大小为256M字节的四个存储块,如下图:STM32学习笔记(13)通过FSMC控制TFTLCD(NT35510芯片)_第5张图片
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个区进行寻址。如下表所示:
STM32学习笔记(13)通过FSMC控制TFTLCD(NT35510芯片)_第6张图片
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; 
 }
}  

你可能感兴趣的:(STM32学习笔记)