【笔记】stm32之FSMC与外部SRAM之间地址的对应关系

时间:2024-03-14 11:28:57

其实说准确点应该是:NOR和PSRAM地址映像
也就是STM32中文参考手册中327页中的这一部分
【笔记】stm32之FSMC与外部SRAM之间地址的对应关系
因为 HADDR是字节地址,也就是说0x6800 0000这一个地址的存储空间是8位的,所以当外部存储器的数据宽度是8位的时候,此时32与外部存储器的地址之间为一一对应的映射关系,也就是访问0x6800 0000时,即访问0x0000 0000;访问0x6800 0001时,即访问0x0000 0001;
那么,以bank3(起始地址为 0x68000000)为例。
假如外部存储器的数据宽度为8位。则两者地址的对应关系为:
0x6800 0000 —— 0x0000 0000
0x6800 0001 —— 0x0000 0001
0x6800 0002 —— 0x0000 0002
0x6800 0003 —— 0x0000 0003

但如果外部存储器的数据宽度是16位的,由于HADDR是字节地址,其数据宽度只有8位所以对应外部存储器的0x0000 0000应该是0x6800 0000和0x6800 0001;对应0x0000 0001的是0x6800 0002和0x6800 0003;
以此类推,则两者地址的对应关系应该为:
0x6800 0000 —— 0x0000 0000
0x6800 0001
0x6800 0002 —— 0x0000 0001
0x6800 0003
0x6800 0004 —— 0x0000 0002
0x6800 0005

此时如果按照外部存储器为8位的访问方式,即访问0x6800 0000时,就是访问0x0000 0000;访问0x6800 0001时,就是访问0x0000 0001;很明显这样的地址对应关系对于访问16位的外部存储器是错误的,因为我们希望的是,在访问0x6800 0001时,访问的还是0x0000 0000,就正如上述对应关系表示的那样。

那在这种情况下,两者的地址应该怎样才能正确的对应起来呢?
为了解决这一问题,官方采取了这种方法:HADDR[25:1] 与 FSMC_A[24:0] 对应相连,HADDR[0]未接,也就是说 HADDR 中 [25:1] 这25位在逻辑上都右移1位
为了方便理解,将上述的地址对应关系转换成二进制(由于例举的数值小,所以只写出二进制的低8位),
转换成二进制之后的对应关系为:
0000 0000 —— 0000 0000
0000 0001
0000 0010 —— 0000 0001
0000 0011
0000 0100 —— 0000 0010
0000 0101

现在对其进行右移1位,那么上述的对应关系也就变成了:
0000 0000 —— 0000 0000
0000 0000
0000 0001 —— 0000 0001
0000 0001
0000 0010 —— 0000 0010
0000 0010

在进行右移1位之后,由上述对应关系可以看出:在访问0x6800 0000和0x6800 0001,,能正确访问0x0000 0000;在访问0x6800 0002和0x6800 0003,能正确访问0x0000 0001了;以此类推,这两者的地址就能正确的对应起来了。

第一次尝试写博客,有什么表达不清楚的地方,请多多包涵。
希望你看完这篇文章后能有所收获。