关于FSMC驱动LCD的理解
十一、 LCD实验
11.1 ALINETEK 2.8寸 TFTLCD
11.1.1 接口说明
LCD_CS:LCD片选信号
LCD_WR:LCD写信号
LCD_RD:LCD读信号
DB[17:1]:16位双向数据线。
LCD_RST:硬复位LCD信号
LCD_RS:命令/数据标志(0:命令,1:数据)
BL_CTR:背光控制信号
T_MISO/T_MOSI/T_PEN/T_CS/T_CLK,触摸屏接口信号
- ILI9341 驱动时序
我们看到,读低电平最少需要355ns,写低电平需要15ns
11.1.2 指令说明
ILI9341所有的指令都是8位的(高8位无效),且参数除了读写GRAM(RGB565格式颜色数据)的时候是16位,其他操作参数,都是8位的
0XD3 读ID4指令
0X36 控制ILI9341存储器的读写方向,简单的说,就是在连续写GRAM的时候,可以控制GRAM指针的增长方向
0X2A 列地址设置指令
0X2B 页地址设置指令
0X2C 写GRAM指令
0X2E 读GRAM指令
11.2 FSMC简介
FSMC,即灵活的静态存储控制器,能够与同步或异步存储器和16位PC存储器卡连接,STM32的FSMC接口支持包括SRAM、NAND FLASH、NOR FLASH和PSRAM等存储器。
11.2.1 FSMC的框图
FSMC并不是拥有真的1GB的空间,FSMC是能够管理1GB的空间,内核将这1GB的地址交由FSMC管理。我们设置好读写时序后,FSMC会在我们读写时自动按照时序读写,拉读写使能,数据保持。LCD本省并不具有存储空间,STM32将FSMC的地址线A10连接上LCD的RS,我们选用bank1块4.
STM32内部地址线每个地址管理的都是一个字节的的空间
当Bank1接的是16位宽度存储器的时候:HADDR[25:1] -> FSMC_A[24:0]
//LCD地址结构体
typedef struct
{
vu16 LCD_REG;
vu16 LCD_RAM;
} LCD_TypeDef;
#define LCD_BASE ((u32)(0x6C000000 | 0x000007FE))
#define LCD ((LCD_TypeDef *) LCD_BASE)
//0x000007FE为选用A10的偏移量,这样
&LCD_REG == 0x6C0007FE; A10:A0 011 1111 1111
&LCD_RAM == 0x6C000800; A10:A0 100 0000 0000
0x6C0007FE对应的是8位数据的地址,右移对其对应的是16位数据
-
我们看到LCD_REG和LCD_RAM的A10位分别位0和1,表示命令和数据。
-
这样当我们写LCD_REG时FSMC会先拉地址信号,A10 =RS=0,表示写命令,再把LCD_REG的数据通过 DB[17:1]:16位双向数据线写入LCD,那么同理,写入LCD_RAM表示写数据。
本篇并不详细介绍FSMC的配置过程,主要描述的是FSMC如何控制LCD,基于正点原子的战舰开发板