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