MM32系列微控制器為用戶提供了豐富的選擇,可適用于工業(yè)控制、智能家電、建筑安防、醫(yī)療設(shè)備以及消費(fèi)類電子產(chǎn)品等多方位嵌入式系統(tǒng)設(shè)計(jì)。在某些應(yīng)用中,需要較大容量的存儲(chǔ)空間用于存儲(chǔ)數(shù)據(jù);這時(shí)可以通過(guò)SPI 外擴(kuò)NOR Flash,NAND Flash, 或者通過(guò)SDIO擴(kuò)展SD Card或TF-Card。但有些需要高速存儲(chǔ)數(shù)據(jù),上述方式還是不夠快速,這時(shí)可以使用MM32F3270系列的FSMC來(lái)外擴(kuò)并行NOR Flash來(lái)實(shí)現(xiàn)。
并行NOR Flash與并行SRAM和PSRAM的讀寫接口大部分相同,但NOR Flash的寫入速度與SRAM和PSRAM比較,相對(duì)較慢,需要通過(guò)NWAIT 信號(hào)檢查NOR Flash的操作狀態(tài),并做一些等待,相應(yīng)的時(shí)序需要根據(jù)不同的NOR Flash芯片所規(guī)定的參數(shù)而做相應(yīng)的設(shè)置即可。
本文接下來(lái)就使用MM32F3270外掛S29GL128P NOR Flash芯片來(lái)演示FSMC對(duì)NOR Flash芯片的設(shè)置與讀寫。
前文已經(jīng)介紹了MM32F3270的FSMC的接口功能與特色。結(jié)合MM32F3270 的FSMC外部接口信號(hào),可使用異步方式訪問(wèn)NOR Flash,可以選用復(fù)用或非復(fù)用方式擴(kuò)展NOR Flash,還可以通過(guò)配置實(shí)現(xiàn)外擴(kuò)8位總線或16位總線接口的NOR Flash。
表1:FSMC控制器外部信號(hào)
MM32F3270系列MCU因?yàn)榉庋b的原因,導(dǎo)致只有部分MCU產(chǎn)品可以通過(guò)硬件復(fù)用出全部或部分的FSMC接口的相關(guān)GPIO;外擴(kuò)NOR Flash也只有使用 LQFP144引腳封裝MCU芯片才能支持連接地址數(shù)據(jù)非復(fù)用和復(fù)用方式外擴(kuò)并行NOR Flash;而LQFP100引腳封裝芯片因地址線縮減,僅支持連接地址數(shù)據(jù)復(fù)用方式外擴(kuò)并行NOR Flash。LQFP64因?yàn)闊o(wú)法引出足夠的地址與數(shù)據(jù)總線,同樣不支持外擴(kuò)并行NOR Flash。
表2:MM32F3270不同封裝芯片與NOR Flash接口
目前市場(chǎng)上非復(fù)用型16位數(shù)據(jù)總線接口的NOR Flash也是較為普遍,下面針對(duì)非復(fù)用方式,介紹MCU與NOR Flash的硬件原理圖設(shè)計(jì)和軟件寄存器配置。
在此用MM32F3270的FSMC接口擴(kuò)展S29GL128P NOR Flash,其原理框圖如下:
圖1:NOR Flash原理框圖
S29GL128P的數(shù)據(jù)按 16 位的Half Word尋址,容量128M Bit, 16M字節(jié),從芯片手冊(cè)中可以查詢到S29GL128P的引腳功能描述如下:
表3:NOR Flash引腳信號(hào)
S29GL128P可以通過(guò)CS, OE, WR, WP#, RY/BY#控制電路,結(jié)合Address與Data I/O實(shí)現(xiàn)對(duì)NOR Flash的讀寫操作。
1、FSMC非復(fù)用方式控制NOR Flash的硬件設(shè)計(jì)
表4:NOR Flash數(shù)據(jù), 地址, 讀寫信號(hào)與MCU接口的引腳說(shuō)明
外部設(shè)備地址映像從FSMC的角度看,F(xiàn)SMC外擴(kuò)尋址空間用于訪問(wèn)最多4個(gè)FSMC地址映射空間,可以用于訪問(wèn)4個(gè)NOR閃存或SRAM/PSRAM存儲(chǔ)設(shè)備,并對(duì)應(yīng)的有4個(gè)專用的片選FSMC_NE[4:1]。
外部存儲(chǔ)器劃分為固定大小為64M字節(jié)的四個(gè)存儲(chǔ)塊,見下圖。

存儲(chǔ)區(qū)塊與片選信號(hào)對(duì)應(yīng)關(guān)系:

HADDR是需要轉(zhuǎn)換到外部存儲(chǔ)器的內(nèi)部AHB地址線。HADDR[25:0]包含外部存儲(chǔ)器地址。HADDR是字節(jié)地址,而存儲(chǔ)器訪問(wèn)不都是按字節(jié)訪問(wèn),因此接到存儲(chǔ)器的地址線依存儲(chǔ)器的數(shù)據(jù)寬度有所不同,如下表:

對(duì)于16位寬度的外部存儲(chǔ)器,F(xiàn)SMC將在內(nèi)部使用HADDR[25:1]產(chǎn)生外部存儲(chǔ)器的地址FSMC_A[24:0]。不論外部存儲(chǔ)器的寬度是多少(16位或8位),F(xiàn)SMC_A[0]始終應(yīng)該連到外部存儲(chǔ)器的地址線A[0]。
根據(jù)外部NOR Flash設(shè)計(jì)原理圖:

2、FSMC非復(fù)用方式控制NOR Flash的程序設(shè)計(jì)
根據(jù)配置的接口電路配置GPIO初始化程序與FSMC初始化程序。
void FSMC_NOR_Init(void)
{
FSMC_InitTypeDef FSMC_InitStructure;
FSMC_NORSRAM_Bank_InitTypeDef FSMC_BankInitStructure;
FSMC_NORSRAM_BankStructInit( FSMC_BankInitStructure);
FSMC_NORSRAMStructInit( FSMC_InitStructure);
RCC_AHB3PeriphClockCmd(RCC_AHB3ENR_FSMC, ENABLE);
FSMC_BankInitStructure.FSMC_SMReadPipe = 0;
FSMC_BankInitStructure.FSMC_ReadyMode = 0;
FSMC_BankInitStructure.FSMC_WritePeriod = 15;
FSMC_BankInitStructure.FSMC_WriteHoldTime = 3;
FSMC_BankInitStructure.FSMC_AddrSetTime = 3;
FSMC_BankInitStructure.FSMC_ReadPeriod = 15;
FSMC_BankInitStructure.FSMC_DataWidth = FSMC_DataWidth_16bits;
FSMC_NORSRAM_Bank_Init( FSMC_BankInitStructure,
FSMC_NORSRAM_BANK1);
FSMC_InitStructure.FSMC_Mode = FSMC_Mode_NorFlash;
FSMC_InitStructure.FSMC_TimingRegSelect = FSMC_TimingRegSelect_0;
FSMC_InitStructure.FSMC_MemSize = FSMC_MemSize_64MB;
FSMC_InitStructure.FSMC_MemType = FSMC_MemType_FLASH;
FSMC_InitStructure.FSMC_AddrDataMode = FSMC_AddrDataDeMUX;
FSMC_NORSRAMInit( FSMC_InitStructure);
}
GPIO初始化
void FSMC_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_StructInit( GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOB | RCC_AHBENR_GPIOC |
RCC_AHBENR_GPIOA | RCC_AHBENR_GPIOD | RCC_AHBENR_GPIOE |
RCC_AHBENR_GPIOF | RCC_AHBENR_GPIOG, ENABLE);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_12); //NOE
GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_12); //NWE
GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_12); //NWAIT
GPIO_PinAFConfig(GPIOD, GPIO_PinSource11, GPIO_AF_12); //A16
GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_12); //A17
GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_12); //A18
GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_12); //D0
GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_12); //D1
//省略部分代碼
GPIO_PinAFConfig(GPIOF, GPIO_PinSource0, GPIO_AF_12); //A0
GPIO_PinAFConfig(GPIOF, GPIO_PinSource1, GPIO_AF_12); //A1
GPIO_PinAFConfig(GPIOF, GPIO_PinSource2, GPIO_AF_12); //A2
GPIO_PinAFConfig(GPIOF, GPIO_PinSource3, GPIO_AF_12); //A3
//省略部分代碼
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
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_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_FLOATING;
GPIO_Init(GPIOD, GPIO_InitStructure);
//省略部分代碼
}
從選擇的片選信號(hào)與FSMC外擴(kuò)存儲(chǔ)映像空間可以得出Bank2地址為0x64000000,使用該地址作為讀寫外部NOR Flash的基地址。
#define NOR_FLASH_START_ADDR ((u32)0x64000000)
#define NOR_FLASH_END_ADDR ((u32)0x67FFFFFF)
//讀一個(gè)半字
u16 FSMC_NOR_ReadHalfWord(u32 ReadAddr)
{
NOR_WRITE(ADDR_SHIFT(0x00555), 0x00AA);
NOR_WRITE(ADDR_SHIFT(0x002AA), 0x0055);
NOR_WRITE((NOR_FLASH_START_ADDR + ReadAddr), 0x00F0 );
/* exit autoselect (write reset command) */
return (*(vu16*)((NOR_FLASH_START_ADDR + ReadAddr)));
}
//連續(xù)讀一塊半字?jǐn)?shù)據(jù)
void FSMC_NOR_ReadBuffer(u16* pBuffer, u32 ReadAddr, u32 NumHalfwordToRead)
{
NOR_WRITE(ADDR_SHIFT(0x0555), 0x00AA);
NOR_WRITE(ADDR_SHIFT(0x02AA), 0x0055);
NOR_WRITE((NOR_FLASH_START_ADDR + ReadAddr), 0x00F0);
/* exit autoselect (write reset command) */
for(; NumHalfwordToRead != 0x00; NumHalfwordToRead--) {
// Read a Halfword from the NOR
*pBuffer++ = *(vu16*)((NOR_FLASH_START_ADDR + ReadAddr));
ReadAddr = ReadAddr + 2;
}
}
讀寫外部NOR Flash與讀寫外部SRAM的操作,地址尋址方式是一樣的,但NOR Flash的寫數(shù)據(jù)有較大的不同。
以單個(gè)Word編程為例,如下為寫單個(gè)Word的流程圖與實(shí)現(xiàn)代碼:

NOR_Status FSMC_NOR_WriteHalfWord(u32 WriteAddr, u16 Data)
{
NOR_WRITE(ADDR_SHIFT(0x0555), 0x00AA);
NOR_WRITE(ADDR_SHIFT(0x02AA), 0x0055);
NOR_WRITE(ADDR_SHIFT(0x0555), 0x00A0);
NOR_WRITE((NOR_FLASH_START_ADDR + WriteAddr), Data);
return (FSMC_NOR_GetStatus(Program_Timeout));
}
通過(guò)MindMotion的官網(wǎng)下載MM32F3270 lib_Samples:
工程路徑如下:
~MM32F327x_SamplesLibSamplesFSMCFSMC_NOR
可以看到詳細(xì)的樣例與功能操作。
下章的題目為《使用MM32F3270 的FSMC驅(qū)動(dòng)外部OLED》講解通過(guò)FSMC外擴(kuò)并口OLED的實(shí)現(xiàn)。
來(lái)源:靈動(dòng)MM32MCU
免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問(wèn)題,請(qǐng)聯(lián)系小編進(jìn)行處理
審核編輯 黃宇
-
芯片
+關(guān)注
關(guān)注
462文章
53315瀏覽量
456136 -
NOR flash
+關(guān)注
關(guān)注
2文章
97瀏覽量
23807 -
FSMC
+關(guān)注
關(guān)注
0文章
55瀏覽量
38971
發(fā)布評(píng)論請(qǐng)先 登錄
靈動(dòng)微課堂 (第188講) | 使用MM32F3270 FSMC驅(qū)動(dòng)TFT-LCD
MM32F3270系列32位MCU的特點(diǎn)有哪些
靈動(dòng)微課堂 (第189講) | 使用MM32F3270 FSMC驅(qū)動(dòng)SRAM
靈動(dòng)微課堂 (第190講) | 使用MM32F3270 FSMC驅(qū)動(dòng)外部NOR Flash
靈動(dòng)微課堂 (第191講) | 使用MM32F3270 FSMC驅(qū)動(dòng)OLED
如何采用MM32F3270單片機(jī)的FSMC接口來(lái)擴(kuò)展SRAM
【國(guó)產(chǎn)MCU移植】MM32F3270 EVBoard
MM32F3270控制器的主要特點(diǎn)
使用MM32F3270單片機(jī)FSMC驅(qū)動(dòng)外部NORFlash
基于MM32F3270 以太網(wǎng) Client使用

使用MM32F3270 FSMC驅(qū)動(dòng)外部NOR Flash
評(píng)論