
- 错位寻址
- stm32,FMC总线上的地址[25:0],是按照字节地址进行访问的,也就是一个地址,就代表范围一个字节的数据; - 例如: - 地址 - 0指向字节0。- 地址 - 1指向字节1。- 地址 - 2指向字节2,依此类推
- 外部存储器根据其数据宽度使用字寻址,外部存储器有8位宽、16位宽、32位宽的,也就是相当于,一个地址,在不同位宽下,分别是访问1个字节的数据,2字节数据、4个字节数据; - 16位宽度:每个地址(字地址)对应2个字节(16位)。因此,字节地址 - 0和- 1映射到字地址- 0;字节地址- 2和- 3映射到字地址- 1,等等。外部地址线A是字地址的最低位(LSB)。- 32位宽度:每个地址(字地址)对应4个字节(32位)。因此,字节地址 - 0-3映射到字地址- 0;字节地址- 4-7映射到字地址- 1,等等。外部地址线A同样是字地址的最低位(LSB)
- FMC的作用:FMC作为桥梁,负责将STM32内部的字节地址转换为外部存储器所需的字地址。转换方式取决于存储器宽度: - 16位宽度:内部地址右移1位(等效除以2)。 - 32位宽度:内部地址右移2位(等效除以4)。 这种右移操作导致了地址线的“错位”映射 
- 如何理解 - 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都是一一对应连接的  
 
        