完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>
標(biāo)簽 > FSMC
FSMC(可變靜態(tài)存儲控制器)是STM32系列采用的一種新型的存儲器擴(kuò)展技術(shù)。在外部存儲器擴(kuò)展方面具有獨(dú)特的優(yōu)勢,可根據(jù)系統(tǒng)的應(yīng)用需要,方便地進(jìn)行不同類型大容量靜態(tài)存儲器的擴(kuò)展。
FSMC(Flexible Static Memory Controller,可變靜態(tài)存儲控制器)是STM32系列采用的一種新型的存儲器擴(kuò)展技術(shù)。在外部存儲器擴(kuò)展方面具有獨(dú)特的優(yōu)勢,可根據(jù)系統(tǒng)的應(yīng)用需要,方便地進(jìn)行不同類型大容量靜態(tài)存儲器的擴(kuò)展。
STM32是ST(意法半導(dǎo)體)公司推出的基于ARM內(nèi)核Cortex-M3的32位微控制器系列。Cortex-M3內(nèi)核是為低功耗和價(jià)格敏感的應(yīng)用而專門設(shè)計(jì)的,具有突出的能效比和處理速度。通過采用Thumb-2高密度指令集,Cortex-M3內(nèi)核降低了系統(tǒng)存儲要求,同時(shí)快速的中斷處理能夠滿足控制領(lǐng)域的高實(shí)時(shí)性要求,使基于該內(nèi)核設(shè)計(jì)的STM32系列微控制器能夠以更優(yōu)越的性價(jià)比,面向更廣泛的應(yīng)用領(lǐng)域。
STM32系列微控制器為用戶提供了豐富的選擇,可適用于工業(yè)控制、智能家電、建筑安防、醫(yī)療設(shè)備以及消費(fèi)類電子產(chǎn)品等多方位嵌入式系統(tǒng)設(shè)計(jì)。STM32系列采用一種新型的存儲器擴(kuò)展技術(shù)——FSMC,在外部存儲器擴(kuò)展方面具有獨(dú)特的優(yōu)勢,可根據(jù)系統(tǒng)的應(yīng)用需要,方便地進(jìn)行不同類型大容量靜態(tài)存儲器的擴(kuò)展。
FSMC(Flexible Static Memory Controller,可變靜態(tài)存儲控制器)是STM32系列采用的一種新型的存儲器擴(kuò)展技術(shù)。在外部存儲器擴(kuò)展方面具有獨(dú)特的優(yōu)勢,可根據(jù)系統(tǒng)的應(yīng)用需要,方便地進(jìn)行不同類型大容量靜態(tài)存儲器的擴(kuò)展。
STM32是ST(意法半導(dǎo)體)公司推出的基于ARM內(nèi)核Cortex-M3的32位微控制器系列。Cortex-M3內(nèi)核是為低功耗和價(jià)格敏感的應(yīng)用而專門設(shè)計(jì)的,具有突出的能效比和處理速度。通過采用Thumb-2高密度指令集,Cortex-M3內(nèi)核降低了系統(tǒng)存儲要求,同時(shí)快速的中斷處理能夠滿足控制領(lǐng)域的高實(shí)時(shí)性要求,使基于該內(nèi)核設(shè)計(jì)的STM32系列微控制器能夠以更優(yōu)越的性價(jià)比,面向更廣泛的應(yīng)用領(lǐng)域。
STM32系列微控制器為用戶提供了豐富的選擇,可適用于工業(yè)控制、智能家電、建筑安防、醫(yī)療設(shè)備以及消費(fèi)類電子產(chǎn)品等多方位嵌入式系統(tǒng)設(shè)計(jì)。STM32系列采用一種新型的存儲器擴(kuò)展技術(shù)——FSMC,在外部存儲器擴(kuò)展方面具有獨(dú)特的優(yōu)勢,可根據(jù)系統(tǒng)的應(yīng)用需要,方便地進(jìn)行不同類型大容量靜態(tài)存儲器的擴(kuò)展。
機(jī)制
FSMC(Flexible Static Memory Controller,可變靜態(tài)存儲控制器)是STM32系列中內(nèi)部集成256 KB以上FlaSh,后綴為xC、xD和xE的高存儲密度微控制器特有的存儲控制機(jī)制。之所以稱為“可變”,是由于通過對特殊功能寄存器的設(shè)置,F(xiàn)SMC能夠根據(jù)不同的外部存儲器類型,發(fā)出相應(yīng)的數(shù)據(jù)/地址/控制信號類型以匹配信號的速度,從而使得STM32系列微控制器不僅能夠應(yīng)用各種不同類型、不同速度的外部靜態(tài)存儲器,而且能夠在不增加外部器件的情況下同時(shí)擴(kuò)展多種不同類型的靜態(tài)存儲器,滿足系統(tǒng)設(shè)計(jì)對存儲容量、產(chǎn)品體積以及成本的綜合要求。FSMC技術(shù)優(yōu)勢①支持多種靜態(tài)存儲器類型。STM32通過FSMC可以與SRAM、ROM、PSRAM、NOR Flash和NANDFlash存儲器的引腳直接相連。②支持豐富的存儲操作方法。FSMC不僅支持多種數(shù)據(jù)寬度的異步讀/寫操作,而且支持對NOR/PSRAM/NAND存儲器的同步突發(fā)訪問方式。③支持同時(shí)擴(kuò)展多種存儲器。FSMC的映射地址空間中,不同的BANK是獨(dú)立的,可用于擴(kuò)展不同類型的存儲器。當(dāng)系統(tǒng)中擴(kuò)展和使用多個(gè)外部存儲器時(shí),F(xiàn)SMC會(huì)通過總線懸空延遲時(shí)間參數(shù)的設(shè)置,防止各存儲器對總線的訪問沖突。④支持更為廣泛的存儲器型號。通過對FSMC的時(shí)間參數(shù)設(shè)置,擴(kuò)大了系統(tǒng)中可用存儲器的速度范圍,為用戶提供了靈活的存儲芯片選擇空間。⑤支持代碼從FSMC擴(kuò)展的外部存儲器中直接運(yùn)行,而不需要首先調(diào)入內(nèi)部SRAM。FSMC內(nèi)部結(jié)構(gòu)STM32微控制器之所以能夠支持NOR Flash和NAND Flash這兩類訪問方式完全不同的存儲器擴(kuò)展,是因?yàn)镕SMC內(nèi)部實(shí)際包括NOR Flash和NAND/PC Card兩個(gè)控制器,分別支持兩種截然不同的存儲器訪問方式。在STM32內(nèi)部,F(xiàn)SMC的一端通過內(nèi)部高速總線AHB連接到內(nèi)核Cortex-M3,另一端則是面向擴(kuò)展存儲器的外部總線。內(nèi)核對外部存儲器的訪問信號發(fā)送到AHB總線后,經(jīng)過FSMC轉(zhuǎn)換為符合外部存儲器通信規(guī)約的信號,送到外部存儲器的相應(yīng)引腳,實(shí)現(xiàn)內(nèi)核與外部存儲器之間的數(shù)據(jù)交互。FSMC起到橋梁作用,既能夠進(jìn)行信號類型的轉(zhuǎn)換,又能夠進(jìn)行信號寬度和時(shí)序的調(diào)整,屏蔽掉不同存儲類型的差異,使之對內(nèi)核而言沒有區(qū)別。FSMC映射地址空間FSMC管理1 GB的映射地址空間。該空間劃分為4個(gè)大小為256 MB的BANK,每個(gè)BANK又劃分為4個(gè)64 MB的子BANK,如表1所列。FSMC的2個(gè)控制器管理的映射地址空間不同。NOR Flash控制器管理第1個(gè)BANK,NAND/PC Card控制器管理第2~4個(gè)BANK。由于兩個(gè)控制器管理的存儲器類型不同,擴(kuò)展時(shí)應(yīng)根據(jù)選用的存儲設(shè)備類型確定其映射位置。其中,BANK1的4個(gè)子BANK擁有獨(dú)立的片選線和控制寄存器,可分別擴(kuò)展一個(gè)獨(dú)立的存儲設(shè)備,而BANK2~BANK4只有一組控制寄存器。
表1:FSMC映射地址空間
配置
FSMC擴(kuò)展NOR Flash配置SRAM/ROM、NOR Flash和PSRAM類型的外部存儲器都是由FSMC的NOR Flash控制器管理的,擴(kuò)展方法基本相同,其中NOR Flash最為復(fù)雜。通過FSMC擴(kuò)展外部存儲器時(shí),除了傳統(tǒng)存儲器擴(kuò)展所需要的硬件電路外,還需要進(jìn)行FSMC初始化配置。FSMC提供大量、細(xì)致的可編程參數(shù),以便能夠靈活地進(jìn)行各種不同類型、不同速度的存儲器擴(kuò)展。外部存儲器能否正常工作的關(guān)鍵在于:用戶能否根據(jù)選用的存儲器型號,對配置寄存器進(jìn)行合理的初始化配置。確定映射地址空間根據(jù)選用的存儲器類型確定擴(kuò)展使用的映射地址空間。NOR Flash只能選用BANK1中的4個(gè)子BANK。選定映射子BANK后,即可確定以下2方面內(nèi)容:①硬件電路中用于選中該存儲器的片選線FSMC_NEi(i為子BANK號,i=1,…,4);②FSMC配置中用于配置該外部存儲器的特殊功能寄存器號(如表1所列)。配置存儲器基本特征通過對FSMC特殊功能寄存器FSMC_BCRi(i為子BANK號,i=1,…,4)中對應(yīng)控制位的設(shè)置,F(xiàn)SMC根據(jù)不同存儲器特征可靈活地進(jìn)行工作方式和信號的調(diào)整。根據(jù)選用的存儲器芯片確定需要配置的存儲器特征,主要包括以下方面:①存儲器類型(MTYPE)是SRAM/ROM、PSRAM,還是NOR FlaSh;②存儲芯片的地址和數(shù)據(jù)引腳是否復(fù)用(MUXEN),F(xiàn)SMC可以直接與AD0~AD15復(fù)用的存儲器相連,不需要增加外部器件;③存儲芯片的數(shù)據(jù)線寬度(MWID),F(xiàn)SMC支持8位/16位兩種外部數(shù)據(jù)總線寬度;④對于NOR Flash(PSRAM),是否采用同步突發(fā)訪問方式(B URSTEN);⑤對于NOR Flash(PSRAM),NWAIT信號的特性說明(WAITEN、WAITCFG、WAITPOL);⑥對于該存儲芯片的讀/寫操作,是否采用相同的時(shí)序參數(shù)來確定時(shí)序關(guān)系(EXTMOD)。配置存儲器時(shí)序參數(shù)FSMC通過使用可編程的存儲器時(shí)序參數(shù)寄存器,拓寬了可選用的外部存儲器的速度范圍。FSMC的NORFlash控制器支持同步和異步突發(fā)兩種訪問方式。選用同步突發(fā)訪問方式時(shí),F(xiàn)SMC將HCLK(系統(tǒng)時(shí)鐘)分頻后,發(fā)送給外部存儲器作為同步時(shí)鐘信號FSMC_CLK。此時(shí)需要的設(shè)置的時(shí)間參數(shù)有2個(gè):①HCLK與FSMC_CLK的分頻系數(shù)(CLKDIV),可以為2~16分頻;②同步突發(fā)訪問中獲得第1個(gè)數(shù)據(jù)所需要的等待延遲(DATLAT)。對于異步突發(fā)訪問方式,F(xiàn)SMC主要設(shè)置3個(gè)時(shí)間參數(shù):地址建立時(shí)間(ADDSET)、數(shù)據(jù)建立時(shí)間(DATAST)和地址保持時(shí)間(ADDHLD)。FSMC綜合了SRAM/ROM、PSRAM和NOR Flash產(chǎn)品的信號特點(diǎn),定義了4種不同的異步時(shí)序模型。選用不同的時(shí)序模型時(shí),需要設(shè)置不同的時(shí)序參數(shù),如表2所列。在實(shí)際擴(kuò)展時(shí),根據(jù)選用存儲器的特征確定時(shí)序模型,從而確定各時(shí)間參數(shù)與存儲器讀/寫周期參數(shù)指標(biāo)之間的計(jì)算關(guān)系;利用該計(jì)算關(guān)系和存儲芯片數(shù)據(jù)手冊中給定的參數(shù)指標(biāo),可計(jì)算出FSMC所需要的各時(shí)間參數(shù),從而對時(shí)間參數(shù)寄存器進(jìn)行合理的配置。3 STM32擴(kuò)展S29GL系列NOR Flash實(shí)例S29GL系列NOR Flash簡介Spansion公司的S29GL系列芯片是采用90nm技術(shù)制造的高集成度NOR Flash存儲芯片,提供16~128 MB可選容量,支持最快25 ns的頁訪問速度和110 ns的隨機(jī)訪問速度,帶有最大64字節(jié)的寫緩沖區(qū),以提供更快、更高效的編程,是嵌入式系統(tǒng)設(shè)計(jì)中大容量存儲器擴(kuò)展的理想選擇。本文選用的型號為S29GL512P,容量為512×64K字(總?cè)萘?4 MB),擴(kuò)展到NOR Flash控制器管理的BANK1的第2個(gè)子BANK。STM32與S29GL512P的電路連接S25GL512P可通過控制引腳BYTE選擇對芯片的訪問單位(字/字節(jié)),區(qū)別在于:①對于芯片引腳DQ15,字模式時(shí)傳送最高數(shù)據(jù)位D15;字節(jié)模式時(shí)傳送最低地址A-1。②字模式時(shí),數(shù)據(jù)引腳D0~D15上傳送數(shù)據(jù)信號;字節(jié)模式時(shí),只有D0~D7上有信號。此處,將BYTE上拉到高電平,選擇16位的字訪問單位。FSMC數(shù)據(jù)線FSMC_D[15:0]與S29GL512P的D15~D0對應(yīng)連接;FSMC地址線FSMC_A[25:0]的低25根與S29GL512P的地址線A[24:0]對應(yīng)連接。由于S29GL512P芯片映射到BANK1的子BANK2,可確定其片選線應(yīng)連接FSMC片選控制線FSMC_NE2。S29GL512P的RY/BY引腳連接FSMC的FSMC_NWAIT引腳,提供等待信號。FSMC的配置根據(jù)S29GL512P的映射位置,需要對FSMC_BCR2和FSMC_BTR2/BWTR2寄存器進(jìn)行配置。(1)FSMC_BCR2配置S29GL512P的讀/寫采用統(tǒng)一時(shí)間參數(shù),只需要設(shè)置時(shí)間寄存器FSMC_BTR2。配置存儲器類型為NORFlash,數(shù)據(jù)總線寬度為16位(字),不采用地址/數(shù)據(jù)復(fù)用,使能BANK1的子BANK2。(2)FSMC_BTR2由表2可知,異步NOR Flash時(shí)序模型Mode2/B需要設(shè)置時(shí)間參數(shù)DATAST和ADDSET。根據(jù)時(shí)序圖,兩個(gè)參數(shù)的計(jì)算公式如下:式中:Twc和Trc為所選存儲芯片的寫周期長度和讀操作周期長度;Twp為所選存儲芯片的寫信號持續(xù)長度。根據(jù)S29GL512P用戶手冊,可知參數(shù)Twc=Trc=130 ns,Twp=35 ns。設(shè)STM32微控制器采用72 MHz主頻,則HCLK=(1/72×10-6)s。通過上述公式計(jì)算,可取值為:DATAST=2,ADDSET=5。為了達(dá)到更好的控制效果,還應(yīng)考慮FSMC自身延遲問題,使用校正公式:式中:TAVQV為所選存儲芯片訪問過程中,從地址有效至數(shù)據(jù)有效的時(shí)間域;Tsu(Data_NE)為STM32特征參數(shù),從數(shù)據(jù)有效到FSMC_NE(片選)失效時(shí)間域;Ttv(A_NE)為STM32特征參數(shù),從FSMC_NE有效至地址有效的時(shí)間域。TAVQV=130 ns,Tsu(Data_NE)+Ttv(A_NE]=36 ns,對DATAST參數(shù)進(jìn)行校正,可得DATAST=3。應(yīng)用STM32固件對FSMC進(jìn)行初始化配置ST公司為用戶開發(fā)提供了完整、高效的工具和固件庫,其中使用C語言編寫的固件庫提供了覆蓋所有標(biāo)準(zhǔn)外設(shè)的函數(shù),使用戶無需使用匯編操作外設(shè)特性,從而提高了程序的可讀性和易維護(hù)性。STM32固件庫中提供的FSMC的NOR Flash控制器操作固件,主要包括2個(gè)數(shù)據(jù)結(jié)構(gòu)和3個(gè)函數(shù)。數(shù)據(jù)結(jié)構(gòu)FSMC_NORSRAMTimingInitTypeDef對應(yīng) 時(shí)間參數(shù)寄存器FSMC_BTR和FSMC_BWTR的結(jié)構(gòu)定義;FSMC_NORSRAMinitTypeDef對應(yīng)特征配置寄存器FSMC_BCR的結(jié)構(gòu)定義,并包含2個(gè)指向?qū)?yīng)BANK的FSMC_BTR和FSMC_BWTR寄存器的FSMC_NORSRAMTimingInitTypeDef結(jié)構(gòu)指針。針對上述S29GL512P芯片擴(kuò)展要求,利用固件庫進(jìn)行的主要初始化操作如下:
結(jié)語
STM32作為新一代ARM Cortex-M3核處理器,其卓越的性能和功耗控制能夠適用于廣泛的應(yīng)用領(lǐng)域;而其特殊的可變靜態(tài)存儲技術(shù)FSMC具有高度的靈活性,對于存儲容量要求較高的嵌入式系統(tǒng)設(shè)計(jì),能夠在不增加外部分立器件的情況下,擴(kuò)展多種不同類型和容量的存儲芯片,降低了系統(tǒng)設(shè)計(jì)的復(fù)雜性,提高了系統(tǒng)的可靠性。
STM32探秘 之FSMC
STM32的FSMC真是一個(gè)萬能的總線控制器,不僅可以控制SRAM,NOR FLASH,NAND FLASH,PC Card,還能控制LCD,TFT.
一般越是復(fù)雜的東西,理解起來就很困難,但是使用上卻很方便,如USB.
不過FSMC也有很詭異的地方。如
*(volatile uint16_t *)0x60400000=0x0;
// 實(shí)際地址A21=1,而非A22.[注:0x60400000=0x60000000|(1UL《《22) ]
*(volatile uint16_t *)0x60800000=0x0;
// 實(shí)際地址A22=1,而非A23 [注:0x60800000=0x60000000|(1UL《《23) ]1234
為什么呢?那時(shí)我還以為軟件或硬件還是芯片有BUG,
我就是從上面的不解中開始研究FSMC的…。。
1.FSMC信號引腳
STM32的管腳排列很沒有規(guī)律,而且分布在多個(gè)不同端口上,初始化要十分小心。需要用到的引腳都要先初始化成”復(fù)用功能推挽輸出”模式。(GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP )
并且開啟時(shí)鐘 (RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx, ENABLE); ) 像STM32F103Z(144腳)芯片有獨(dú)立的地址和數(shù)據(jù)總線,而STM32F103V(100腳)就沒有, 地址和數(shù)據(jù)總線要像51單片機(jī)一樣分時(shí)復(fù)用,而在STM32F103R系列(64腳)就沒有FSMC模塊。
復(fù)用總線時(shí)管腳:
PD14,//FSMC_DA0
PD15,//FSMC_DA1
PD0 ,//FSMC_DA2
PD1 ,//FSMC_DA3
PE7 ,//FSMC_DA4
PE8 ,//FSMC_DA5
PE9 ,//FSMC_DA6
PE10,//FSMC_DA7
PE11,//FSMC_DA8
PE12,//FSMC_DA9
PE13,//FSMC_DA10
PE14,//FSMC_DA11
PE15,//FSMC_DA12
PD8 ,//FSMC_DA13
PD9 ,//FSMC_DA14
PD10,//FSMC_DA15
PD11,//FSMC_A16
PD12,//FSMC_A17
PD13,//FSMC_A18
PE3 ,//FSMC_A19
PE4 ,//FSMC_A20
PE5 ,//FSMC_A21
PE6 ,//FSMC_A22
PE2 ,//FSMC_A23
PG13,//FSMC_A24//STM32F103Z
PG14,//FSMC_A25//STM32F103Z
獨(dú)立的地址總線管腳:
?。圩ⅲ嚎偩€是16Bit情況下,F(xiàn)SMC通過FSMC_NBL1,F(xiàn)SMC_NBL0,區(qū)分高低字節(jié)。下面W代表WORD,即16BIT字。]
PF0 ,//FSMC_A0 //2^1=2W =4 Bytes //144PIN STM32F103Z
PF1 ,//FSMC_A1 //2^2=4W =8 Bytes//144PIN STM32F103Z
PF2 ,//FSMC_A2 //2^3=8W= 16 Bytes //144PIN STM32F103Z
PF3 ,//FSMC_A3 //2^4=16W =32 Bytes//144PIN STM32F103Z
PF4 ,//FSMC_A4 //2^5=32W =64 Bytes//144PIN STM32F103Z
PF5 ,//FSMC_A5 //2^6=64W =128 Bytes//144PIN STM32F103Z
PF12,//FSMC_A6 //2^7=128W =256 Bytes //144PIN STM32F103Z
PF13,//FSMC_A7 //2^8=256W =512 Bytes //144PIN STM32F103Z
PF14,//FSMC_A8 //2^9= 512W =1k Bytes//144PIN STM32F103Z
PF15,//FSMC_A9 //2^10=1kW =2k Bytes//144PIN STM32F103Z
PG0 ,//FSMC_A10 //2^11=2kW =4k Bytes//144PIN STM32F103Z
PG1 ,//FSMC_A11 //2^12=4kW =8k Bytes//144PIN STM32F103Z
PG2 ,//FSMC_A12 //2^13=8kW =16k Bytes//144PIN STM32F103Z
PG3 ,//FSMC_A13 //2^14=16kW =32k Bytes//144PIN STM32F103Z
PG4 ,//FSMC_A14 //2^15=32kW =64k Bytes//144PIN STM32F103Z
PG5 ,//FSMC_A15 //2^16=64kW =128k Bytes//144PIN STM32F103Z
PD11,//FSMC_A16 //2^17=128kW =256k Bytes
PD12,//FSMC_A17 //2^18=256kW =512k Bytes
PD13,//FSMC_A18 //2^19=512kW =1M Bytes
PE3 ,//FSMC_A19 //2^20=1MW =2M Bytes
PE4 ,//FSMC_A20 //2^21=2MW =4M Bytes
PE5 ,//FSMC_A21 //2^22=4MW =8M Bytes
PE6 ,//FSMC_A22 //2^23=8MW =16M Bytes
PE2 ,//FSMC_A23 //2^24=16MW =32M Bytes //100PIN STM32F103V MAX
PG13,//FSMC_A24 //2^25=32MW =64M Bytes //144PIN STM32F103Z
PG14,//FSMC_A25 //2^26=64MW =128M Bytes //144PIN STM32F103Z
獨(dú)立的數(shù)據(jù)總線管腳:
PD14,//FSMC_D0
PD15,//FSMC_D1
PD0 ,//FSMC_D2
PD1 ,//FSMC_D3
PE7 ,//FSMC_D4
PE8 ,//FSMC_D5
PE9 ,//FSMC_D6
PE10,//FSMC_D7
PE11,//FSMC_D8
PE12,//FSMC_D9
PE13,//FSMC_D10
PE14,//FSMC_D11
PE15,//FSMC_D12
PD8 ,//FSMC_D13
PD9 ,//FSMC_D14
PD10,//FSMC_D15
控制信號
PD4,//FSMC_NOE,/RD
PD5,//FSMC_NWE,/WR
PB7,//FSMC_NADV,/ALE
PE1,//FSMC_NBL1,/UB
PE0,//FSMC_NBL0,/LB
PD7,//FSMC_NE1,/CS1
PG9,//FSMC_NE2,/CS2
PG10,//FSMC_NE3,/CS3
PG12,//FSMC_NE4,/CS4
//PD3,//FSMC_CLK
//PD6,//FSMC_NWAIT
2.地址的分配
地址與片選是掛勾的,也就是說器件掛載在哪個(gè)片選引腳上,就固定了訪問地址范圍和FsmcInitStructure.FSMC_Bank
//地址范圍:0x60000000~0x63FFFFFF,片選引腳PD7(FSMC_NE1),最大支持容量64MB,
//[在STM32F103V(100腳)上地址范圍為A0~A23,最大容量16MB]
FsmcInitStructure.FSMC_Bank =FSMC_Bank1_NORSRAM1;
//地址范圍:0x64000000~0x67FFFFFF, 片選引腳PG9(FSMC_NE2),最大支持容量64MB
FsmcInitStructure.FSMC_Bank =FSMC_Bank1_NORSRAM2;
//地址范圍:0x68000000~0x6BFFFFFF,片選引腳PG10(FSMC_NE3),最大支持容量64MB
FsmcInitStructure.FSMC_Bank =FSMC_Bank1_NORSRAM3;
//地址范圍:0x6C000000~0x6FFFFFFF,片選引腳(PG12 FSMC_NE4),最大支持容量64MB
FsmcInitStructure.FSMC_Bank =FSMC_Bank1_NORSRAM4;
12345678910111213
3.時(shí)序測量
簡單原理草圖
寫數(shù)據(jù)的時(shí)序
讀數(shù)據(jù)的時(shí)序
1.數(shù)據(jù)總線設(shè)定為16位寬情況下測量FSMC時(shí)序,即
FsmcInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; 1
使用邏輯分析儀測量(循環(huán)執(zhí)行下面這條語句,下同)的波形
*(volatile uint16_t *)(0x60002468UL)=0xABCD;
12
可以看出NADV下降沿瞬間DATABUS上的數(shù)據(jù)被鎖存器鎖存,接著NWE低電平,總線輸出0xABCD,數(shù)據(jù)0xABCD被寫入0x1234這個(gè)地址。
*(volatile uint16_t*)(0x60002469UL )=0xABCD;
12
what?向這個(gè)地址寫出現(xiàn)了兩次總線操作。
為了一探究竟,我引出了控制線。
*(volatile uint16_t*)(0x60000468UL )=0xABCD;
12
向0x60000468UL寫入0xABCD到底會(huì)發(fā)什么?
從時(shí)序圖中我們可以看到, 向0x60000468UL在地址(在范圍:0x60000000~0x63FFFFFF內(nèi))寫入數(shù)據(jù),片選引腳PD7(FSMC_NE1)被拉低。而在這之前,數(shù)據(jù)總線上先產(chǎn)生0x234,于是在NADV下降沿瞬間,數(shù)據(jù)被鎖存在地址鎖存器上(A0~A15),與A16~A25(如果有配置的話,會(huì)在NE1下降沿同時(shí)送出)組合成完整的地址信號。然而有人會(huì)問這個(gè)0x234是哪來的,你是否注意到它正好等于0x468/2,難道是巧合嗎?不是的,在16位數(shù)據(jù)總線情況下(NORSRAMInitStrc.FSMC_MemoryDataWidth=FSMC_MemoryDataWidth_16b;),
像這樣
*(volatile uint16_t*)(0x60000000|addr)=0xABCD;
12
寫入一個(gè)值,實(shí)際在地址線上產(chǎn)生的值是addr/2(即addr》》2),
所以如果我們一定要向addrx寫入0xABCD則我們要這樣寫
*(volatile uint16_t*)(0x60000000|addrx《《1)=0xABCD;1
NADV為高電平時(shí), NEW被拉低,NOE為高,且NBL1,NBL0為低,隨后數(shù)據(jù)總線線上產(chǎn)生0xABCD于是0xABCD被寫進(jìn)SRAM的地址0x234中
那如果我們向一個(gè)奇數(shù)地址像這樣
*(volatile uint16_t*)(0x60000469UL )=0xABCD;寫入值會(huì)發(fā)生什么呢?
12
從圖中我們可以看到,STM32其實(shí)分成了兩次字節(jié)寫的過程,第一次向0x469/2寫入0xCD,第二次向0x469/2+1寫入0xAB,
有人會(huì)問你為什么這樣說,NWE為低時(shí)總線上不是0xCDAB嗎?沒錯(cuò),但是注意NBL1,NBL0的電平組合,NBL1連接到SRAM的nUB,NBL0連接到SRAM的nLB.第一次NEW為低時(shí)NBL1為低,NBL0為高,0xCDAB的高位被寫入SRAM的0x234,第二次NWE為低時(shí)NBL1為高,NBL0為低,0xCDAB的低位被寫入SRAM的0x235.
當(dāng)我們查看反匯編時(shí)發(fā)現(xiàn),指令是相同的
0x080036C4 0468 DCW 0x0468
0x080036C6 6000 DCW 0x6000
MOVW r0,#0xABCD
LDR r1,[pc,#420] ; @0x080036C4//r1=0x60000468
STRH r0,[r1,#0x00]
0x080036C4 0469 DCW 0x0469
0x080036C6 6000 DCW 0x6000
MOVW r0,#0xABCD
LDR r1,[pc,#420] ; @0x080036C4//r1=0x60000469
STRH r0,[r1,#0x00]123456789101112
以上是寫入的時(shí)序,下面測量讀取的時(shí)序
首先我們向SRAM的真實(shí)地址0x234,0x235分別寫入0x8824,0x6507
*(volatile uint16_t*)(0x60000000UL |0x234 《《1 )=0x8824;
*(volatile uint16_t*)(0x60000000UL |0x235 《《1 )=0x6507;
*(volatile uint16_t*)(0x60000000UL |0x236 《《1 )=0x6735;
*(volatile uint16_t*)(0x60000000UL |0x237 《《1 )=0x2003;
*(volatile uint16_t*)(0x60000000UL |0x238 《《1 )=0x6219;12345
然后讀?。?/p>
tmp=*(volatile uint16_t*)(0x60000468UL );
12
如圖tmp結(jié)果為0x8824
再試
tmp=*(volatile uint16_t*)(0x60000469UL );
12
nUB=nLB=0;按16bit讀
從0x234讀得0X8824取高字節(jié)”88”作tmp低8位
從0x235讀得0X6507取低字節(jié)”07”作tmp高8位
最終tmp=0x0788
接下來驗(yàn)證更特殊的
*(volatile uint8_t*)(0x60000469UL )=0xABCD;
12
由于NBL1=0,NBL0=1,0xCD被寫入0x234的高地址,
數(shù)據(jù)總線上出現(xiàn)的值是0xCDNN, NN是隨機(jī)數(shù)據(jù),不過一般是和高位一樣的值
*(volatile uint8_t*)(0x60000468UL )=0xABCD;
12
由于NBL1=1,NBL0=0,0xCD被寫入0x234的低地址,
數(shù)據(jù)總線上出現(xiàn)的值是0xNNCD,NN是隨機(jī)數(shù)據(jù)
驗(yàn)證字節(jié)讀取的
首先我們向SRAM的真實(shí)地址0x234,0x235分別寫入0x8824,0x6507
*(volatile uint16_t*)(0x60000000UL |0x234 《《1 )=0x8824;
*(volatile uint16_t*)(0x60000000UL |0x235 《《1 )=0x6507;12
然后這樣讀取
tmp=*(volatile uint8_t*)(0x60000469UL );//對奇地址的單字節(jié)讀取,數(shù)據(jù)總線的高8位被返回 tmp=0x88
12
tmp=*(volatile uint8_t*)(0x60000468UL );//對偶地址的單字節(jié)讀取,數(shù)據(jù)總線的低8位被返回 tmp=0x24
12
還有更特殊的沒有,有!
*(volatile int64_t*)(0x60000468UL)=0XABCDEF1234567890;//0XABCD EF12 3456 7890,如圖,分別進(jìn)行了4次操作才寫完:
12
*(volatile int64_t*)(0x60000469UL)=0XABCDEF1234567890;//0XABCD EF12 3456 7890,如圖,對奇地址寫比偶地址多一次操作:
12
*(volatile uint16_t*)(0x60000000UL |0x234 《《1 )=0x8824;
*(volatile uint16_t*)(0x60000000UL |0x235 《《1 )=0x6507;
*(volatile uint16_t*)(0x60000000UL |0x236 《《1 )=0x6735;
*(volatile uint16_t*)(0x60000000UL |0x237 《《1 )=0x2003;
*(volatile uint16_t*)(0x60000000UL |0x238 《《1 )=0x6219;12345
tmp=*(volatile int64_t*)(0x60000469UL);// tmp=0x1920036735650788
12
tmp=*(volatile int64_t*)(0x60000468UL); //tmp=0x2003673565078824
12
1.數(shù)據(jù)總線設(shè)定為8位寬情況下測量FSMC時(shí)序,即
FsmcInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;
*(volatile uint16_t*)(0x60000468UL )=0xABCD;
12
*(volatile uint16_t*)(0x60000469UL )=0xABCD;
12
*(volatile uint16_t*)(0x60000468UL )=0x3344;
*(volatile uint16_t*)(0x60000469UL )=0xABCD;
123
tmp=(volatile uint16_t)(0x60000469UL ); //tmp=0xabcd
tmp=*(volatile uint16_t*)(0x60000468UL );
12
tmp=0xcd44
tmp=*(volatile uint8_t*)(0x60000468UL );
12
tmp=0x44
tmp=*(volatile uint8_t*)(0x60000469UL );
tmp=0xcd
123
*(volatile uint8_t*)(0x60000469UL )=0xABCD;
12
*(volatile uint8_t*)(0x60000468UL )=0xABCD;
12
tmp=*(volatile uint64_t*)(0x60000468UL );
tmp=0x2003673565ABCD44
123
tmp=*(volatile uint64_t*)(0x60000469UL );//tmp=0x192003673565ABCD
12
*(volatile uint64_t*)(0x60000469UL )=0XABCDEF1234567890;
12
*(volatile uint64_t*)(0x60000468UL )=0XABCDEF1234567890;
12
鼓搗這么多,看得頭都大了,先寫到這,以后有發(fā)現(xiàn)再補(bǔ)充了
FPGA與STM32通過FSMC總線通信的實(shí)驗(yàn)
FSMC總線通信簡介 FSMC是STM32系列采用的一種新型存儲器擴(kuò)展技術(shù)。在外部存儲器擴(kuò)展方面具有獨(dú)特的優(yōu)勢,可根據(jù)系統(tǒng)的應(yīng)用需要,方便進(jìn)行不 同類型...
本課講為大家講解CKS32F4xx系列產(chǎn)品的FSMC應(yīng)用實(shí)例,F(xiàn)SMC全稱是Flexible Static Memory Controller,讀作靈活...
2024-04-14 標(biāo)簽:寄存器存儲器Nand flash 866 0
STM32F1系列MCU硬件電路FSMC接口設(shè)計(jì)
FSMC是STM32F1提供的一個(gè)靜態(tài)存儲控制器,是MCU用來擴(kuò)展存儲器,可用來驅(qū)動(dòng)SRAM、Nor Flash、NAND Flash。這里先簡單講解下...
2023-09-27 標(biāo)簽:NANDSRAM存儲器靜態(tài)存儲控制器 2846 0
FSMC稱為靈活的靜態(tài)存儲器,它能夠與同步或異步存儲器和16位PC存儲器卡連接,STM32F4的FSMC接口支持包括SRAM、NAND FLASH、NO...
2023-07-22 標(biāo)簽:NAND靜態(tài)存儲器STM32F4 3811 0
基于MM32F5微控制器的FSMC接口外接SRAM存儲器的用法
MM32F5微控制器基于Arm STAR-MC1微控制器,最高主頻可達(dá)120MHz,集成了FPU單元和DSP擴(kuò)展指令集,有不錯(cuò)的算力。
為了確保驗(yàn)證的完備性,我們需要量化驗(yàn)證目標(biāo)。SystemVerilog提供了一套豐富的覆蓋率建模方式。
2023-06-25 標(biāo)簽:有限狀態(tài)機(jī)FIFO存儲FSMC 1096 0
QVGA TFT-LCD直接驅(qū)動(dòng)使用STM32F10xx FSMC外設(shè)立即下載
類別:電子資料 2023-09-21 標(biāo)簽:QVGATFT-LCDSTM32F10xx
使用大容量STM32F10xxx的FSMC驅(qū)動(dòng)外部的存儲器立即下載
類別:電子資料 2023-09-21 標(biāo)簽:存儲器STM32F10xxxFSMC
【STM32單片機(jī)學(xué)習(xí)】第六課:STM32的中斷體系和FSMC控制LCD立即下載
類別:單片機(jī) 2021-12-22 標(biāo)簽:STM32嵌入式開發(fā)SOC單片機(jī)
【STemWin】STM32F103VE單片機(jī)用FSMC驅(qū)動(dòng)ILI9341彩色觸摸屏(觸控芯片XPT2046),并裸機(jī)移植STemWin圖形庫(采用LCDCo立即下載
類別:單片機(jī) 2021-12-04 標(biāo)簽:STM32M16單片機(jī)ILI9341
北京革新創(chuàng)展科技有限公司STM32+FPGA異構(gòu)多核+樹莓派擴(kuò)展綜合項(xiàng)目設(shè)計(jì)開發(fā)套件全新發(fā)布
北京革新創(chuàng)展科技有限公司目前已經(jīng)擁有基于嵌入式Linux系統(tǒng)的STM32MP157、AM4378、FPGA開發(fā)板和異構(gòu)多核綜合創(chuàng)新實(shí)驗(yàn)平臺。GX-ARM...
為什么可以利用FSMC來使用外部RAM呢,首先了解一下STM32里的FSMC。大容量且引腳數(shù)在100腳以上的STM32F103芯片都帶有FSMC接口。F...
2022-04-28 標(biāo)簽:STM32FSMC偉凌創(chuàng)芯 1911 0
使用MM32F3270單片機(jī)FSMC驅(qū)動(dòng)外部NORFlash
在某些應(yīng)用中,需要較大容量的存儲空間用于存儲數(shù)據(jù);可以通過SPI 外擴(kuò)NOR Flash,NAND Flash, 或者通過SDIO擴(kuò)展SD Card或T...
STM32系列微控制器新型存儲器擴(kuò)展技術(shù)--FSMC有什么優(yōu)點(diǎn)?
FSMC管理1 GB的映射地址空間。該空間劃分為4個(gè)大小為256 MB的BANK,每個(gè)BANK又劃分為4個(gè)64 MB的子BANK,如表1所列。FSMC的...
編輯推薦廠商產(chǎn)品技術(shù)軟件/工具OS/語言教程專題
電機(jī)控制 | DSP | 氮化鎵 | 功率放大器 | ChatGPT | 自動(dòng)駕駛 | TI | 瑞薩電子 |
BLDC | PLC | 碳化硅 | 二極管 | OpenAI | 元宇宙 | 安森美 | ADI |
無刷電機(jī) | FOC | IGBT | 逆變器 | 文心一言 | 5G | 英飛凌 | 羅姆 |
直流電機(jī) | PID | MOSFET | 傳感器 | 人工智能 | 物聯(lián)網(wǎng) | NXP | 賽靈思 |
步進(jìn)電機(jī) | SPWM | 充電樁 | IPM | 機(jī)器視覺 | 無人機(jī) | 三菱電機(jī) | ST |
伺服電機(jī) | SVPWM | 光伏發(fā)電 | UPS | AR | 智能電網(wǎng) | 國民技術(shù) | Microchip |
Arduino | BeagleBone | 樹莓派 | STM32 | MSP430 | EFM32 | ARM mbed | EDA |
示波器 | LPC | imx8 | PSoC | Altium Designer | Allegro | Mentor | Pads |
OrCAD | Cadence | AutoCAD | 華秋DFM | Keil | MATLAB | MPLAB | Quartus |
C++ | Java | Python | JavaScript | node.js | RISC-V | verilog | Tensorflow |
Android | iOS | linux | RTOS | FreeRTOS | LiteOS | RT-THread | uCOS |
DuerOS | Brillo | Windows11 | HarmonyOS |