STM32F767的FMC將外部存儲器劃分為6個固定大小的256M的存儲區(qū)域,如下圖
STM32F767的FMC 存儲塊 1(Bank1 )被分為 4個區(qū),每個區(qū)管理64M 字節(jié)空間,每個 區(qū)都有獨立的寄存器對所連接儲進行配置。Bank1 的 256M 字節(jié)空間由 28 根地址線 根地址線(HADDR[27:0] )尋址。這里 HADDR[27:0]是內(nèi)部AHB地址總線,其中地址總線HADDR[25:0]來自外部存儲器地址FMC_A[25:0](FMC_A[25:0]會接到外部存儲器的地址線上,也就是HADDR內(nèi)部總線的[25:0]來自外部存儲器地址線), 而 HADDR[26:27] 對4個區(qū)進行尋址。如表 18.1.2.1所示:
比如外部存儲器接到FMC_NE1上面,那么外部存儲器的地址為HADDR[26:27] +FMC_A[25:0]=0x60000000+FMC_A[25:0]。
HADDR[25:0] 位包含外部存儲器地址,由于 HADDR 為字節(jié)地址,而存儲器按字尋址,所以根據(jù)存儲器數(shù)據(jù)寬度不同,實際向存儲器發(fā)送的地址也將有所不同,如下表所示。
因為一個地址對應1個字節(jié)數(shù)據(jù),所以64M字節(jié)的地址量,就能表示64x8=512Mb的數(shù)據(jù),也就是外部存儲器最大容量為512Mb。
當接的是8位寬度存儲器的時候,也就是一個地址正好可以操作一個字節(jié)(8位)的數(shù)據(jù),需要26根地址線:那么 HADDR[25:0] = FMC _A [25:0] ,就可以了。
當接的是16位寬度存儲器的時候,那么一個地址就可以操作一個字(16位)的數(shù)據(jù)那么就不需要26根地址線了,HADDR[0]就沒有用到,所以: HADDR[25:1] = FMC _A[24:0] 。
例如TFTLCD屏(16位寬存儲器)的RS腳接到FMC_A18上面,使用FMC_NE1(就是使用BANK1的子bank1),
外部存儲器地址線尋址到A18為0時也即是FMC_A[24:0]=0x3FFFF,左移一位付給內(nèi)部總線HADDR[25:1]=00 0000 0111 1111 1111 1111 1110=0x7fffe,所以內(nèi)部總線讀寫外部存儲器命令(REG)的地址(尋址)就變?yōu)?x60000000+0X7FFFE(FMC_A18即RS為0時);
部存儲器地址線尋址到A18為1時也即是FMC_A[24:0]=0x40000,左移一位付給內(nèi)部總線HADDR[25:1]=00 0000 1000 0000 0000 0000 0000 =0x8000,內(nèi)部總線讀寫外部存儲器數(shù)據(jù)(RAM)的地址變?yōu)?x60000000+0X80000(FMC_A18即RS為1時)。
32位寬的存儲器也是如此。
無論外部接8位/16位/32位寬設備,F(xiàn)MC_A[0]永遠接在外部設備地址A[0],HADDR[27:26]的設置,是不需要我們干預的,比如當你使用Bank1的第一個區(qū),即使用FMC_NE1連接外部設備的時候,即對應了HADDR[27:26]=00,然后我們需要配置第一區(qū)的寄存器組,就可以使用了。