標籤:
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控制器的訊號:
FSMC_D[16:0] ?? 16bit的資料匯流排
FSMCNEx:分配給NOR的256M,再分為4個區,每個區用來分配一個外設,這四個外設的片選分為是NE1-NE4,對應的引腳為:PD7—NE1,PG9—NE2,PG10-NE3,PG12—NE4
FSMC NOE:輸出使能,串連LCD的RD腳。
FSMC NWE:寫使能,串連LCD的RW腳。
FSMCAx:用在LCD顯示RAM和寄存器之間進行選擇的地址線,即該線用於選擇LCD的RS腳,該線可用地址線的任意一根線,範圍:FSMC_A[25:0]。
註:RS = 0時,表示讀寫寄存器;RS = 1表示讀寫資料RAM。
舉例1:選擇NOR的第一個儲存區,並且使用FSMC_A16來控制LCD的RS引腳,則我們訪問LCD顯示RAM的基址為0x60020000,訪問LCD寄存器的地址為:0x6000 0000。因為資料長度為16bit,所以FSMC_A[24:0]對應HADDR[25:1] 所以顯示RAM的基址=0x60000000+2^16*2=0x60000000+0x2 0000=0x60020000
舉例2:選擇NOR的第四個儲存區,使用FSMC_A0控制LCD的RS腳,則訪問LCD顯示RAM的基址為0x6c000002,訪問LCD寄存器的地址為:0x6c00 0000。
例:
FSMC_D[15:0],連16bit資料線;FSMC_NE1,連片選:只有bank1可用
FSMC NOE:輸出使能
FSMC NEW:FSMC寫使能
FSMC Ax:串連RS,可用範圍FSMC_A[24:0]
一般使用模式B來做LCD的介面控制,不適用外擴模式。並且讀寫操作的時序一樣。此種情況下,我們需要使用三個參數:ADDSET,DATAST,ADDHOLD。這三個參數在位域FSMC_TCRx中設定。
當HCLK的頻率是72MHZ,使用模式B,則有如下時序:
地址建立時間:0x1
地址保持時間:0x0
資料建立時間:0x2
註:這裡地址建立 地址保持資料建立三個時間不知道怎麼設出來的。。。。。我是根據別人的經驗來設定的。高手知道這個設定不同有什麼區別的話,請指教,謝謝:)
*******************************************************************************
* 函數名: LCD_CtrlLinesConfig
* 參 數: 無
* 返 回: 無
* 功 能: 配置LCD控制口線,FSMC管腳設定為複用功能
*/
voidLCD_CtrlLinesConfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
* RCC使能FSMC的時鐘直接來自AHB時鐘, 也就是HCLK, 中間沒有分頻.控制位是RCC_AHBENR中的FSMCEN位
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
GPIO連接埠和AFIO連接埠時鐘來自APB2, 也就是PCLK2, 控制位是RCC_APB2ERN中的IOPxEN和AFIOEN位
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4| GPIO_Pin_5 |GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |GPIO_Pin_11 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9| GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 |GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOE, &GPIO_InitStructure);
//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
//GPIO_Init(GPIOF, &GPIO_InitStructure);
//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
//GPIO_Init(GPIOG, &GPIO_InitStructure);
}
對於用於FSMC輸出的訊號線要設定為複用推挽輸出模式(Alternate function push- pull).
對於用於FSMC輸入的訊號線要怎樣設定目前還不清楚,??????
*FSMC自身設定
FSMC自身設定有兩塊, 一塊是控制方式設定, 是針對FSMC_DCR的設定, 另一塊是讀寫時序設定,是針對FSMC_DTR的設定.
NORFLASH和PSRAM的操作時序設定----- FSMC_DTR的設定.
void LCD_FSMCConfig(void)
{
FSMC_NORSRAMTimingInitTypeDef p;
p.FSMC_AddressSetupTime = 1;
p.FSMC_AddressHoldTime = 1;
p.FSMC_DataSetupTime = 20;
p.FSMC_BusTurnAroundDuration = 0;
p.FSMC_CLKDivision = 0;
p.FSMC_DataLatency = 1;
p.FSMC_AccessMode = FSMC_AccessMode_A;
下面這段是對控制方式的設定----FSMC_DCR的設定
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux =FSMC_DataAddressMux_Disable;
FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth =FSMC_MemoryDataWidth_16b;
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity =FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_WrapMode =FSMC_WrapMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive =FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAMInitStructure.FSMC_WriteOperation =FSMC_WriteOperation_Enable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignal =FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode =FSMC_ExtendedMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_AsyncWait =FSMC_AsyncWait_Disable;
FSMC_NORSRAMInitStructure.FSMC_WriteBurst =FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct =&p;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
}
小結:這裡使用的地址映射屬於BANK1 NOR/PSRAM1 所以DATA資料基址為0x6c000000 又因為LCD的RS串連在FSMC_A0上所以CMD地址為0x6c000002。配置好FSMC後,要寫DATA或CMD時只要對這兩個地址操作就可以了。
(十)stm32中FSMC的使用(用於LCD)