OpenEdv-开源电子网

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

关于外部SRAM的一个问题

[复制链接]

12

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2014-10-23
在线时间
0 小时
发表于 2015-4-17 13:42:16 | 显示全部楼层 |阅读模式
5金钱

原子的写操作代码(此处我们暂时不讨论WriteAddr+1还是+2问题):

[mw_shl_code=c,true]//在指定地址开始,连续写入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+=2;//这里需要加2,是因为STM32的FSMC地址右移一位对其.加2相当于加1. pBuffer++; } }[/mw_shl_code]
我们发现地址被强制的转换成了8位,但是我们知道,FSMC的Bank1第三区地址范围是 0x68000000~0x6BFFFFFF,这些地址都是32位的
当我们进行SRAM操作的时候,这些地址出现AHB上面,其中[25:1]对应FSMC地址的[24:0](16位数据宽度),也就是说AHB上面的[25:1]出现在FSMC地址的[24:0]上面,AHB上面的[26:27]是进行片选控制的。[31:28]这四位,在第三区是6。这些地址在STM32中都是唯一的(我自己的理解,如有错误,不要笑话)。举个例子:比如我们在 地址0X68000020所标识的存储区写入一个数据,当我们强制转换成8位的,也就是只取底8位(自己的理解,有错请不要嘲笑),那么地址就变成了0x20,那问题就来了,这个0X20对应的地址太多了,例如:
0x68111120,0x38001120,0x58110120,.........................这些地址经过强制转换都变成了0x20..................那岂不是乱套了吗?????
这个问题可能问得比较SB,但是我思考了很久,感觉有点眩晕,请大家不吝赐教,谢谢大家

最佳答案

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

亲,看清楚,是将地址转换为一个指向8位字符型的指针,不是将地址转换成8位的
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2012-7-4
在线时间
4 小时
发表于 2015-4-17 13:42:17 | 显示全部楼层
亲,看清楚,是将地址转换为一个指向8位字符型的指针,不是将地址转换成8位的
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2012-7-4
在线时间
4 小时
发表于 2015-4-17 13:48:33 | 显示全部楼层
我也遇到了sram的问题,你帮忙看看:http://www.openedv.com/posts/list/50404.htm
回复

使用道具 举报

12

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2014-10-23
在线时间
0 小时
 楼主| 发表于 2015-4-17 15:54:19 | 显示全部楼层
回复【2楼】huang_4115:
---------------------------------
谢谢!那如果把一个8位字符数据赋值给  *(vu16*)  是不是会自动转换成16位的?
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2012-7-4
在线时间
4 小时
发表于 2015-4-17 15:56:04 | 显示全部楼层
回复【4楼】zhoupan:
---------------------------------
是的
回复

使用道具 举报

12

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2014-10-23
在线时间
0 小时
 楼主| 发表于 2015-4-17 16:02:41 | 显示全部楼层
回复【3楼】huang_4115:
---------------------------------
我看了你的问题,你尝试一下用16位方式进行读取呢,将*(vu8*)改成*(vu16*) ,ReadAddr++;改成ReadAddr+=2;
回复

使用道具 举报

12

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2014-10-23
在线时间
0 小时
 楼主| 发表于 2015-4-17 16:08:15 | 显示全部楼层
回复【5楼】huang_4115:
---------------------------------
回复【5楼】huang_4115:
---------------------------------
我看了你的问题,你尝试一下用16位方式进行读取呢,将*(vu8*)改成*(vu16*) ,ReadAddr++;改成ReadAddr+=2;
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2012-7-4
在线时间
4 小时
发表于 2015-4-18 09:15:29 | 显示全部楼层
问题解决了,是因为挂了另外一个fsmc设备,冲突了,把那个片选关闭就行了,,,

多谢关注
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2012-7-4
在线时间
4 小时
发表于 2015-4-18 09:15:45 | 显示全部楼层
回复【7楼】zhoupan:
---------------------------------
问题解决了,是因为挂了另外一个fsmc设备,冲突了,把那个片选关闭就行了,,, 

多谢关注
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 13:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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