一。IS62WV51216 简介
1. IS62WV51216 是 ISSI(Integrated Silicon Solution, Inc)公司生产的一颗 16 位宽 512K
(512*16,即 1M 字节)容量的 CMOS 静态内存芯片。
实验选用的芯片没有CS2引脚。
2. IS62WV51216读时序
3. IS62WV51216写时序
二。FSMC简介
1. STM32中FSMC框图
为什么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的原理
三。NOR PSRAM外设接口
驱动SRAM使用存储块1,由4*64MB四个区组成
三。存储块1操作简介
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个字节)
四。FSMC寄存器介绍
FSMC_BWTRx只有在读写时序不一致的时候才设置。
本实验中EXTMOD位设置为0,不允许读写不同的时序,因此FSMC_BWTRx寄存器不需要设置。
片选时序寄存器(FSMC_BTRx)是很重要的一个寄存器,控制访问的时序。
访问模式为模式A,因此ACCMOD设置为00. 控制FSMC只能选用模式A。
五。硬件连接
为了布线方便,IS62WV51216的地址线A0-A18并没有与FSMC的地址线A0-A18相对应,但这样不会影响使用,因为地址具有唯一性,比如写的地址是xx,读的时候地址也是xx,所以不存在任何问题,地址线可以随意乱接的。
但是数据线必须一一对应。
实验中CS接的是FSMC_NE3。
六。驱动代码讲解
//使用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功能中所有引脚都要设置成复用推挽输出功能
读写时序分析
经验值 DATAST = 2才能正常工作
单位是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中。
上一篇:57。STM32 CAN控制器原理与配置
下一篇:56。CAN通信基础知识介绍
推荐阅读
史海拾趣
面对全球市场的竞争压力,EAO公司坚定实施全球化战略。公司在全球范围内建立了完善的销售网络和售后服务体系,为客户提供及时、高效的服务。同时,EAO公司还积极寻求与国际知名企业的合作机会,共同开拓市场、分享资源。通过全球化战略的实施,EAO公司不断提升品牌影响力和市场竞争力。
Aerotronics Marketing Inc公司在市场定位上独具慧眼,准确抓住了电子行业中无人机市场的增长趋势。公司制定了一系列精准的营销策略,包括线上线下推广、行业展会展示、合作伙伴计划等,有效提升了品牌知名度和市场占有率。同时,公司还注重客户关系管理,通过提供优质的售后服务和技术支持,赢得了客户的信任和忠诚。
面对全球电子市场的不断扩张,Artaflex公司制定了全球化的发展战略。公司通过设立海外分支机构、拓展国际市场、参与国际展会等方式,不断提升品牌知名度和市场份额。同时,公司还积极引进国际先进技术和管理经验,提升自身的竞争力。这一战略的实施使得Artaflex在全球电子行业中占据了重要地位。
随着技术的不断成熟,百事通科技(BUDDIES)开始将目光投向更广阔的市场。公司制定了详细的市场拓展计划,通过参加国际电子展、与海外企业建立合作关系等方式,逐步打开了国际市场。同时,公司还注重品牌建设,通过精心设计的品牌形象和广告宣传,提升了品牌知名度和美誉度。
百事通科技(BUDDIES)深知人才是企业发展的核心。因此,公司一直注重人才培养和团队建设。公司建立了完善的人才培养和激励机制,为员工提供广阔的发展空间和良好的工作环境。同时,公司还积极开展团队建设活动,增强员工的凝聚力和归属感。
亿宝科技在成立初期,就明确了以技术创新为核心的发展战略。公司创始人带领研发团队,深入研究市场需求,不断推出具有竞争力的电子产品。在一次偶然的机会中,他们成功研发出一款具有高性能、低功耗特点的芯片,这一创新技术迅速获得了市场的认可。此后,亿宝科技不断加大研发投入,形成了一套完整的自主研发体系,为公司后续的发展奠定了坚实的基础。
PDA、MP3播放器、蜂窝电话等便携式音频装置的设计通常受电源噪声、空间有限、与数字电路共用电源/接地等诸多因素的影响,最终用户在要求提高音频性能的同时还要求延长电池的工作寿命,这些需求往往相互冲突,延长电池的工作时间需要随时关断那些不 ...… 查看全部问答∨ |
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… 查看全部问答∨ |
VXWORKS源代码5.5的tornado2.2的集成开发环境实在不好用,VXWORKS源代码中的大量的条件编译语句看的实在太费劲... 于是自己开发了一个专用的代码编辑器(命名为嵌入式开发代码编辑器Embedit),可以自动识别、标记源代码中的不活跃代码,类似VXWOR ...… 查看全部问答∨ |
|
哪位高手可以将汉字的编码范围告诉小弟啊~ 我读出一个字符,怎么判断它是一个汉字,还是无效字符。 目前我只知道0X80以下是特殊字符。。。。… 查看全部问答∨ |
索尼PSP手机流言被证实 明年过招iPhone (转) 上周,传说中的索尼爱立信PlayStation Phone终于露出了庐山真面目,与此同时最早爆料的瘾科技则再次放出了该机的真机照片。下面我们就通过最新得到的这些情报了解一下关于PlayStation Phone ...… 查看全部问答∨ |
调试一块电路板时发现些问题,希望与大家一起探讨一下。 首先声明一下,我是在调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连接。 ...… 查看全部问答∨ |