一。IS62WV51216 简介

1.     IS62WV51216 是 ISSI(Integrated  Silicon  Solution,  Inc)公司生产的一颗 16 位宽 512K

(512*16,即 1M 字节)容量的 CMOS 静态内存芯片

58.外部SRAM实验

58.外部SRAM实验
实验选用的芯片没有CS2引脚。

2. IS62WV51216读时序

58.外部SRAM实验

58.外部SRAM实验
58.外部SRAM实验

3. IS62WV51216写时序

58.外部SRAM实验

58.外部SRAM实验
58.外部SRAM实验

二。FSMC简介

1. STM32中FSMC框图

58.外部SRAM实验

为什么VBT6不能用FSMC功能驱动SRAM

STM32与SRAM连接必须要连接19根地址线,FSMC_A0对应的引脚为PF0,而在100脚的STM32芯片上只有A,B,C,D,E引脚,没有F引脚,所以在100脚以下的STM32芯片无法驱动SRAM。只有144个引脚的STM32芯片才可以驱动SRAM。

为什么在100个引脚的VET6的芯片上可以利用FSMC功能控制液晶屏?

    因为FSMC有的地址线是在PE引脚上,而控制液晶屏只需要一根地址线,用来控制发指令还是发数据,所以在100脚的VET6上可以用FSMC功能控制液晶屏,如果要控制SRAM则地址线需要从FSMC_A0到FSMC_A18,很多都是在PF引脚上。,所以VET6不能用FSMC功能控制SRAM。

二。FSMC驱动SRAM的原理

58.外部SRAM实验

三。NOR PSRAM外设接口

58.外部SRAM实验
驱动SRAM使用存储块1,由4*64MB四个区组成

三。存储块1操作简介

58.外部SRAM实验

Bank1接的是16位宽度存储器的时候,内部地址右移一位跟FSMC的地址对齐,除以2对齐

因为在STM32内部每个地址对应一个字节的数据,如果外部设备是16位宽度,那么外部设备的一个地址就代表了FSMC的2个字节。

比如 内部地址 6000 0000(0) 对应FSMC的A0=0 (A0=0的时候对应2个字节)

                       6000 0010(2) 对应FSMC的A0=1 (A0=1的时候对应2个字节)

                       6000 0100(4) 对应FSMC的A1=1,A0=0 (对应2个字节)

58.外部SRAM实验

四。FSMC寄存器介绍

58.外部SRAM实验
FSMC_BWTRx只有在读写时序不一致的时候才设置。

本实验中EXTMOD位设置为0,不允许读写不同的时序,因此FSMC_BWTRx寄存器不需要设置。

片选时序寄存器(FSMC_BTRx)是很重要的一个寄存器,控制访问的时序。

58.外部SRAM实验

访问模式为模式A,因此ACCMOD设置为00. 控制FSMC只能选用模式A。

58.外部SRAM实验

五。硬件连接

58.外部SRAM实验
    为了布线方便,IS62WV51216的地址线A0-A18并没有与FSMC的地址线A0-A18相对应,但这样不会影响使用,因为地址具有唯一性,比如写的地址是xx,读的时候地址也是xx,所以不存在任何问题,地址线可以随意乱接的。

  但是数据线必须一一对应。

  实验中CS接的是FSMC_NE3。

六。驱动代码讲解

58.外部SRAM实验

//使用NOR/SRAM的 Bank1.sector3,地址位HADDR[27,26]=10 

//对IS61LV25616/IS62WV25616,地址线范围为A0~A17 

//对IS61LV51216/IS62WV51216,地址线范围为A0~A18

#define Bank1_SRAM3_ADDR    ((u32)(0x68000000))  //NE3所在区的首地址

1. FSMC初始化函数

    

//初始化外部SRAM

void FSMC_SRAM_Init(void)

{

  FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;

  FSMC_NORSRAMTimingInitTypeDef  readWriteTiming;

  GPIO_InitTypeDef  GPIO_InitStructure;

 

  // 所使用的GPIO的初始化     

 //在使用FSMC功能中所有引脚都要设置成复用推挽输出功能    

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOF|   RCC_APB2Periph_GPIOG,ENABLE);  //使能相应的GPIO时钟

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);  //使能FSMC时钟

  

  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; //PORTD复用推挽输出 

  GPIO_Init(GPIOF, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = 0x043F; //PORTD复用推挽输出 

  GPIO_Init(GPIOG, &GPIO_InitStructure);

 

   //读写时序的设置

  //控制FSMC只用到AddressSetupTime和DataSetupTime

   readWriteTiming.FSMC_AddressSetupTime = 0x00; //地址建立时间(ADDSET)为1个HCLK 

                                                                                           1/72M=14ns

    readWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(ADDHLD)模式A未用到

    readWriteTiming.FSMC_DataSetupTime = 0x03; //数据保持时间(DATAST)为3个HCLK

                                                                                      4/72M=55ns(对EM的SRAM芯片)  

    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; //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  

}

2. 连续写函数

//在指定地址开始,连续写入n个字节.

//pBuffer:字节指针

//WriteAddr:要写入的地址

//n:要写入的字节数

void FSMC_SRAM_WriteBuffer(u8* pBuffer,u32 WriteAddr,u32 n)

{

for( ; n!=0; n--)  

{    

*(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer;   //把地址强制转换为u8类型

WriteAddr++; 

pBuffer++;

}   

}     

假设WriteAddr=0,(注意:写入的地址是偶数)那么A0肯定是0

此时LB=0有效,写入的数据是D0-D7有效 ,D8-D15无效,UB=1

继续写地址1的时候,写入的地址就变成6800 0001,此时自动设置LB=1,无效,UB=0,有效,这时候高八位有效,因此数据就写入高8位地址。

UB,LB与要写入的地址的最低位有关联。

如果要写入的数据是16位,那么UB和LB都等于0.而且地址是偶数。

如果地址是奇数,要写一个16位的数据就需要分两次写入,一次写一个8位。因此如果地址是个奇数,写入一个16位的数据,速度就要减半。     

3. 连续读函数

//在指定地址开始,连续读出n个字节.

//pBuffer:字节指针

//ReadAddr:要读出的起始地址

//n:要写入的字节数

void FSMC_SRAM_ReadBuffer(u8* pBuffer,u32 ReadAddr,u32 n)

{

for(;n!=0;n--)  

{    

*pBuffer++=*(vu8*)(Bank1_SRAM3_ADDR+ReadAddr);    

ReadAddr++; 

}  

4. 测试函数

u32 testsram[250000] __attribute__((at(0X68000000)));//测试用数组,定义数组的初始绝对地址在6800 0000

//外部内存测试(最大支持1M字节内存测试)    

void fsmc_sram_test(u16 x,u16 y)

{  

u32 i=0;    

u8 temp=0;   

u8 sval=0; //在地址0读到的数据     

  LCD_ShowString(x,y,239,y+16,16,"Ex Memory Test:   0KB"); 

//每隔4K字节,写入一个数据,总共写入256个数据,刚好是1M字节

for(i=0;i<1024*1024;i+=4096)

{

FSMC_SRAM_WriteBuffer(&temp,i,1);

temp++;

}

//依次读出之前写入的数据,进行校验  

  for(i=0;i<1024*1024;i+=4096) 

{

  FSMC_SRAM_ReadBuffer(&temp,i,1);

if(i==0)sval=temp;

  else if(temp<=sval)break;//后面读出的数据一定要比第一次读到的数据大.     

LCD_ShowxNum(x+15*8,y,(u16)(temp-sval+1)*4,4,16,0);//显示内存容量  

  }  

}  

c语言小贴士:

__attribute__,这个是 用来指定变量或结构位域的特殊属性,该关键字后的双括弧中的内容是属性说明。 
然后是at关键字,该关键字可以用来设置变量的绝对地址,也就是你可以通过这个关键字,指定某个变量处于内存里面的某个给定的地址. 

综合起来,就是设置变量处于0X68000000这个地址.

在使用FSMC功能中所有引脚都要设置成复用推挽输出功能    

58.外部SRAM实验

读写时序分析

58.外部SRAM实验
经验值 DATAST = 2才能正常工作

58.外部SRAM实验

单位是HCLK个时钟周期

1个HCLK时钟周期为1/72M=13.8ns

DATAST位的值不能为0.(0为保留)


5. 如何对SRAM进行读写

使用指针的方法进行读写

不需要写读写函数,可以直接使用指针的方式对STM32的内存地址进行访问。

(1)首先要定义SRAM的基地址:

#defeine SRAM_BASE_ADDR       (0x68000000)  //基地址从0x68000000开始

#define SRAM_SIZE                      (1*1024*1024) //一共有1M字节

#define SRAM_END_ADDR          (SRAM_BASE_ADDR + SRAM_SIZE)   //SRAM结束的地址

//用#define定义宏的时候用括号是个习惯,防止以后如果有运算的时候会影响宏的运算法则。

 (2)定义指针,操作单字节数据

u8 *p;

p = (u8 *)SRAM_BASE_ADDR; //把数据SRAM_BASE_ADDR强制转换成指针

*p = 0xAB;    //向0x68000000地址写入0xAB


如何操作双字节数据

先定义一个16位的指针

u16 *p16;

p = (u16 *)SRAM_BASE_ADDR; //把数据SRAM_BASE_ADDR强制转换成16位指针

*p16 = 0xCDEF;   //一次可以操作2个字节


如何操作浮点数

定义一个指向浮点数的指针

float *pf;

p = (float *)SRAM_BASE_ADDR; //把数据SRAM_BASE_ADDR强制转换成指向浮点数的指针

*pf = 56.35;

使用绝对地址的方式访问SRAM

u8 testValue __attribute__ ( (at (SRAM_BASE_ADDR ) ) );

把变量testValue的地址定义到0x68000000

testValue = 50;

注意:使用 __attribute__定义变量时必须定义为全局变量

否则如果使用局部变量,变量还是会被定义在内部RAM中。


关键字:外部SRAM  实验 引用地址:58.外部SRAM实验

上一篇:57。STM32 CAN控制器原理与配置
下一篇:56。CAN通信基础知识介绍

推荐阅读

人工智能一直在我们如今的生活中存在着,不管是、、还是商业机器人等等这些硬件已经融入到了各行各业领域。回想一下最近很火的美剧“西部世界”中的人工智能,我们甚至无法想象它是人类还是机器人?这些甚至已经超越我们人类想象无法辩论! 但是模仿人类动作,拥有逼真的机器人一直是未来科技发展的方向,可是现在我们人类的技术还远远达不到像“西部...
  用示波器捕捉了一个未知信号,波形却在不断抖动,以致眼花缭乱不知所措?如何能让波形乖乖听话稳定下来,该调档位还是换触发?别急,3个步骤教你稳定触发。  1.Auto确定波形的外貌图1 接入波形  把信号接进示波器后我们对它还一无所知,所以第1步是要先用Auto功能,将波形捕捉下来。如图2,Auto功能会根据信号的幅值,自动确定垂直档位,把波形都...
本文来自:EEJournal五年前,Intel收购了Altera,并利用Altera技术捍卫了自己在数据中心的主导地位,FPGA市场已经改变了方向,Altera文化已基本融入到更大的Intel公司中,Xilinx和Altera之间长达数十年的不和已经降温,一个关注云和IT,另外一个则更关注传统。两年前,我们推测Xilinx也在为收购做准备。当时一个新的管理团队加入公司,不再强调“FPGA”的...
据近日最新消息,首批骁龙898机型将会在12中旬正式亮相,国内主流厂商也会第一时间跟进推出新机,而且首发机型大概率也是在国产厂商中诞生,其中小米12是最大的可能性之一。  今天上午,知名爆料博主@数码闲聊站 似乎还暗示了小米12的最新配置信息,他透露出了小米迭代机型的百瓦大电池方案,将分别搭载4700mAh±电池和5000mAh±电池。  结...

史海拾趣

问答坊 | AI 解惑

低EMI、D类音频放大器及其应用

PDA、MP3播放器、蜂窝电话等便携式音频装置的设计通常受电源噪声、空间有限、与数字电路共用电源/接地等诸多因素的影响,最终用户在要求提高音频性能的同时还要求延长电池的工作寿命,这些需求往往相互冲突,延长电池的工作时间需要随时关断那些不 ...…

查看全部问答∨

某著名IT企业诚招射频\微波器件工程师

1.了解通信系统和设备,精通射频电路,具有8年以上技术研发与测试经验,负责或参与过整机系统项目开发,具有产品开发经验。了解通讯电子类产品的结构,模具设计; 2.思维敏捷、逻辑性强,有较好的沟通、组织、协调能力、作风严谨、能够承受工作压 ...…

查看全部问答∨

忽悠,我的手提开机峰鸣,无显示是怎么回事

本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 来自EEWORLD合作群:arm linux fpga 嵌入0(49900581) 是手提电脑 …

查看全部问答∨

这种错误怎么回事?error CVT1100: duplicate resource.

CVTRES : fatal error CVT1100: duplicate resource.  type:DIALOG, name:102, language:0x0804 LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt…

查看全部问答∨

TNND最近严打灌水性,无聊性,占楼性回复

RT 最近删回复把我给删郁闷了 如果再发现,直接申请封ID 省事。。。 不知道这是不是传说中的: 先兵后礼再兵 嘿嘿…

查看全部问答∨

有没有支持VXWORKS源代码识别的编辑器?

VXWORKS源代码5.5的tornado2.2的集成开发环境实在不好用,VXWORKS源代码中的大量的条件编译语句看的实在太费劲... 于是自己开发了一个专用的代码编辑器(命名为嵌入式开发代码编辑器Embedit),可以自动识别、标记源代码中的不活跃代码,类似VXWOR ...…

查看全部问答∨

求教Unicode和Ansc2汉字的编码范围

哪位高手可以将汉字的编码范围告诉小弟啊~ 我读出一个字符,怎么判断它是一个汉字,还是无效字符。 目前我只知道0X80以下是特殊字符。。。。…

查看全部问答∨

索尼PSP手机流言被证实 明年过招iPhone (转)

索尼PSP手机流言被证实 明年过招iPhone (转) 上周,传说中的索尼爱立信PlayStation Phone终于露出了庐山真面目,与此同时最早爆料的瘾科技则再次放出了该机的真机照片。下面我们就通过最新得到的这些情报了解一下关于PlayStation Phone ...…

查看全部问答∨

STM32 I2C 的一个奇怪问题

调试一块电路板时发现些问题,希望与大家一起探讨一下。   首先声明一下,我是在调I2C时发现的问题,晶振8M,核工作在72M,I2C总线目前工作在100K,一切正常,但是我感觉程序是有问题的。   (1)       原程 ...…

查看全部问答∨

【设计工具】优化Virtex®-5FXT PowerPC 440处理器系统性能

在该参考系统中,James Lucero介绍了如何改进Virtex®-5FXT FPGA上的PowerPC 440处理器块的系统性能。该参考系统实例说明了如何使XPS Central DMA主接口与PLB Slave 0(SPLB0)或PLB Slave 1(SPLB1)上的Processor Local Bus(PLB)v4.6连接。 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved