FSMC移位


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

以数组举例

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个字节


文章作者: Joe
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Joe !
评论
  目录