专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
fsmc地址线问题
2019-07-20 16:53
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
13831
23
1131
FSMC控制外部SRAM时,地址线A0-A15与SRAM的A0-A15分别对应连接,那么我实际输出的地址其实是左移了一位的地址,如果我的FSMC的A0与某外设的A1相连,而外设的A0与FSMC的NBL0相连,这样地址需要偏移吗?另外如果设置数据宽度为16bit,那么NBL0和NBL1不应该都是输出高吗?有点乱。因为是确实看见有人讲外设的A0与FSMC的NBL0相连
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
23条回答
_tank_
1楼-- · 2019-07-20 19:54
首先 纠正一个问题 实际的输出地址是右移一位地址(16bit模式下)
1、如果我的FSMC的A0与某外设的A1相连,而外设的A0与FSMC的NBL0相连,这样地址需要偏移吗?
如果是16位模式 要的 地址偏移是FSMC内部的固化操作 如果你选择16位模式就会有地址偏移(稍后说明原因) 这样做是为了用户使用方便
2、另外如果设置数据宽度为16bit,那么NBL0和NBL1不应该都是输出高吗?
不一定 偶字节读写时仅NBL0有效,奇字节读写时仅NBL1有效 字读写都有效(低电平有效)
3、有点乱。因为是确实看见有人讲外设的A0与FSMC的NBL0相连
不知道 没见过
这里说一下我对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和NBL1为10 读取高字节数据
所以呢 偶字节读写时仅NBL0有效,奇字节读写时仅NBL1有效 字读写都有效(低电平有效)
加载中...
正点原子
2楼-- · 2019-07-20 21:58
精彩回答 2 元偷偷看……
加载中...
流水无意
3楼-- · 2019-07-21 03:19
我这真没图。
地址线的连线如下
MCU(管脚) 外设
FSMC_NBL0 A0
FSMC_A0 A1
FSMC_A1 A2
FSMC_A2 A3
FSMC_A3 A4
FSMC_A4 A5
FSMC_A5 A6
FSMC_A6 A7
FSMC_A7 A8
FSMC_A8 A9
FSMC_A9 A10
FSMC_A10 A11
FSMC_A11 A12
FSMC_A12 A13
FSMC_A13 A14
FSMC_A14 A15
加载中...
正点原子
4楼-- · 2019-07-21 07:38
这个连接有点怪异,呵呵。
加载中...
流水无意
5楼-- · 2019-07-21 11:09
那么当fsmc设为16位数据宽度,NBL0和NBL1输出应该是高吗?
加载中...
eling13
6楼-- · 2019-07-21 11:20
回复【6楼】_tank_:
---------------------------------
非常强大!!非常NICE!!外部16位SRAM就是如此了,配合D0-D15。
加载中...
1
2
3
4
下一页
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
STM32开发板免费用活动
7 个回答
stm32 处理 DHT11占用太多时间,大家程序是怎么设计的
8 个回答
分享一个STM32单片机做的离线编程器代码
9 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
1、如果我的FSMC的A0与某外设的A1相连,而外设的A0与FSMC的NBL0相连,这样地址需要偏移吗?
如果是16位模式 要的 地址偏移是FSMC内部的固化操作 如果你选择16位模式就会有地址偏移(稍后说明原因) 这样做是为了用户使用方便
2、另外如果设置数据宽度为16bit,那么NBL0和NBL1不应该都是输出高吗?
不一定 偶字节读写时仅NBL0有效,奇字节读写时仅NBL1有效 字读写都有效(低电平有效)
3、有点乱。因为是确实看见有人讲外设的A0与FSMC的NBL0相连
不知道 没见过
这里说一下我对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和NBL1为10 读取高字节数据
所以呢 偶字节读写时仅NBL0有效,奇字节读写时仅NBL1有效 字读写都有效(低电平有效)
地址线的连线如下
MCU(管脚) 外设
FSMC_NBL0 A0
FSMC_A0 A1
FSMC_A1 A2
FSMC_A2 A3
FSMC_A3 A4
FSMC_A4 A5
FSMC_A5 A6
FSMC_A6 A7
FSMC_A7 A8
FSMC_A8 A9
FSMC_A9 A10
FSMC_A10 A11
FSMC_A11 A12
FSMC_A12 A13
FSMC_A13 A14
FSMC_A14 A15
---------------------------------
非常强大!!非常NICE!!外部16位SRAM就是如此了,配合D0-D15。
一周热门 更多>