- 正点原子32单片机上的TFTLCD实验是基于FSMC来控制的,对于之前从未接触过FSMC的我来说,感觉理解起来有点吃力,通过查找资料,也有了自己的理解,如有不对,还请斧正。
- 对于LCD和FSMC的控制线连接有以下关系:
FSMC_NOE —> LCD_RD
FSMC_A10 —> LCD_RS
FSMC_NE4 —> LCD_CS
FSMC->NWE —> LCD_WR
FSMC_RESET —> LCD_RST
对照一下这两张时序图可以清楚的发现通过改变时间可以达到用FSMC控制LCD的时序,唯一不同的是FSMC没有RS,也就是读写命令,还是读写数据,而这个我们可以
通过FSMC的地址线也就是A[0:25]进行控制。
在32单片机实验例程中有如下定义:
#define LCD_BASE ((u32)(0x6C000000 | 0x000007FE))
#define LCD ((LCD_TypeDef *) LCD_BASE)
typedef struct
{
vu16 LCD_REG;
vu16 LCD_RAM;
} LCD_TypeDef;
通过C语言的学习可以知道,两个define将地址6c0007FE作为该结构体的地址,而 0x7FE,其实就是二进制码 111 11111110,通过手册可知,单片机是以字节进行对齐操作的,而一字节是8位,现在要以字(16位)进行操作,要将地址右移一位,也就是011 1111 1111,也就对应rs=0,而LCD_RAM也就是0x7FE+0x2,对应一下,也就是111 1111 1110 -->1111 1111 1111 -->1位 111 1111 1111,rs=1从而达到了控制FMSC——A[10]高低的效果,(右移一位?因为单片机是8位对齐,外部16位对齐,其实就是单片机进行+1操作对应了外部地址进行+2操作,如何让外部地址加1呢,那就是将地址右移1位,+2 >> 1 == +1)。
不知道大家有没有对地址线不清楚的,例程实验给出的地址线是A[10],其实也可以是其他的,实验中进行的操作就是向该地址中写数据,剩下的就让FSMC自动按时序进行D[0:15]的数据传输,TFTLCD实验对地址基本没有要求。