
![]() , @4 A/ Z7 W3 G+ ^0 w/ s, o. l STM32F767的FMC将外部存储器划分为6个固定大小的256M的存储区域,如下图 ![]() 5 X t3 b( [9 }% Y STM32F767的FMC 存储块 1(Bank1 )被分为4个区,每个区管理64M 字节空间,每个 区都有独立的寄存器对所连接储进行配置。Bank1 的 256M字节空间由 28 根地址线 根地址线(HADDR[27:0])寻址。 这里HADDR[27:0]是内部AHB地址总线,其中地址总线HADDR[25:0]来自外部存储器地址FMC_A[25:0](FMC_A[25:0]会接到外部存储器的地址线上,也就是HADDR内部总线的[25:0]来自外部存储器地址线),而 HADDR[26:27] 对4个区进行寻址。如表 18.1.2.1所示: ![]() 比如外部存储器接到FMC_NE1上面,那么外部存储器的地址为HADDR[26:27]+FMC_A[25:0]=0x60000000+FMC_A[25:0]。, t1 z* L0 S2 B) U2 c HADDR[25:0] 位包含外部存储器地址,由于 HADDR为字节地址,而存储器按字寻址,所以根据存储器数据宽度不同,实际向存储器发送的地址也将有所不同,如下表所示。 ![]() . c! K. U4 T! l* M2 \ 因为一个地址对应1个字节数据,所以64M字节的地址量,就能表示64x8=512Mb的数据,也就是外部存储器最大容量为512Mb。 当接的是8位宽度存储器的时候,也就是一个地址正好可以操作一个字节(8位)的数据,需要26根地址线:那么 HADDR[25:0] =FMC _A [25:0] ,就可以了。 ; S9 U6 u$ ]- K2 q5 Y& `& ?0 O 当接的是16位宽度存储器的时候,那么一个地址就可以操作一个字(16位)的数据那么就不需要26根地址线了,HADDR[0]就没有用到,所以:HADDR[25:1] = FMC _A[24:0] 。 例如TFTLCD屏(16位宽存储器)的RS脚接到FMC_A18上面,使用FMC_NE1(就是使用BANK1的子bank1), 4 c) X- Q$ `$ e# l 外部存储器地址线寻址到A18为0时也即是FMC_A[24:0]=0x3FFFF,左移一位付给内部总线HADDR[25:1]=000000 0111 1111 1111 11111110=0x7fffe,所以内部总线读写外部存储器命令(REG)的地址(寻址)就变为0x60000000+0X7FFFE(FMC_A18即RS为0时); 部存储器地址线寻址到A18为1时也即是FMC_A[24:0]=0x40000,左移一位付给内部总线HADDR[25:1]=000000 1000 0000 0000 0000 0000=0x8000,内部总线读写外部存储器数据(RAM)的地址变为0x60000000+0X80000(FMC_A18即RS为1时)。 . K9 q; H0 k* ^0 X- I% l; o* a5 t' U 32位宽的存储器也是如此。 无论外部接8位/16位/32位宽设备,FMC_A[0]永远接在外部设备地址A[0],HADDR[27:26]的设置,是不需要我们干预的,比如当你使用Bank1的第一个区,即使用FMC_NE1连接外部设备的时候,即对应了HADDR[27:26]=00,然后我们需要配置第一区的寄存器组,就可以使用了。 - {7 n) q/ v7 w 转自:冯冲123 5 }% d2 B5 j" l9 H: ` |
谢谢分享,学习一下! |
帮顶一下 |
![]() |
来学习,看一下 |
学习一下 |