許某人:http://blog.csdn.net/hduxyc/article/details/6426463
FSMC全稱“靜態存儲器控制器”。
使用FSMC控制器后,可以把FSMC提供的FSMC_A[25:0]作為地址線,而把FSMC提供的FSMC_D[15:0]作為數據總線。
(1)當存儲數據設為8位時,(FSMC_NANDInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b)
地址各位對應FSMC_A[25:0],數據位對應FSMC_D[7:0]
(2)當存儲數據設為16位時,(FSMC_NANDInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b)
地址各位對應FSMC_A[24:0],數據位對應FSMC_D[15:0]
FSMC 包括4個模塊:
(1)AHB接口(包括FSMC配置寄存器)
(2)NOR閃存和PSRAM控制器(驅動LCD的時候LCD就好像一個PSRAM的里面只有2個16位的存儲空間,一個是DATA RAM 一個是CMD RAM)
(3)NAND閃存和PC卡控制器
(4)外部設備接口
注:FSMC可以請求AHB進行數據寬度的操作。如果AHB操作的數據寬度大於外部設備(NOR或NAND或LCD)的寬度,此時FSMC將AHB操作分割成幾個連續的較小的數據寬度,以適應外部設備的數據寬度
FSMC對外部設備的地址映像從0x6000 0000開始,到0x9FFF FFFF結束,共分4個地址塊,每個地址塊256M字節。可以看出,每個地址塊又分為4個分地址塊,大小64M。對NOR的地址映像來說,我們可以通過選擇HADDR[27:26]來確定當前使用的是哪個64M的分地址塊,如下頁表格。而這四個分存儲塊的片選,則使用NE[4:1]來選擇。數據線/地址線/控制線是共享的。
NE1 ->Bank1 NE2->Bank2 NE3->Bank3 NE4->Bank4
若 NE1 連接, 則

每小塊NOR/PSRAM 64M
第一塊:6000 0000h--63ff ffffh (DATA長度為8位情況下,由地址線FSMC_A[25:0]決定;DATA長度為16位情況下,由地址線FSMC_A[24:0]決定)
第二塊:6400 0000h--67ff ffffh
第二塊:6800 0000h--6bff ffffh
第三塊:6c00 0000h--6fff ffffh
注:這里的HADDR是需要轉換到外部設備的內部AHB地址線,每個地址對應一個字節單元。因此,若外部設備的地址寬度是8位的,則HADDR[25:0]與STM32的CPU引腳FSMC_A[25:0]一一對應,最大可以訪問64M字節的空間。若外部設備的地址寬度是16位的,則是HADDR[25:1]與STM32的CPU引腳FSMC_A[24:0]一一對應。在應用的時候,可以將FSMC_A總線連接到存儲器或其他外設的地址總線引腳上。
例:STM32F10XX FCMS控制LCD的驅動
FSMC提供了所有的LCD控制器的信號:
STM32f10xxx FSMC有四個不同banks(每個64M字節)考研支持NOR、nand等其他類似的存儲器。這些外部設備的地址線,數據先和控制線是共享的。每個設備的訪問通過片選來決定,而每次只能訪問一個設備
FSMC_D[16:0] ->16bit地址總線
FSMC NEx:分配給NOR的256M,再分成4個區。每個區用來分配一個外設,這四個外設的片選:NE1-NE4,對應的不同的引腳
FSMC NOE:輸出使能,連接LCD的RD腳
FSMC NWE:寫使能,連接LCD的RW腳
FSMC Ax:用在LCD顯示RAM和寄存器之間進行選擇的地址線,即該線用於選擇LCD的RS腳,該線可用地址線的任意一根線,范圍:FSMC_A[25:0]。(RS=0表示指令,RS=1表示數據)
例:選擇NOR的第一個存儲區,並且使用FSMC_A16來控制LCD的RS引腳,則我們訪問LCD顯示RAM的基址為0x60020000 LCD命令寄存器地址為:0x60000000
例:選擇NOR的第四個存儲區,並且使用FSMC_A0來控制LCD的RS引腳,則我們訪問LCD顯示RAM的基址為0x6C000002 LCD命令寄存器地址為:0x6C000000