×

stm32--------FMC不同位宽地址错位寻址

zxjy辉 zxjy辉 发表于2025-08-15 15:57:50 浏览263 评论0

抢沙发发表评论

日落 景观 风景 - Pixabay上的免费照片


  1. 错位寻址

    1. stm32,FMC总线上的地址[25:0],是按照字节地址进行访问的,也就是一个地址,就代表范围一个字节的数据;

      例如:

      地址0 指向字节0。

      地址1 指向字节1。

      地址2 指向字节2,依此类推


    2. 外部存储器根据其数据宽度使用字寻址,外部存储器有8位宽、16位宽、32位宽的,也就是相当于,一个地址,在不同位宽下,分别是访问1个字节的数据,2字节数据、4个字节数据;

      16位宽度:每个地址(字地址)对应2个字节(16位)。因此,字节地址01映射到字地址0;字节地址23映射到字地址1,等等。外部地址线A是字地址的最低位(LSB)。

      32位宽度:每个地址(字地址)对应4个字节(32位)。因此,字节地址0-3映射到字地址0;字节地址4-7映射到字地址1,等等。外部地址线A同样是字地址的最低位(LSB)

    3. FMC的作用:FMC作为桥梁,负责将STM32内部的字节地址转换为外部存储器所需的字地址。转换方式取决于存储器宽度:

      16位宽度:内部地址右移1位(等效除以2)。

      32位宽度:内部地址右移2位(等效除以4)。 这种右移操作导致了地址线的“错位”映射

  2. 如何理解

    image.png

    8位宽:对于存储器宽度是8位的那就是刚好,1个地址对应一个字节的数据

    16位宽:相当于两个字节地址对应存储一个数据,例如,stm32发出一个内部地址ADDR[25:1],0x...00000010,此时右移一位,变成0x01,映射到外部地址FMC_A0,此时0x01就是对应16位宽存储器的1个数据,对于外部存储器来说,他看到的地址线,都是FMC_A0~FMC_A24,这样硬件上,都是A0~A24都是一一对应连接的

    32位宽:相当于四个字节对应存储一个数据,例如stm32发出一个内部地址ADDR[25:2],0x.....0000100,此时右移两位,变成0x01,此时对应到外部地址上FMC_A0,此时0x01就是对应16位宽存储器的1个数据,对于外部存储器来说,他看到的地址线,都是FMC_A0~FMC_A24,这样硬件上,都是A0~A24都是一一对应连接的

    image.png

#好好学习!

群贤毕至

访客