OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6856|回复: 16

SRAM的地址问题

[复制链接]

28

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-2-17
在线时间
9 小时
发表于 2015-11-4 20:26:13 | 显示全部楼层 |阅读模式
5金钱
原子哥,你好,请问你一个问题。

我们战舰开发板的SRAM芯片是512K,16字节的,我认为512K,就是这个芯片的地址只有512K个,
但是在那一节的主函数里面有下面这个函数,当 i 接近1024*1024(1M)的时候SRAM芯片不是早已经不够写了吗。因为SRAM只有512地址啊,
原子哥,可以解释一下吗?
for(i=0;i<1024*1024;i+=4096)
{
FSMC_SRAM_WriteBuffer(&temp,i,1);
temp++;
}


void FSMC_SRAM_WriteBuffer(u8* pBuffer,u32 WriteAddr,u32 n)
{
for(;n!=0;n--)  
{    
*(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer;  
WriteAddr+=2;
pBuffer++;
}   


最佳答案

查看完整内容[请看2#楼]

这里是以*(vu8*)的方式访问,按字节访问。 是512个地址没错,但是用u8访问的时候,就可以扩展成1024个地址(通过UB/LB控制)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-11-4 20:26:14 | 显示全部楼层
这里是以*(vu8*)的方式访问,按字节访问。
是512个地址没错,但是用u8访问的时候,就可以扩展成1024个地址(通过UB/LB控制)
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11566
金钱
11566
注册时间
2014-4-1
在线时间
1319 小时
发表于 2015-11-4 20:34:28 | 显示全部楼层
512K,16字节?16位?

估计是16位,实际容量是 512K * 2 = 1M字节。
所以,1024 * 1024 是按字节操作的。

猜的。
回复

使用道具 举报

28

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-2-17
在线时间
9 小时
 楼主| 发表于 2015-11-4 20:40:41 | 显示全部楼层
回复【2楼】xuande:
---------------------------------
512K,16字节的,但是地址不是只有512K个吗,而1024*1024(1M)早就超出其地址了?
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2015-6-11
在线时间
313 小时
发表于 2015-11-4 21:01:17 | 显示全部楼层
既然是操作FSMC,明显是扩展外部SRAM的程序,当然可以大于1M了
回复

使用道具 举报

28

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-2-17
在线时间
9 小时
 楼主| 发表于 2015-11-4 22:57:19 | 显示全部楼层
回复【4楼】zc123:
---------------------------------
但是外部只有512K个地址啊
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11566
金钱
11566
注册时间
2014-4-1
在线时间
1319 小时
发表于 2015-11-4 23:23:47 | 显示全部楼层
是 FSMC接口吗?

如果是,ARM芯片的地址肯定不止512K。
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11566
金钱
11566
注册时间
2014-4-1
在线时间
1319 小时
发表于 2015-11-4 23:25:47 | 显示全部楼层
你这问题没有给出足够的背景。

只有知道的人才会知道。
回复

使用道具 举报

28

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-2-17
在线时间
9 小时
 楼主| 发表于 2015-11-4 23:40:25 | 显示全部楼层
回复【7楼】xuande:
---------------------------------
其实就是原子例程外部SRAM实验,我想说的是原子例程外部SRAM实验的SRAM芯片是一个512K,16字节的SRAM,那么其内存应该是0X00000000,
0X00000001,0X00000002,........到512K,总共512K个地址单元,
而原子哥程序里面有这一句话,*(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer; 我就觉得WriteAddr的数字不应该大于512K,因为
IS62WV51216芯片总共才只有512K个地址单元,但是 原子哥里面对IS62WV51216芯片进行写时候有下面这一函数,我就觉得下面的 i 不应该
大于512K,而1024*1024已经是1M了,这样的话当i大于512K的时候,写入IS62WV51216芯片的数据就会溢出了,不是吗?
for(i=0;i<1024*1024;i+=4096)
{
FSMC_SRAM_WriteBuffer(&temp,i,1);
temp++;
}
回复

使用道具 举报

28

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-2-17
在线时间
9 小时
 楼主| 发表于 2015-11-4 23:42:11 | 显示全部楼层
回复【7楼】xuande:
---------------------------------
这里写入数据的地方不是ARM芯片的地址,而是战舰开发板外部SRAM,    
IS62WV51216芯片
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-11-5 10:19:25 | 显示全部楼层
大哥,那个是16位的SRAM啊!也就是512*16bit=1M字节的!还有就是谁说的见到512k就是只能寻找512k个字节的地址。A类型的房间有8个人,B类型房间有16个人,A类型和B类型的房间各有512个,你是不是要告诉我A类型的房间总人数和B类型的相同?!512K个地址是没错,但是每个地址的容量相同吗?你是不是又要问我那怎么读取一个字节?FSMC上的UB和LB就是干这个事的,用来判断读取哪个字节,具体的操作过程你看不到,STM32自己就完成了。
开往春天的手扶拖拉机
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2015-8-28
在线时间
9 小时
发表于 2015-11-5 10:23:54 | 显示全部楼层
回复【9楼】前进的小兵:
---------------------------------
你一直原子哥的外部SRAM是一个512K,16字节的SRAM,你还是看的不够仔细,原话如下:IS62WV51216 是 ISSI( Integrated Silicon Solution, Inc)公司生产的一颗 16 位宽 512K
( 512*16,即 1M 字节)。是16位宽不是16字节,这差多了,16位宽2字节,供1M字节。每次写1字节,每隔4K写一次,共写256次,刚好1M。
回复

使用道具 举报

28

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-2-17
在线时间
9 小时
 楼主| 发表于 2015-11-5 11:58:24 | 显示全部楼层
回复【10楼】zuozhongkai:
---------------------------------
哥们,看了一些资料,貌似有点明白了,等晚上我回去给你回复邮件,验证一下我的想法。哈哈,谢谢你。
回复

使用道具 举报

28

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-2-17
在线时间
9 小时
 楼主| 发表于 2015-11-5 22:02:24 | 显示全部楼层
你好 ,我大概明白了,如下图所示,STM32的FSMC第一块第三部分地址是从0X68000000开始的,但是这个地址只能存储一个字节,而SRAM
地址是从0x00000000,开始的,但是SRAM的地址能储存2个字节,所以,STM32的2个FSMC地址对应SRAM一个地址,是吧?

还有一个问题 ,在原子战舰开发板外部SRAM实验里有下面有个程序(如下所示),其中有句话
*(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer; ,假设WriteAddr是偶数,因为*pBuffer是一个字节的长度,所以SRAM的一个地址只写入了一个字节,
如果把*pBuffer的长度改成2个字节,那么是不是可以说SRAM的一个地址写入了两个字节



void FSMC_SRAM_WriteBuffer(u8* pBuffer,u32 WriteAddr,u32 n)
{
for(;n!=0;n--)  
{    
*(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer;  
WriteAddr+=2;
pBuffer++;
}   
}










回复

使用道具 举报

28

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-2-17
在线时间
9 小时
 楼主| 发表于 2015-11-5 22:47:40 | 显示全部楼层
回复【13楼】前进的小兵:
---------------------------------
这个,其实主要是看你的前面的语句 
//在指定地址((WriteAddr+Bank1_SRAM3_ADDR))开始,连续读出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++; 
}   
}  
这是寄存器版本的代码。 
主要是看*(vu8*),还是*(vu16*),来决定是++还是+2.



看了原子哥上面那句话,明白了。欧耶。
回复

使用道具 举报

28

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-2-17
在线时间
9 小时
 楼主| 发表于 2015-11-5 23:04:19 | 显示全部楼层
回复【15楼】正点原子:
---------------------------------
嗯  明白了  谢谢。
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-10-29
在线时间
6 小时
发表于 2019-12-31 15:46:28 | 显示全部楼层
原子哥,如果我在跑程序的时候变量是通过指针的方式去操作这个RAM,16bit的意义不大吧。反而感觉这是浪费
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-5 01:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表