月度归档:2015年05月

STM32模拟16BIT并口驱动3.0’TFT屏(一)

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屏接口图如下:

clip_image002

选择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

}