OpenEdv-开源电子网

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

SRAM的一些问题不懂求解答

[复制链接]

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2013-5-3
在线时间
0 小时
发表于 2014-4-15 23:29:31 | 显示全部楼层 |阅读模式
板子上的1M字节(512K储存单元+16位宽,发开指南这么写的)
我的理解是
地址
0000000000000000000  (19个) 对应储存单元0  16位
0000000000000000001  (19个) 对应储存单元1  16位
.
.
.
问题
怎么进行字节控制?
教程的例子(库函数)
void FSMC_SRAM_WriteBuffer(u8* pBuffer,u32 WriteAddr,u32 n)
{
for(;n!=0;n--)  
{    
*(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer;  
WriteAddr+=2;//这里需要加2,是因为STM32的FSMC地址右移一位对其.加2相当于加1.
pBuffer++;
}   
}
假设WriteAddr=0
第一次往
0000000000000000000 写一个字节
第二次往0000000000000000001 写一个字节
那岂不是 16位的空间 只放了一个字节??
还有那个UB LB信号线控制高低字节在哪里体现,FSMC怎么知道什么时候UB/LB为0 什么时候为1


谢谢了




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2013-5-3
在线时间
0 小时
 楼主| 发表于 2014-4-15 23:31:37 | 显示全部楼层
难道用了那个UB/LB控制线就可以看成1024k个储存单元 +8位位宽?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-4-16 00:03:00 | 显示全部楼层
回复【楼主位】不找借口:
---------------------------------
就是UB,LB的作用,在这里体现了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-4-16 00:03:50 | 显示全部楼层
UB,LB控制16位数据,是高8位,还是低8位,等于就1个地址,可以写2个8位数据了。
所以你在地址0,写u8,就是在SRAM地址0的第八位,在地址1,写u8,就是在SRAM地址0的高八位。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2013-5-3
在线时间
0 小时
 楼主| 发表于 2014-4-16 10:20:28 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
假设我要写入16位的数据 UB LB都要为低电平 FSMC自动控制的吗?
回复 支持 反对

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2013-5-3
在线时间
0 小时
 楼主| 发表于 2014-4-16 11:29:51 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
每次写入数据地址+1,你的理解是...0000000  ...0000001(19位 )共同组成1个储存单元,那么需要20条地址线     而 地址线为19条 只能访问512K个
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-4-16 13:59:30 | 显示全部楼层
回复【5楼】不找借口:
---------------------------------
FSMC自动控制的。
19根就够了,是512*16.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2013-5-3
在线时间
0 小时
 楼主| 发表于 2014-4-16 15:16:16 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
有没大神搞不懂 很明显例程就是往一个地址写一个数据  那么就是16位写一个字节      如果要写2个字节 那么同一地址必须写2次 分别UB LB有效
回复 支持 反对

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2013-5-3
在线时间
0 小时
 楼主| 发表于 2014-4-16 15:21:30 | 显示全部楼层
例程并没有实现字节操作,按原子上面的理解 那么就是有1024K个储存单元 实际上只有19根地址线  只能访问512K个储存单元 字节操作就必须往一个地址写2个数据
回复 支持 反对

使用道具 举报

20

主题

122

帖子

0

精华

高级会员

Rank: 4

积分
636
金钱
636
注册时间
2014-6-20
在线时间
168 小时
发表于 2014-6-26 14:03:52 | 显示全部楼层
我也没搞懂这个 要写入一个u16型数据 怎么调用FSMC_SRAM_WriteBuffer操作?  pBuffer参数要改成u16型吗?
回复 支持 反对

使用道具 举报

20

主题

122

帖子

0

精华

高级会员

Rank: 4

积分
636
金钱
636
注册时间
2014-6-20
在线时间
168 小时
发表于 2014-6-26 15:15:48 | 显示全部楼层
刚刚又搞懂了  改成这样就可以一次写入一个u16型数据了, 这里面的n代表的是数据个数,即如果只写一个FFFF的话,n=1
void FSMC_SRAM_WriteBuffer(u16* pBuffer,u32 WriteAddr,u32 n)
{
for(;n!=0;n--)  
{     
*(vu16*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer;   
WriteAddr+=2;
pBuffer++;
}   
}
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2019-3-20
在线时间
5 小时
发表于 2019-5-3 22:07:10 | 显示全部楼层
Fliger 发表于 2014-6-26 15:15
刚刚又搞懂了  改成这样就可以一次写入一个u16型数据了, 这里面的n代表的是数据个数,即如 ...

你这个是对的  FSMC里面有介绍 在外部存储器是16 位的时候   HADDR[0]  是丢的掉的  也就是说STM32在发送这两个地址00000000  00000001  HADDR[25:1]是一样的  这个时候LB  UB就会介入操作  推而广之  也就是说只有当2的一次方以上的位数变化   HADDR[25:1]才会变化
存在SRAM的地址才会变化
所以说发送16位的数据  +2是对的  
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2019-9-26
在线时间
12 小时
发表于 2019-12-19 09:19:26 | 显示全部楼层
我也觉得加2是不对的,加2后16位空间只存了一位数据,不知道是不是理解有问题。
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2019-9-26
在线时间
12 小时
发表于 2019-12-19 09:30:20 | 显示全部楼层
我觉得UB/LB的作用应该是在16位宽的情况下,总线地址向右移动了一位对应到了硬件的地址端口,比如总线访问外部地址0字节单元和1字节单元的时候,到硬件
地址上的地址信息因为右移结果都是0单元,如果是读地址0单元,直接一次读取16个BIt,把不要的数据屏蔽了就好,写的话就有问题了,写0单元和1单元的时候
硬件地址信息都是0,这个时候就是UB/LB起作用了,加入写的是偶数,就写低字节,基数就是高字节。不知道这样理解对不对??如果是对的话那里的地址加2就
会有问题。
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2019-9-26
在线时间
12 小时
发表于 2019-12-19 09:40:01 | 显示全部楼层
正点原子 发表于 2014-4-16 00:03
UB,LB控制16位数据,是高8位,还是低8位,等于就1个地址,可以写2个8位数据了。
所以你在地址0,写u8,就是 ...

这里有点不明白原子哥,如果是(WriteAddr+=2;//这里需要加2,是因为STM32的FSMC地址右移一位对其.加2相当于加1.)那下一个字节就直接写到外部SRAM的下一个16位单元中了吧。如果是加1的话由于总线右移,到外部SRAM的地址不变,这个时候才能体现UB/LB的作用吧?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-21 12:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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