FSMC(TFTLCD显示实验,外部SRAM实验) 您所在的位置:网站首页 sram地址线数据线 FSMC(TFTLCD显示实验,外部SRAM实验)

FSMC(TFTLCD显示实验,外部SRAM实验)

#FSMC(TFTLCD显示实验,外部SRAM实验)| 来源: 网络整理| 查看: 265

2.8寸 TFTLCD模块(ILI9341液晶显示控制芯片)

240*320分辨率; 16位真彩显示(65536色);电阻触摸屏;背光电路;模块是3.3V供电(如果是5V MCU,必须在信号线串接120R电阻使用);LI9341驱动

TFT LCD接口说明

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框图 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字节的四个存储块。 FSMC将外部存储器划分为四个存储块 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个区进行寻址。如下表所示: 在这里插入图片描述 FSMC模式A读写时序图 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。

IS62WV51216简介

一款16位512字节(16*512=1M)容量的CMOS静态内存(SRAM)芯片。 ①高速。具有45ns/55ns访问速度。 ②低功耗。操作时:36mW;待机时:12uW。 ③兼容TTL电平。 ④全静态操作。不需要刷新和时钟电路。 ⑤三态输出。 ⑥字节控制功能。支持高/低字节控制。 IS62WV51216 图中A0-18为地址线,总共19根地址线(即2^19=512K,1K=1024);I/O0-15为数据线,总共16根数据线。CS2和CS1都是片选信号,不过CS2是高电平有效CS1是低电平有效;OE是输出使能信号(读信号);WE为写使能信号;UB和LB分别是高字节控制和低字节控制信号;

IS62WV51216时序图

读时序 芯片IS62WV51216的8080并口读时序 重点时序: 读周期时间(tRC) 地址建立时间(tAA) OE建立时间(tDOE) 我们开发板使用55ns的IS62WV51216,tRC=55ns,tAA=55ns(Max),tDOE=25ns(Max) 写时序 芯片IS62WV51216的8080并口写时序 重点时序: 读周期时间(tRC) 地址建立时间(tAA) OE建立时间(tDOE) 我们开发板使用55ns的IS62WV51216,tRC=55ns,tAA=55ns(Max),tDOE=25ns(Max)

注:DATAST[7:0]:数据保持时间,等于: DATAST(+1)个HCLK时钟周期,DATAST最大为255。对IS62WV51216来说,其实就是OE/WE低电平持续时间,最大为55ns。对STM32F1,一个HCLK=13.8ns (1/72M),设置为3;对STM32F4,一个HCLK=6ns(1/168M) ,设置为8。

ADDSET[3:0]:地址建立时间。表示:ADDSET (+1)个HCLK周期,ADDSET最大为15。对IS62WV51216来说,访问周期最快位55ns,而我们前面的设置,已经可以保证访问周期不小于55ns,因此这个地址建立时间,我们可以直接设置为0即可。

FSMC驱动IS62WV51216芯片

FSMC驱动外部SRAM时,外部SRAM的控制一般有:地址线(如A0-A25)、数据线(如D0-D15)、写信号(WE,即WR)、读信号(OE,即RD)、片选信号(CS),如果SRAM支持字节控制,那么还有UB/LB信号。而IS62WV51216的信号我们在前面介绍过,包括:I/O0-I/O15、A0-A18、OE、WE、CS、UB、LB等,我们将这些信号依次连接STM32 FSMC接口的D0-D15、A0-A18、OE、WE、CS、UB、LB等信号即可。 连接图

SRAM相关的函数

1, FSMC_SRAM_Init函数 2, FSMC_SRAM_WriteBuffer函数 3, FSMC_SRAM_ReadBuffer函数

SRAM程序源码

mian.c

```c #include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "lcd.h" #include "usart.h" #include "sram.h" u32 testsram[250000] __attribute__((at(0X68000000)));//测试用数组。后加属性,指向外部SRAM的模块1,第三分区首地址 //外部内存测试(支持1M字节内存测试) void fsmc_sram_test(u16 x,u16 y) { u32 i=0; u8 temp=0; u8 sval=0; //在地址0读取到的数据 LCD_ShowString(x,y,239,16,16,"Ex Memory Test: 0KB"); //每隔4K字节写入一个数据,总共写入256个数据,刚好1M个字节 for(i=0;i FSMC_SRAM_ReadBuffer(&temp,i,1); if(i==0)sval=temp; else if(temp key=KEY_Scan(0);//不支持连按 if(key==KEY0_PRES)fsmc_sram_test(30,170);//测试SRAM容量 else if(key==KEY1_PRES)//打印预存测试数据 { for(ts=0;ts FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; FSMC_NORSRAMTimingInitTypeDef readWriteTiming; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOF|RCC_APB2Periph_GPIOG,ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE); GPIO_InitStructure.GPIO_Pin = 0xFF33; //PORTD¸复用推挽输出 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = 0xFF83; //PORTE¸复用推挽输出 GPIO_Init(GPIOE, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = 0xF03F; //PORTF¸复用推挽输出 GPIO_Init(GPIOF, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = 0x043F; //PORTG¸复用推挽输出 GPIO_Init(GPIOG, &GPIO_InitStructure); readWriteTiming.FSMC_AddressSetupTime = 0x00; //地址建立时间(ADDSET) readWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(ADDHLD) readWriteTiming.FSMC_DataSetupTime = 0x03; //数据保持时间(DATAST)3个HCLK,4/72M=55ns. readWriteTiming.FSMC_BusTurnAroundDuration = 0x00; readWriteTiming.FSMC_CLKDivision = 0x00; readWriteTiming.FSMC_DataLatency = 0x00; readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3;// 我们这里使用NE3 也就对应BTCR[4],[5] FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM; //SRAM FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//存储器数据宽度为16BIT FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable; FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable; FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive=FSMC_WaitSignalActive_BeforeWaitState; FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; //存储器写使能 FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; // 读写使用相同时序 FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming;//参数来自上一段 FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &readWriteTiming; //读写同样时序 FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); //初始化FSMC配置 FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE); // 使能BANK3 } //在指定的地址开始,连续写入n个字节 //pBuffer:字节指针 //WriteAddr:要写入的地址 //n:要写入的字节数 void FSMC_SRAM_WriteBuffer(u8* pBuffer,u32 WriteAddr,u32 n) { for(;n!=0;n--) { *(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer; WriteAddr++; pBuffer++; } } //在指定的地址开始,连续读入n个字节 //pBuffer:字节指针 //WriteAddr:要写入的地址 //n:要写入的字节数 void FSMC_SRAM_ReadBuffer(u8* pBuffer,u32 ReadAddr,u32 n) { for(;n!=0;n--) { *pBuffer++=*(vu8*)(Bank1_SRAM3_ADDR+ReadAddr); ReadAddr++; } } //测试函数 //在指定地址写入一个字节 //ReadAddr:地址 //n:要写入的数据 void fsmc_sram_test_write(u8 data,u32 addr) { FSMC_SRAM_WriteBuffer(&data,addr,1);//写入一个字节 } //读取一个字节 //addr:要读取的地址 //返回值:读取到的数据 u8 fsmc_sram_test_read(u32 addr) { u8 data; FSMC_SRAM_ReadBuffer(&data,addr,1); return data; }


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有