利用STM32的FSMC控制2.8寸TFTLCD问题。

一、LCD地址结构体

typedef struct
{
u16 LCD_REG;
u16 LCD_RAM;
} LCD_TypeDef;

//使用NOR/SRAM的 Bank1.sector4,地址位HADDR[27,26]=11 A6作为数据命令区分线 
//注意设置时STM32内部会右移一位对其! 111 1110=0X7E
    
#define LCD_BASE        ((u32)(0x6C000000 | 0x0000007E))   
#define LCD             ((LCD_TypeDef *) LCD_BASE)

1、LCD为指针强制类型转换,指向NE4(Bank1第四区)A6。

2、为什么会右移一位?

 因为Bank1 接的是16 位宽度存储器的时候:HADDR[25:1]-->FSMC[24:0]
       
Bank1 接的是 8位宽度存储器的时候: HADDR[25:0]-->FSMC[25:0]

 不论外部接8 /16位宽设备, FSMC_A[0]永远接在外部设备地址A[0]这里, TFTLCD使用的是16 位数据宽度,所以HADDR[0]并没有用到,只有HADDR[25:1]是有效的,对应关系变为:HADDR[25:1]--> FSMC[24:0],相当于右移了一位。另外,HADDR[27:26]的设置,是不需要我们干预的,初始化的时候可以选择区。

3、为什么是7E?
 7E转换成二进制就是: 1111110,而16 位数据时,地址右移一位对齐,那么实际对应到地址引脚的时候,就是:A6:A0=0111111,此时A6 0,但是如16 位地址再加1(注意:对应到 8位地址是加 2,即7E+0X02),那么: A6:A0=1000000,此时 A6 就是 1了,即实现了对 RS 0 1 的控制。 还有一个简单的方法就是,当选A6时将第七位和最后一位置0,为01111110=0X7E 位地址是加 2为1000000,就可以实现A6对RS的控制了,例如我操作NE1、A10那么地址就为(u32)(0x60000000 | 0x000007FE),其中7FE=011111111110。

利用STM32的FSMC控制2.8寸TFTLCD问题。

注:1、HADDR是需要转换到外部存储器的内部AHB地址线。