STM32的FSMC靈活靜態(tài)存儲(chǔ)器控制器
FSMC模塊能夠與同步或異步存儲(chǔ)器和16位PC存儲(chǔ)器卡接口,主要將AHB傳輸信號(hào)轉(zhuǎn)換到適當(dāng)?shù)耐獠吭O(shè)備協(xié)議,滿足訪問(wèn)外部設(shè)備的時(shí)序要求。
本文引用地址:http://butianyuan.cn/article/201611/316147.htm存儲(chǔ)器接口包括:
?、佟RAM靜態(tài)隨機(jī)存儲(chǔ)器
?、凇OM只讀存儲(chǔ)器
③ NOR閃存
?、堋SRAM(4個(gè)存儲(chǔ)塊)
⑤ 兩個(gè)NAND閃存塊
?、蕖?6位PC卡
STM32之所以能夠支持NOR FLASH和NAND FLASH兩類訪問(wèn)方式完全不同的存儲(chǔ)器擴(kuò)展,是因?yàn)镕SMC內(nèi)部實(shí)際包括NOR FLASH和NAND / PC Card兩個(gè)控制器,分別支持兩種截然不同的存儲(chǔ)器訪問(wèn)方式。在STM32內(nèi)部,F(xiàn)SMC的一端通過(guò)內(nèi)部高速總線AHB連接到內(nèi)核Cortex-M3,另一端則是面向擴(kuò)展器的外部總線。內(nèi)核對(duì)外部存儲(chǔ)器訪問(wèn)信號(hào)發(fā)送到AHB總線后,經(jīng)FSMC轉(zhuǎn)換為符合外部存儲(chǔ)器通信規(guī)約的信號(hào),送到外部存儲(chǔ)器相應(yīng)的引腳,實(shí)現(xiàn)數(shù)據(jù)交互。FSMC起著橋梁作用,既能進(jìn)行信號(hào)類型的轉(zhuǎn)換,又能進(jìn)行信號(hào)寬度和時(shí)序的調(diào)整,屏蔽掉不同存儲(chǔ)類型的差異,使之對(duì)內(nèi)核而言沒(méi)有區(qū)別。
FSMC模塊框圖如下:
TFT_WR —— PD5/NWE
TFT_RD —— PD4/NOE
數(shù)據(jù)線連接FSMC的數(shù)據(jù)接口,TFT屏背光使用PWM控制。
#define TFT_Command ((uint32_t)0x60000000)
#define TFT_Data ((uint32_t)0x61000000) // FSMC_A23(16位) 注意16位與8位的地址計(jì)算方式不一樣
// 8位地址 ——0x60800000
// 16位地址——0x61000000
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5
| GPIO_Pin_14 | GPIO_Pin_15// | GPIO_Pin_7
| GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;
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_Pin_2;
GPIO_Init(GPIOE, &GPIO_InitStructure);
{
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef p;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC , ENABLE);
TFT_IO_Configuration();
p.FSMC_AddressSetupTime = 1;
p.FSMC_AddressHoldTime = 0;
p.FSMC_DataSetupTime = 2;
p.FSMC_BusTurnAroundDuration = 0;
p.FSMC_CLKDivision = 0;
p.FSMC_DataLatency = 0;
p.FSMC_AccessMode = FSMC_AccessMode_B;
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1; //擴(kuò)展NORBANK的第1個(gè)子BANK
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; //不使用總線復(fù)用
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM; //擴(kuò)展類型為SRAM
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; // 16位總線寬度
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; //讀寫統(tǒng)一時(shí)間參數(shù)
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p; //指向定義的BTR結(jié)構(gòu)
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
}
/*---------------------------------------*/
void TFT_Write_com(u16 dat) //發(fā)送命令
{
*(__IO uint16_t *) (TFT_Command)= dat;
}
/*---------------------------------------*/
void TFT_Write_dat(u16 dat)// 發(fā)送數(shù)據(jù)
{
*(__IO uint16_t *) (TFT_Data)= dat;
}
/*---------------------------------------*/
u16 TFT_Read_dat(void)// 讀數(shù)據(jù)
{
return *(__IO uint16_t *) (TFT_Data);
}
u16 TFT_ReadReg(u16 reg)
{
*(__IO uint16_t *) (TFT_Command)= reg;
return *(__IO uint16_t *) (TFT_Data);
}
評(píng)論