ARM芯片使用的是STM32F105系列,没有FSMC接口,所以采用模拟16bit驱动TFT。TFT屏驱动芯片是SPFD5420A。3.0’屏,400*240大小。
SPFD5420A支持262144color,也就是屏资料介绍里常说的262K色或26万色。262144是怎么算出来的?我们先来了解TFT的显示原理。400*240的屏有96000个像素,每个像素的颜色由RGB三种颜色混合而成。SPFD5420A支持18bit接口,一个像素由R(6)G(6)B(6)共18位组成。如下所示:
R5 |
R4 |
R3 |
R2 |
R1 |
R0 |
G5 |
G4 |
G3 |
G2 |
G1 |
G0 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0 |
那么一个像素能显示的颜色有2^18,也就是262144种颜色。
65K色屏一个像素由R(5)G(6)B(5)共16位组成,2^16=65536种颜色。
16.7M色屏一个像素由R(8)G(8)B(8)共24位组成,2^24=16777216种颜色。
这个参数和屏的大小无关,只和屏驱动芯片支持的RGB组合的位数有关。
SPFD5420A内部有233280byteGRAM,最大的像素为240*432,每个像素18bit,240*432*18/8=233280byte。
SPFD5420A支持8,9,16,18位并口通讯。SPFD5420D有一个16bit索引寄存器IR,一般作为存储器的指针使用。2个18bit数据寄存器,一个是写数据寄存器(WDR),一个是读数据寄存器(RDR)。
TFT屏接口图如下:
选择16bit模式,TFT的DB0和DB9脚没有使用,DB1-DB8接STM32的GPIOE的PIN0-PIN7脚,DB10-DB17接GPIOE的PIN8-PIN15脚。引脚定义如下:
#define TFT_CS GPIO_Pin_0
#define TFT_RS GPIO_Pin_1
#define TFT_RST GPIO_Pin_4
#define TFT_RD GPIO_Pin_5
#define TFT_MISO GPIO_Pin_6
#define TFT_MOSI GPIO_Pin_7
//————-PORTB———————
#define TFT_PCLK GPIO_Pin_12
#define TFT_DE GPIO_Pin_13
#define TFT_WR GPIO_Pin_14
#define TFT_HSYNC GPIO_Pin_15
//————-PORTC———————
#define TFT_BACKLIGHT GPIO_Pin_9
//————-PORTE———————
#define TFT_DATAPORT GPIOE
#define Lcd_Light_ON GPIOC->BSRR = GPIO_Pin_9;
#define Lcd_Light_OFF GPIOC->BRR = GPIO_Pin_9;
#define Set_Cs GPIO_SetBits(GPIOA,GPIO_Pin_0);
#define Clr_Cs GPIO_ResetBits(GPIOA,GPIO_Pin_0);
#define Set_Rs GPIO_SetBits(GPIOA,GPIO_Pin_1);
#define Clr_Rs GPIO_ResetBits(GPIOA,GPIO_Pin_1);
#define Set_nWr GPIO_SetBits(GPIOB,GPIO_Pin_14);
#define Clr_nWr GPIO_ResetBits(GPIOB,GPIO_Pin_14);
#define Set_nRd GPIO_SetBits(GPIOA,GPIO_Pin_5);
#define Clr_nRd GPIO_ResetBits(GPIOA,GPIO_Pin_5);
IO口初始化函数:
static void LCD_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = TFT_CS|TFT_RS |TFT_WR|TFT_RST|TFT_RD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = TFT_WR;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = TFT_BACKLIGHT;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/* tft control gpio init */
GPIO_SetBits(GPIOA, TFT_RST); // RST
GPIO_SetBits(GPIOA, TFT_RD); // RD = 1
GPIO_SetBits(GPIOB, TFT_WR); // WR = 1
GPIO_SetBits(GPIOA, TFT_RS); // RS
GPIO_SetBits(GPIOA, TFT_CS); //CS = 1
}