天天看点

stm学习---FSMC控制TFT屏程序1

在研究原子的程序时,有下面3段

1.

typedef struct

{

vu16 LCD_REG;

vu16 LCD_RAM;

} LCD_TypeDef;

#define LCD_BASE ((u32)(0x6C000000 | 0x000007FE))

#define LCD ((LCD_TypeDef *) LCD_BASE)

2.

void LCD_WR_REG(u16 regval)

{

LCD->LCD_REG=regval;

}

void LCD_WR_DATA(u16 data)

{

LCD->LCD_RAM=data;

}

3.

LCD_WR_REG(0xED);

LCD_WR_DATA(0x64);

其中涉及到了结构体(结构体是一种数据类型)、指针、寻址、FSMC、TFT屏,该段程序实际是定义TFT屏(该屏是8080的16位并口模式)的RS标志线为地址0x000007FE:

1.FSMC可以控制外部 SRAM,SRAM有地址线(如 A0~A18)、数据线(如 D0~D15)、写信号(WE)、读信号(OE)、片选信号(CS),如果 SRAM 支持字节控制,那么还有 UB/LB 信号;TFTLCD有数据线(如 D0~D15)、WR、RD、CS、RST(复位,可以硬件实现) 、RS、BL(背光控制),实际用D0~D15、WR、RD、 CS、RS即可控制TFT。向FSMC寻址的地址写数据,则FSMC的数据线就输出该数据,这样则FSMC可以控制TFT了,由于FSMC有地址线,TFT没有地址线,但是有RS信号线,RS是数据/命令信号线,RS=0时表示TFT接收的是命令,RS=1时表示TFT接收的是数据,那么FSMC只要地址线的任何一根线连接了RS都可以控制TFT了:语句#define LCD_BASE ((u32)(0x6C000000 | 0x000007FE))中0x6C000000是fsmc4个管理块中的Bank1的分区4的起始地址,对应地址信号全为0,由于使用了A10连接TFT的RS线,为了方便寻址连续,则A10为低电平时的最大寻址地址是0x000007FF,而现在为什么是0x000007FE,是因为FSMC是由HADDR控制的,HADDR是内部AHB地址总线,当Bank1接的是16位宽度存储器的时候:HADDR[25:1]对应FSMC-A[24:0],相当于HADDR[25:1]右移一位,HADDR[25:0]的26根线,才能寻址64M地址,所以A10接在RS上相当于HADDR[11]接在RS上,即A10为高电平时的最大寻址地址是0x00000FFF,现在((LCD_TypeDef *) LCD_BASE)将转换成结构体地址指针,指向结构体第一个成员,即首地址是((u32)(0x6C000000 | 0x000007FE))即0x6C0007FE即此时HADDR[11:0]为011111111110即0x7FE,H[11]低电平即A10低电平,为使寻址连续,所以H[11]高电平即A10高电平时可以对应HADDR[11:0]为100000000000,即0x800,这样FSMC寻址0x6C0007FE时,则RS为低电平,向0x6C0007FE 写入数据,则FSMC的数据线向TFT传送该数据,则TFT认为该数据为命令;FSMC寻址0x6C000800时,则RS为高电平,向0x6C000800 写入数据,则FSMC的数据线向TFT传送该数据,则TFT认为该数据为数据;另外0x6C0007FE与0x6C000800差了两个字节,是因为FSMC使用了16位模式,数据总线是16位,则地址必须占用两个字节才能向地址写数据。实际FMSC控制TFT并没有真正寻TFT的地址空间, FSMC只是通过自身的地址线控制RS,向该地址写数据就是向数据线传输数据,TFT通过RS的高低电平认定接收来的数据是数据还是命令。地址不一定是0x6c0007FE和6c000800,只要是控制A10高低电平的地址都可以,也不一定要连续地址,可以分别定义0x6c0007FE和0x6c000800;使用了FSMC功能后,其它的地址线最好不再作为别的功能的IO使用,但是在不影响RS的电平的情况下灵活运用其他地址线还是有可能,比如我使A2输出高电平,则可以使地址寻址0x6c000808,而必须保证此时的A10不会变化。。。

继续阅读