FSMC(TFTLCD显示实验,外部SRAM实验)
2.8寸 TFTLCD模块(ILI9341液晶显示控制芯片)
240*320分辨率; 16位真彩显示(65536色);电阻触摸屏;背光电路;模块是3.3V供电(如果是5V MCU,必须在信号线串接120R电阻使用);LI9341驱动
LCD7个底层接口函数
1,写寄存器值函数 :void LCD_WR_REG(u16 regval)
2,写数据函数:void LCD_WR_DATA(u16 data)
3,读数据函数:u16 LCD_RD_DATA(void)
4,写寄存器内容函数: void LCD_WriteReg(u16 LCD_Reg, u16 LCD_RegValue)
5,读寄存器内容函数: u16 LCD_ReadReg(u16 LCD_Reg)
6,开始写GRAM函数: void LCD_WriteRAM_Prepare(void)
7,写GRAM函数: void LCD_WriteRAM(u16 RGB_Code)
FSMC灵活的静态存储寄存器
能够与同步或异步存储器和16位PC存储器卡连接,STM32的FSMC接口支持包括SRAM、NAND FLASH、NOR FLASH和PSRAM等存储器。
FSMC驱动外部SRAM时,外部SRAM的控制一般有:地址线(如A0-A25)、数据线(如D0-D15)、写信号(WE,即WR)、读信号(OE,即RD)、片选信号(CS),如果SRAM支持字节控制,那么还有UB/LB信号。
FSMC驱动外部SRAM时,外部SRAM的控制一般有:地址线(如A0-A25)、数据线(如D0-D15)、写信号(WE,即WR)、读信号(OE,即RD)、片选信号(CS),如果SRAM支持字节控制,那么还有UB/LB信号。TFTLCD通过RS信号来决定传送的数据是数据还是命令,本质上可以理解为一个地址信号。
STM32的FSMC支持8/16/32位数据宽度,我们这里用到的LCD是16位宽度的,所以在设置的时候,选择16位宽就OK了。FSMC的外部设备地址映像,STM32的FSMC将外部存储器划分为固定大小为256M字节的四个存储块。
STM32的FSMC存储块1(Bank1)用于驱动NOR FLASH/SRAM/PSRAM,被分为4个区,每个区管理64M字节空间,每个区都有独立的寄存器对所连接的存储器进行配置。Bank1的256M字节空间由28根地址线(HADDR[27:0])寻址。这里HADDR,是内部AHB地址总线,其中,HADDR[25:0]来自外部存储器地址FSMC_A[25:0],而HADDR[26:27]对4个区进行寻址。如下表所示:
STM32的FSMC存储块1支持的异步突发访问模式包括:模式1,模式A-D 等多种时序模型,驱动SRAM时一般使用模式1或模式A,这里使用模式A来驱动SRAM。模式A支持读写时序分开设置,对STM32F4仅写时序DATAST需要加1。NBL对应UB/LB字节控制,NE对应CS,NOE对应OE,NWE对应WE。
当Bank1接的是16位宽度存储器的时候:HADDR[25:1]–> FSMC_A[24:0]
当Bank1接的是8位宽度存储器的时候:HADDR[25:0]–>FSMC_A[25:0]
不论外部接8位/16位宽设备,FSMC_A[0]永远接在外部设备地址A[0]
NOR FLASH/ PSRAM 相关寄存器(存储块1):
闪存片选控制寄存器(FSMC_BCRx)
闪存片选时序寄存器(FSMC_BTRx)
闪存写时序控制寄存器(FSMC_BWTRx)(只有在读写时序不一致时才需要设置)
在ST官方库提供的的寄存器定义里面,并没有定义FSMC_BCRx、FSMC_BTRx、FSMC_BWTRx等这个单独的寄存器,而是将他们进行了一些组合。规律如下:
FSMC_BCRx和FSMC_BTRx,组合成BTCR[8]寄存器组,他们的对应关系如下:
BTCR[0]对应FSMC_BCR1,BTCR[1]对应FSMC_BTR1
BTCR[2]对应FSMC_BCR2,BTCR[3]对应FSMC_BTR2
BTCR[4]对应FSMC_BCR3,BTCR[5]对应FSMC_BTR3
BTCR[6]对应FSMC_BCR4,BTCR[7]对应FSMC_BTR4
FSMC_BWTRx则组合成BWTR[7],他们的对应关系如下:
BWTR[0]对应FSMC_BWTR1,BWTR[2]对应FSMC_BWTR2,
BWTR[4]对应FSMC_BWTR3,BWTR[6]对应FSMC_BWTR4,
BWTR[1]、BWTR[3]和BWTR[5]保留,没有用到。
注:数据保持时间,等于: DATAST(+1)个HCLK时钟周期,DATAST最大为255。对ILI9341来说,其实就是WR低电平持续时间,为15ns,不过ILI9320等则需要50ns。考虑兼容性,对STM32F1,一个HCLK=13.8ns (1/72M),设置为3;对STM32F4,一个HCLK=6ns(1/168M) ,设置为9。