OpenEdv-开源电子网

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

关于FSMC地址线的理解

  [复制链接]

50

主题

243

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2014-2-26
在线时间
1 小时
发表于 2014-5-30 12:27:22 | 显示全部楼层 |阅读模式
这里说一下我对FSMC地址操作的一点认识

首先说一个前提:STM32 单片机的一个地址(如:0x20000000)是一个字节
也就是说如果定义一个16位数组 u16 temp[5]  如果temp对应的地址是0x00000000 那么temp+1对应的地址是0x00000002 (地址是加2)

假设此时我们有一个 64K*8bit 的sram
那很简单 stm32的A0~A15 与存储器A0~A15连接 大家很容易理解

若此时是 64K*16bit 的sram
也就是此时sram的一个地址对应两个字节 但是stm32是一个地址一个字节 这就出现了对准的问题
如果我们的地址线依然是stm32A0~A15 和 存储器的A0~A15 连接 
如果stm32要从sram中读取前面提到数组中的temp[1]
stm32会给出0x0002(二进制地址0000000000000010b) 可是对于我们这个sram来说 读到却是temp[2],因为sram一个地址就是一个16位数据 
为了解决这个问题 我们只需要在给sram送地址时 右移一位 再送地址 即可(sram的一个地址对应stm32两个地址的数据)
比如读取0x0002 右移一位(即除2)为0x0001(0000000000000010b) 此时对应的就是temp[1]
而为了给用户提供方便 如果你选择的是16位宽度的sram FSMC会在你送地址的时候自动为你做右移一位的操作 
此时会有另外一个问题 每次都右移一位 A0没用吗 也即只能读写偶地址的数据吗?
这也就是NBL0和NBL1的作用了 如果你要进行字节操作 
如stm32发送地址0x0001读取一个字节 右移一位对应的是sram地址0x0000处的16位数据 FSMC会根据AO 来控制NBLO和NBL110 读取高字节数据
所以呢  偶字节读写时仅NBL0有效,奇字节读写时仅NBL1有效 字读写都有效(低电平有效)

我是一只摔不死的蚂蚁!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2014-6-30 21:10:32 | 显示全部楼层
回复【12楼】大晴天:
---------------------------------
不是的。
一个字节就是一个字节,8位。
一个字,一般用Word表示,是32位。
16位,就叫半字。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 1 反对 0

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2014-6-1 12:58:54 | 显示全部楼层
回复【8楼】_tank_:
---------------------------------
综合实验要用到外部内存呢...
否则不够用,光缓存2个主界面,就用了300多KB的内存...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 1 反对 0

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2014-5-31 01:22:29 | 显示全部楼层
不错,谢谢分享。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2014-5-31 01:24:16 | 显示全部楼层
顺便分享我的心得:为了方便布线A0~AXX可以随意互相调换。
但是D0~D15必须按顺序连接,因为u8类型访问的时候,用到LB,UB,必须是D0~D15顺序不乱才可以。
但是A0~AXX可以随意,这样已经可以很大程度方便我们布线了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

50

主题

243

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2014-2-26
在线时间
1 小时
 楼主| 发表于 2014-5-31 13:38:43 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
完了  我的板子 D0~D15也乱序了!!!
我是一只摔不死的蚂蚁!
回复 支持 反对

使用道具 举报

50

主题

243

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2014-2-26
在线时间
1 小时
 楼主| 发表于 2014-5-31 17:35:46 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
板子还没来及焊就挺到这样一个噩耗 那也就是说我的sram只能读写16位数据了 
有没有其他弥补的方法吗?
我是一只摔不死的蚂蚁!
回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2014-5-31 21:54:10 | 显示全部楼层
回复【5楼】_tank_:
---------------------------------
这么悲剧...
没办法,我也是做了一次D0~D15乱序,后面发现不行,才想到这个问题的.
用u16就OK.
用u8就不行了...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

50

主题

243

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2014-2-26
在线时间
1 小时
 楼主| 发表于 2014-6-1 01:03:05 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
啊!!!!!!
我是一只摔不死的蚂蚁!
回复 支持 反对

使用道具 举报

50

主题

243

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2014-2-26
在线时间
1 小时
 楼主| 发表于 2014-6-1 01:31:30 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
我还没有用过外部内存池 我看综合例程里用到SRAMEX的地方也比较少  是不是不用外部SRAM也可以
我是一只摔不死的蚂蚁!
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2014-6-29
在线时间
4 小时
发表于 2014-6-30 08:48:20 | 显示全部楼层


请问那个16k*16位的SRAM的那个地址线和数据线不都是16条吗。。STM32的那个FSMC的数据线也是16条啊、、为啥说是要一对应两个啊。。。

回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2014-6-30 09:31:41 | 显示全部楼层
回复【10楼】大晴天:
---------------------------------
因为是16位的,所以一个地址对应2个字节。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2014-6-29
在线时间
4 小时
发表于 2014-6-30 11:19:02 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
那回复【11楼】正点原子:
---------------------------------
意思是说单片机的位数是32位的??但是回复【11楼】正点原子:
---------------------------------
是不是这样的、。。一个字节是8位。STM32的一个字节是32位但是也是一个字节。。如果是16位的话的是两个字节。。所以在STM32里面就会占用两个字节。。我可以这么理解吗??
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2014-6-29
在线时间
4 小时
发表于 2014-7-1 12:19:29 | 显示全部楼层


恩恩。。那这个是咋个意思啊 。。那个A0-A15是个寻址的范围。。。那个8位的SRAM连接在一起为啥就匹配了。。

为啥那个16位的SRAM与那个相接的话就会有不匹配的现象。。

回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2014-7-1 23:38:25 | 显示全部楼层
回复【14楼】大晴天:
---------------------------------
因为1个地址对1个字节啊.
16位的,1个地址对应2个字节
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2014-6-29
在线时间
4 小时
发表于 2014-7-2 08:15:36 | 显示全部楼层
回复【15楼】正点原子:
---------------------------------哦哦。。。谢谢,,,我懂了
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-4-16
在线时间
0 小时
发表于 2015-4-16 18:26:29 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
悲剧了,光顾着好走线,把地址线接乱!
回复 支持 反对

使用道具 举报

18

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
258
金钱
258
注册时间
2012-10-26
在线时间
23 小时
发表于 2015-7-18 17:12:23 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
随意链接的意思是指写进去的地址是错的,反正读出来的也是错的,也能达到目的的意思么
无个性,不签名
回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2015-7-18 17:50:11 | 显示全部楼层
回复【18楼】suebillt:
---------------------------------
是的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2015-8-26
在线时间
0 小时
发表于 2015-8-26 15:01:09 | 显示全部楼层
顺便分享我的心得:为了方便布线A0~AXX可以随意互相调换

怎么设置分配 顺序呢 在哪个寄存器配置
回复 支持 反对

使用道具 举报

7

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-10-6
在线时间
15 小时
发表于 2015-9-16 11:06:23 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
请问原子个,在地址线不是一一对应的时候,地址该怎样计算?是不是就不能用addr++来自动指到下一个相邻的地址,就要你自己计算?
回复 支持 反对

使用道具 举报

11

主题

193

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2013-3-19
在线时间
20 小时
发表于 2015-9-16 16:49:50 | 显示全部楼层
回复【21楼】creating:
---------------------------------
你用哪条地址线写进去,就还用哪条地址线读出来就可以了,为什么要计算它的地址呢??
回复 支持 反对

使用道具 举报

7

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-10-6
在线时间
15 小时
发表于 2015-10-9 16:41:52 | 显示全部楼层
我之后也想明白了,谢谢啊
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2015-10-26
在线时间
2 小时
发表于 2015-11-9 15:02:54 | 显示全部楼层
stm32一个地址是四个字节吧
回复 支持 反对

使用道具 举报

7

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-9-13
在线时间
9 小时
发表于 2015-11-17 21:15:54 | 显示全部楼层
回复【24楼】淡淡上弦月:
---------------------------------
一个地址是“占”四个字节,但只能“存”一个字节!
0 error 0 warning
回复 支持 反对

使用道具 举报

4

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2013-6-8
在线时间
6 小时
发表于 2016-1-14 11:22:36 | 显示全部楼层
stm32会给出0x0002(二进制地址0000000000000010b) 可是对于我们这个sram来说 读到却是temp[2],
为什么是temp[2]呢?
回复 支持 反对

使用道具 举报

4

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2013-6-8
在线时间
6 小时
发表于 2016-1-14 11:34:30 | 显示全部楼层
stm32会给出0x0002(二进制地址0000000000000010b) 可是对于我们这个sram来说 读到却是temp[2],
是因为stm32 给出的是0x0002,但是stm32内部HADDR[25:1]=0X0004吗?
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-7-22
在线时间
7 小时
发表于 2016-10-19 09:30:17 | 显示全部楼层
豁然开朗
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2016-2-29
在线时间
44 小时
发表于 2017-2-22 14:57:49 | 显示全部楼层
终于懂了一些,谢谢
回复 支持 反对

使用道具 举报

8

主题

145

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2016-12-14
在线时间
75 小时
发表于 2017-2-22 16:49:34 | 显示全部楼层
学习了。。。。。。。。。
书山有路勤为径,学海无涯苦作舟!
回复 支持 反对

使用道具 举报

5

主题

62

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2016-3-9
在线时间
74 小时
发表于 2017-2-22 22:43:54 | 显示全部楼层
D0-D7可以打乱顺序,D8-D15可以打乱顺序
回复 支持 反对

使用道具 举报

8

主题

145

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2016-12-14
在线时间
75 小时
发表于 2017-8-29 11:49:09 | 显示全部楼层
mark....
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2017-6-20
在线时间
32 小时
发表于 2017-10-10 17:57:12 | 显示全部楼层
mark----
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2017-6-20
在线时间
32 小时
发表于 2017-10-10 18:04:53 | 显示全部楼层
正点原子 发表于 2015-7-18 17:50
回复【18楼】suebillt:
---------------------------------
是的

为什么STM32的一个地址就是一个字节?它是8位的??STM32不是32位的吗···@正点原子
回复 支持 反对

使用道具 举报

14

主题

94

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
362
金钱
362
注册时间
2017-10-2
在线时间
80 小时
发表于 2017-10-20 12:47:41 | 显示全部楼层
受教了,谢谢啦
回复 支持 反对

使用道具 举报

7

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
金钱
368
注册时间
2018-8-31
在线时间
115 小时
发表于 2018-8-31 21:43:52 | 显示全部楼层
正点原子 发表于 2014-6-1 12:58
回复【8楼】_tank_:
---------------------------------
综合实验要用到外部内存呢...
否则不够用,光缓存2 ...

1.就是把fsmc的16位数据线当做LCD(16位SRM)的地址线了对不?
然后0-15这16位的每一位对应的地址是16个FSMC的地址?但是不是说单片机每个地址对应存储的是一个字节吗?
回复 支持 反对

使用道具 举报

7

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
金钱
368
注册时间
2018-8-31
在线时间
115 小时
发表于 2018-8-31 21:44:49 | 显示全部楼层
正点原子 发表于 2014-6-1 12:58
回复【8楼】_tank_:
---------------------------------
综合实验要用到外部内存呢...
否则不够用,光缓存2 ...

我怎么不能发求助帖,有些问题啊,求发帖权限,谢谢
回复 支持 反对

使用道具 举报

1

主题

66

帖子

0

精华

高级会员

Rank: 4

积分
526
金钱
526
注册时间
2018-8-13
在线时间
62 小时
发表于 2018-9-3 11:29:52 | 显示全部楼层
我个人认为,什么都可以打乱,不管地址线还是数据线,只要MCU的地址与数据线不乱就行,关于外围器件只要是并行的,数据或地址线序无所为,怎写怎读就可以了。
回复 支持 反对

使用道具 举报

1

主题

66

帖子

0

精华

高级会员

Rank: 4

积分
526
金钱
526
注册时间
2018-8-13
在线时间
62 小时
发表于 2018-9-3 11:32:25 | 显示全部楼层
本帖最后由 书侠客 于 2018-9-3 11:33 编辑

如果是其它器件,地址数据就不能乱了,比如12864液晶模块,它需向里面写命令。求大家关点。
回复 支持 反对

使用道具 举报

4

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
367
金钱
367
注册时间
2016-8-29
在线时间
128 小时
发表于 2018-9-11 10:08:15 | 显示全部楼层
关于FSMC地址线的理解  mark
回复 支持 反对

使用道具 举报

2

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
332
金钱
332
注册时间
2016-11-3
在线时间
49 小时
发表于 2018-9-11 14:36:16 | 显示全部楼层
本帖最后由 唯认真而 于 2018-9-11 14:38 编辑

我感觉第一句里面的“是”改成“对应”会比较好理解一点,“STM32 单片机的一个地址(如:0x20000000)对应一个字节”,所以16位数组 u16 temp[5] 是两个字节,temp+1则地址就要+2
回复 支持 反对

使用道具 举报

5

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2016-11-1
在线时间
27 小时
发表于 2018-9-12 01:45:49 | 显示全部楼层
首先说一个前提:STM32 单片机的一个地址(如:0x20000000)是一个字节
也就是说如果定义一个16位数组 u16 temp[5]  如果temp对应的地址是0x00000000 那么temp+1对应的地址是0x00000002 (地址是加2)
这是说temp+1即是tempaddr+sizeof(temp),定义u16 temp【5】,那么就是tempaddr+2;定义u8 temp【5】,那么就是tempaddr+1.可以这样理解吗。
回复 支持 反对

使用道具 举报

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2015-11-7
在线时间
51 小时
发表于 2019-1-15 16:34:03 | 显示全部楼层
豁然开朗,感谢楼主分享
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-6-10 16:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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