STM32FSMC移位的问题

本质上是字节寻址和字寻址的问题

以数组举例

u8  string[6],我们可以对这数组的10个单元进行寻址,每个单元的地址都是差1个单位

假设string[0]地址为0x00,则

string[1]                  0x01     0x0000 0001

string[2]                  0x02     0x0000 0010

string[3]                  0x03     0x0000 0011

string[4]                  0x04     0x0000 0100

string[5]                  0x05     0x0000 0101

这正好对应到我们FSMC的8位寻址

u16 string[6] 

string[0]                  0x00     0x0000 0000

string[1]                  0x02     0x0000 0010

string[2]                  0x04     0x0000 0100

string[3]                  0x06     0x0000 0110

string[4]                  0x08     0x0000 1000

string[5]                  0x0A     0x0000 1010

这里为什么地址都变为偶数了呢,因为规定数组每个数据都占2个字节(u16),所以每个数据的地址都相差两个单位(两个字节),所以地址都是偶数。

所以当我们的外部存储器为8位时,是按字节寻址,FSMC配置8位寻址,也是按字节寻址,则一个地址则对应一个位,就不需要移位

字节寻址:一个单元代表一个字节   地址0x01和地址0x02一共占据2个字节的数据

上面的例子就是按字节寻址

按字寻址:假如一个字代表两个字节,则一个单元代表2个字节     地址0x01和地址0x02一共占据4个字节的数据

当我们的外部存储器为16位时,按字节寻址存储器的每一个地址都表示一个16位的数据而对于STM32FSMC来说,配置16位模式,则每写一个数据,他们之间的地址就相差两个字节,如果不移位,0x00 0x02地址写入数据,对于按字寻址的存储器来说,就是写入了0x00(16位数据),0x02(16位数据),可以看到,中间的0x01地址被跳过(注意这里是字寻址,一个单位代表一个字,16位),则会造成数据的混乱,所以需要将数据左移一位,相当于除以2,偶地址变成奇地址,对应16位按字节寻址的存储器,就不会有数据跳过了。

0000 0000             左移    0x0000 0000   

0000 0010             左移    0x0000 0001

0000 0100             左移    0x0000  0010

补充:对32位的处理器,一个字代表4个字节

           对64位的处理器,一个字代表8个字节

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值