TFT-LCD驱动程序设计(系列二)

正点原子的实例中设计了一个很巧妙的结构体,LCD_TypeDef,这个结构体只有两个成员变量,一个vu16 LCD_REG; 另一个是vu16 LCD_RAM;

typedef struct

{

      vu16 LCD_REG;

      vu16 LCD_RAM;

} LCD_TypeDef;

#defineLCD_BASE        ((u32)(0x6C000000 |0x0000007E))

#define LCD             ((LCD_TypeDef *) LCD_BASE)

以上操作是将LCD的地址和数据类型进行强制转化,使得LCD的连续地址是LCD_REG,LCD_RAM。我个人觉得这个设计还是很好的。

为什么LCD_BASE进行这样的操作     #define LCD_BASE  ((u32)(0x6C000000 | 0x0000007E)),有的人很难理解,这是将FSMCx_A6作为数据命令区分线,从而算出的地址偏移量,这就是为什么进行上述结构体和地址强制转换的原因,因为FSMC自身的功能,不然为什么用FSMC呢,有一些芯片是没有FSMC的不也可以通过改变IO时序的操作控制么,这样我们只需要操控LCD就可以读写命令数据,其他的交给FSMC来硬件处理,所以我们实现了根据操作地址从而操作读写数据命令的功能,简化代码和设计复杂度。我觉得这也是这个实验最精华的地方。

开始我对FSMC的作用并不是很理解,它与传统的跟据地址总线,数据总线读写数据不同,所以每次我看的时候总感觉有的地方怪怪的,后来我梳理一下这个思路,原理为:

将TFT-lCD的RS接在FSMC的A6上面,CS接在FSMC_NE4上,并且采用16数据总线,即我们使用的是FSMC存储器1的4区。其实FSMC只控制两个地址,当你想写的时候,把数据送进LCD->DATA,这时候FSMC根据LCD->DATA的地址判定你想向LCD写入数据,那么对应产生些写时序,并通过数据线将数据发出去,至于连续写,那是因为LCD控制器支持连续的读写,并不是FSMC的连续地址变化,这一点很重要。

当你想都操作的时候,将数据从LCD->DATA的地址中都出来,FSMC是跟据这个地址产生读时序,将数据从数据线读入内存中,等待处理。

因为我们在FSMC管理的内存中注册了地址,使能了FSMC的引脚,那么就可以控制MCU来主动读,主动写。

所以LCD结构体的两个地址向两个大门管理员,命令数据从这个大门过,并接受它的管理。

 

为什么:不论外部接8 位/16 位宽设备, FSMC_A[0]永远接在外部设备地址 A[0]。(求解释)

你可能感兴趣的:(TFT-LCD驱动程序设计(系列二))