做一個(gè)網(wǎng)站人員seo運(yùn)營(yíng)是什么
?
目錄
?
FSMC簡(jiǎn)介
FSMC框圖介紹
FSMC通信引腳介紹
FSMC_NWE 的作用
FSMC_NWE 的時(shí)序關(guān)系
FSMC_NOE 的含義
FSMC_NOE 的典型用途
FSMC_NOE 的時(shí)序關(guān)系
使用FSMC驅(qū)動(dòng)LCD
FSMC時(shí)序介紹?
時(shí)序特性中的 OE
?ILI9341重點(diǎn)時(shí)序:
FSMC地址映射?
?HADDR與FSMC_A關(guān)系
?LCD的RS信號(hào)線(xiàn)與地址線(xiàn)關(guān)系
FSMC相關(guān)寄存器介紹
SRAM/NOR閃存片選控制寄存器(FSMC_BCRx)?
SRAM/NOR閃存片選時(shí)序寄存器(FSMC_BTRx)
SRAM/NOR閃存寫(xiě)時(shí)序寄存器(FSMC_BWTRx)
FSMC寄存器組合說(shuō)明
FSMC相關(guān)HAL庫(kù)函數(shù)簡(jiǎn)介
?SRAM_HandleTypeDef
FSMC_NORSRAM_InitTypeDef
FSMC模擬8080時(shí)序讀寫(xiě)簡(jiǎn)化代碼
FSMC簡(jiǎn)介
FSMC,Flexible Static Memory Controller,靈活的靜態(tài)存儲(chǔ)控制器。
用途:用于驅(qū)動(dòng)SRAM,NOR FLASH,NAND FLASH及PC卡類(lèi)型的存儲(chǔ)器。
????????配置好FSMC,定義一個(gè)指向這些地址的指針,通過(guò)對(duì)指針操作就可以直接修改存儲(chǔ)單元的內(nèi)容,FSMC自動(dòng)完成讀寫(xiě)命令和數(shù)據(jù)訪(fǎng)問(wèn)操作,不需要程序去實(shí)現(xiàn)時(shí)序。
????????FSMC外設(shè)配置好就可以模擬出時(shí)序。
實(shí)例:FSMC模擬8080時(shí)序控制LCD
F1/ F4(407)系列大容量型號(hào),且引腳數(shù)目在100腳以上的芯片都有FSMC接口
F4/F7/H7系列就是FMC接口
FSMC框圖介紹
① 時(shí)鐘控制邏輯
FSMC掛載在AHB總線(xiàn)上,時(shí)鐘信號(hào)來(lái)自HCLK
② STM32內(nèi)部的FSMC控制單元
NOR閃存和PSRAM控制器、NAND閃存和PC卡控制器、FSMC配置寄存器
③ 通信引腳
不同類(lèi)型存儲(chǔ)器用到的信號(hào)引腳
公共信號(hào)引腳
FSMC通信引腳介紹
? 用于連接硬件設(shè)備的引腳,控制不同類(lèi)型的存儲(chǔ)器會(huì)用不同的引腳。
-
FSMC_NWE 的作用
-
用于寫(xiě)操作
FSMC_NWE
用于通知外部存儲(chǔ)器執(zhí)行寫(xiě)操作。- 在寫(xiě)操作期間,FSMC 會(huì)將
FSMC_NWE
拉低(邏輯 0),使能外部存儲(chǔ)器的寫(xiě)操作。 FSMC_NWE
通常連接到外部存儲(chǔ)器的WE
(Write Enable)引腳,確保數(shù)據(jù)可以正確寫(xiě)入外部存儲(chǔ)器。
-
與數(shù)據(jù)總線(xiàn)和地址總線(xiàn)的配合
- 在寫(xiě)操作中:
FSMC_NWE
為低電平時(shí),外部存儲(chǔ)器會(huì)從 FSMC 的數(shù)據(jù)總線(xiàn)(FSMC_Dx
)上讀取數(shù)據(jù),并將數(shù)據(jù)寫(xiě)入指定的存儲(chǔ)地址(由地址總線(xiàn)FSMC_Ax
提供)。- 當(dāng)
FSMC_NWE
回到高電平時(shí),寫(xiě)操作完成。
- 在寫(xiě)操作中:
-
寫(xiě)入控制的時(shí)序信號(hào)
- FSMC 控制
FSMC_NWE
的上升沿和下降沿來(lái)定義寫(xiě)入周期的開(kāi)始和結(jié)束,確保數(shù)據(jù)正確寫(xiě)入外部存儲(chǔ)器。
- FSMC 控制
FSMC_NWE 的時(shí)序關(guān)系
FSMC_NWE
的控制信號(hào)與以下其他 FSMC 信號(hào)配合使用:
- FSMC_NE(芯片選擇,Chip Select):
- 用于選擇具體的外部存儲(chǔ)器。
- 當(dāng)
FSMC_NE
為低電平時(shí),所選存儲(chǔ)器芯片被激活。
- FSMC_A(地址總線(xiàn)):
- 提供數(shù)據(jù)寫(xiě)入的目標(biāo)地址。
- FSMC_D(數(shù)據(jù)總線(xiàn)):
- 提供要寫(xiě)入的數(shù)據(jù)。
- FSMC_NWAIT(等待信號(hào),可選):
- 外部存儲(chǔ)器可以通過(guò)拉高或拉低
FSMC_NWAIT
信號(hào)請(qǐng)求延遲完成寫(xiě)操作。
- 外部存儲(chǔ)器可以通過(guò)拉高或拉低
以下是典型的 FSMC 寫(xiě)入時(shí)序:
- FSMC 首先激活
FSMC_NE
(芯片選擇)。 - 然后將
FSMC_Ax
(地址)和FSMC_Dx
(數(shù)據(jù))設(shè)置為目標(biāo)地址和數(shù)據(jù)值。 FSMC_NWE
被拉低,外部存儲(chǔ)器開(kāi)始寫(xiě)入。- 當(dāng)寫(xiě)入完成后,
FSMC_NWE
被拉高,FSMC 將完成該寫(xiě)操作。
FSMC_NOE 的含義
FSMC_NOE
的全稱(chēng)是 FSMC Output Enable (輸出使能),它是 FSMC 用于控制外部存儲(chǔ)器數(shù)據(jù)輸出的信號(hào)引腳。
-
名稱(chēng)含義:
N
:代表負(fù)邏輯(Active Low,低電平有效)。OE
:Output Enable(輸出使能信號(hào))。
-
功能:
FSMC_NOE
控制外部存儲(chǔ)器是否將數(shù)據(jù)輸出到 FSMC 的數(shù)據(jù)總線(xiàn)上。- 當(dāng)
FSMC_NOE
為低電平(邏輯 0)時(shí),外部存儲(chǔ)器的輸出緩沖區(qū)被使能,數(shù)據(jù)可以傳輸?shù)?FSMC 的數(shù)據(jù)總線(xiàn)。 - 當(dāng)
FSMC_NOE
為高電平(邏輯 1)時(shí),外部存儲(chǔ)器的輸出緩沖區(qū)被禁用,數(shù)據(jù)不會(huì)輸出。
FSMC_NOE 的典型用途
-
與外部存儲(chǔ)器的接口控制
- 在讀取外部存儲(chǔ)器(如 NOR Flash 或 SRAM)時(shí),FSMC 控制
FSMC_NOE
以使能數(shù)據(jù)的輸出。 FSMC_NOE
信號(hào)通常連接到外部存儲(chǔ)器的 OE 引腳,表示“是否允許數(shù)據(jù)輸出”。
- 在讀取外部存儲(chǔ)器(如 NOR Flash 或 SRAM)時(shí),FSMC 控制
-
在讀取操作中的作用
- FSMC 進(jìn)行讀取操作時(shí),
FSMC_NOE
被拉低,通知外部存儲(chǔ)器將數(shù)據(jù)放到數(shù)據(jù)總線(xiàn)上。 - 在寫(xiě)操作或非活躍狀態(tài)時(shí),
FSMC_NOE
保持高電平。
- FSMC 進(jìn)行讀取操作時(shí),
FSMC_NOE 的時(shí)序關(guān)系
FSMC_NOE
的控制通常與以下信號(hào)配合使用:
- FSMC_NE(芯片選擇,Chip Select):
FSMC_NE
用于選擇具體的外部存儲(chǔ)器芯片。- 當(dāng)
FSMC_NE
為低電平時(shí),選中的外部存儲(chǔ)器被激活。
- FSMC_NWE(寫(xiě)使能,Write Enable):
- 用于指示寫(xiě)操作。
- 當(dāng)
FSMC_NWE
為低電平時(shí),表示正在向存儲(chǔ)器寫(xiě)入數(shù)據(jù)。
- 地址和數(shù)據(jù)總線(xiàn)(FSMC_A 和 FSMC_D):
- 地址總線(xiàn)(
FSMC_A
)提供要訪(fǎng)問(wèn)的外部存儲(chǔ)器地址。 - 數(shù)據(jù)總線(xiàn)(
FSMC_D
)用于傳輸數(shù)據(jù)。
- 地址總線(xiàn)(
典型的讀取時(shí)序如下:
- FSMC 控制
FSMC_NE
(芯片使能)和FSMC_NOE
(輸出使能)信號(hào),激活外部存儲(chǔ)器的數(shù)據(jù)輸出。 FSMC_NOE
拉低后,外部存儲(chǔ)器將數(shù)據(jù)輸出到數(shù)據(jù)總線(xiàn)上。- 數(shù)據(jù)輸出完成后,FSMC 會(huì)將
FSMC_NOE
拉高,關(guān)閉數(shù)據(jù)輸出。
使用FSMC驅(qū)動(dòng)LCD
FSMC時(shí)序介紹?
FSMC是Flexible靈活的,可以產(chǎn)生多種時(shí)序來(lái)控制外部存儲(chǔ)器。
? NOR/PSRAM控制器產(chǎn)生的異步時(shí)序就有5種,總體分為兩類(lèi):一類(lèi)是模式1,其他為拓展模式。
? 拓展模式相對(duì)模式1來(lái)說(shuō)讀寫(xiě)時(shí)序時(shí)間參數(shù)設(shè)置可以不同,滿(mǎn)足存儲(chǔ)器讀寫(xiě)時(shí)序不一樣需求。
時(shí)序特性中的 OE
在時(shí)序特性中,“OE 在讀取時(shí)序片選過(guò)程中不翻轉(zhuǎn)” 或 “OE 在讀取時(shí)序片選過(guò)程中翻轉(zhuǎn)” 指的是 FSMC 控制 OE
信號(hào)在讀取操作期間的狀態(tài)行為:
-
不翻轉(zhuǎn):
- 讀取操作開(kāi)始時(shí),FSMC 會(huì)將 OE 拉低,保持不變直到讀取完成。
- 這種方式適用于大多數(shù) SRAM 或 CRAM 類(lèi)型存儲(chǔ)器。
-
翻轉(zhuǎn):
- 讀取操作期間,FSMC 會(huì)在不同階段對(duì) OE 信號(hào)進(jìn)行翻轉(zhuǎn)(拉低-拉高-拉低),以協(xié)調(diào)更復(fù)雜的外部存儲(chǔ)器時(shí)序。
- 這種方式適用于特定類(lèi)型的外部存儲(chǔ)器,例如一些特殊的 SRAM 或 PSRAM。
?
?ILI9341重點(diǎn)時(shí)序:
讀ID低電平脈寬(trdl)????????????????????????讀ID高電平脈寬(trdh)
讀FM低電平脈寬(trdlfm)??????????????????讀FM高電平脈寬(trdhfm)
寫(xiě)控制低電平脈寬(twrl)? ? ? ? ? ? ? ? ? ? 寫(xiě)控制高電平脈寬(twrh)
ID:指LCD的ID號(hào)????????????????FM指幀緩存即GRAM
FSMC時(shí)序中ADDSET和DATAST不需要嚴(yán)格要求,可以使用實(shí)踐值
?
FSMC地址映射?
使用FSMC外接存儲(chǔ)器,其存儲(chǔ)單元是映射到STM32的內(nèi)部尋址空間的。
從FSMC角度看,可以把外部存儲(chǔ)器劃分為固定大小為256M字節(jié)的四個(gè)存儲(chǔ)塊。
FSMC存儲(chǔ)塊1被分為4個(gè)區(qū),每個(gè)區(qū)管理64M字節(jié)空間。(64M Byte = 2^26 Byte)
?HADDR與FSMC_A關(guān)系
HADDR總線(xiàn)是轉(zhuǎn)換到外部存儲(chǔ)器的內(nèi)部AHB地址線(xiàn)。
簡(jiǎn)單來(lái)說(shuō),從CPU通過(guò)AHB總線(xiàn)到外部信號(hào)線(xiàn)之間的關(guān)系。
HADDR是字節(jié)地址,而存儲(chǔ)器訪(fǎng)問(wèn)不都是按字節(jié)訪(fǎng)問(wèn),接到存儲(chǔ)器的地址線(xiàn)與其數(shù)據(jù)寬度相關(guān)。
注意:數(shù)據(jù)寬度為16位時(shí),地址存在偏移
?LCD的RS信號(hào)線(xiàn)與地址線(xiàn)關(guān)系
8080接口中RS(數(shù)據(jù)/命令選擇線(xiàn)),用FSMC的某根A地址線(xiàn)進(jìn)行替換。
FSMC_A10接到RS線(xiàn)上:
????????當(dāng)FSMC_A10為高電平時(shí)(即RS為高電平),FSMC_D[15:0]被理解為數(shù)據(jù)。
????????當(dāng)FSMC_A10為低電平時(shí)(即RS為低電平),FSMC_D[15:0]被理解為命令。
究竟發(fā)送什么地址代替?
1、確認(rèn)FSMC_NE4基地址:? ? ? ?
?0x6C00 0000????????NEx(x=1…4):0x6000 0000 + (0x400 0000 * (x - 1))
2、確認(rèn)FSMC_A10對(duì)應(yīng)地址值
2^10 x 2 = 0x800????????FSMC_Ay(y=0…25): 2^y x 2
3、確認(rèn)兩個(gè)地址
代表LCD命令的地址:0x6C00 0000
代表LCD數(shù)據(jù)的地址:0x6C00 0800
FSMC相關(guān)寄存器介紹
????????對(duì)于NOR_FLASH/PSRAM控制器(存儲(chǔ)塊1)配置工作,通過(guò)FSMC_BCRx、FSMC_BTRx和FSMC_BWTRx寄存器設(shè)置(其中x=1~4,對(duì)應(yīng)4個(gè)區(qū))。
SRAM/NOR閃存片選控制寄存器(FSMC_BCRx)?
?EXTMOD:擴(kuò)展模式使能位,控制是否允許讀寫(xiě)不同的時(shí)序。讀和寫(xiě)用不同的時(shí)序,該位設(shè)置為1
WREN:寫(xiě)使能位。????????向TFTLCD寫(xiě)入數(shù)據(jù),該位設(shè)置1
?MWID[1:0]:存儲(chǔ)器數(shù)據(jù)總線(xiàn)寬度。00,表示8位數(shù)據(jù)模式;01表示16位數(shù)據(jù)模式;10和11保留。
MTYP[1:0]:存儲(chǔ)器類(lèi)型。00表示SRAM、ROM;01表示PSRAM;10表示NOR FLASH;11保留。?
MBKEN:存儲(chǔ)塊使能位。該位設(shè)置1
SRAM/NOR閃存片選時(shí)序寄存器(FSMC_BTRx)
ACCMOD[1:0]:訪(fǎng)問(wèn)模式。00:模式A;01:模式B;10:模式C;11:模式D。
DATAST[7:0]:數(shù)據(jù)保持時(shí)間,等于DATAST(+1)個(gè)HCLK時(shí)鐘周期,DATAST最大為255。
對(duì)于ILI9341來(lái)說(shuō),其實(shí)就是RD低電平持續(xù)時(shí)間,最小為355ns。
對(duì)于F1,一個(gè)HCLK = 13.9ns(1/72M),設(shè)置為15 (STM32F1的FSMC性能存在問(wèn)題)
對(duì)于F4,一個(gè)HCLK = 6ns(1/168M),設(shè)置為60
ADDSET[3:0]:地址建立時(shí)間。表示ADDSET(+1)個(gè)HCLK時(shí)鐘周期,ADDSET最大為15。
對(duì)于ILI9341來(lái)說(shuō),相當(dāng)于RD高電平持續(xù)時(shí)間,為90ns。
F1即使設(shè)置為0,RD也有超過(guò)90ns的高電平,這里設(shè)置為1。F4對(duì)該位設(shè)置為15。
????????如果未設(shè)置EXTMOD位,則讀寫(xiě)共用這個(gè)時(shí)序寄存器!
SRAM/NOR閃存寫(xiě)時(shí)序寄存器(FSMC_BWTRx)
?ACCMOD[1:0]:訪(fǎng)問(wèn)模式。00:模式A;01:模式B;10:模式C;11:模式D。
DATAST[7:0]:數(shù)據(jù)保持時(shí)間,等于DATAST(+1)個(gè)HCLK時(shí)鐘周期,DATAST最大為255。
對(duì)于ILI9341來(lái)說(shuō),其實(shí)就是WR低電平持續(xù)時(shí)間,最小為15ns。
對(duì)于F1,一個(gè)HCLK = 13.9ns,設(shè)置為3
對(duì)于F4,一個(gè)HCLK = 6ns,設(shè)置為9
ADDSET[3:0]:地址建立時(shí)間。表示ADDSET(+1)個(gè)HCLK時(shí)鐘周期,ADDSET最大為15。
對(duì)于ILI9341來(lái)說(shuō),相當(dāng)于WR高電平持續(xù)時(shí)間,為15ns。
F1即使設(shè)置為1,WR也有超過(guò)15ns的高電平,這里設(shè)置為1。
F4對(duì)該位設(shè)置為8。
FSMC寄存器組合說(shuō)明
????????在ST官方提供的寄存器定義里面,并沒(méi)有定義FSMC_BCRx、FSMC_BTRx、FSMC_BWTRx等這個(gè)單獨(dú)的寄存器,而是將他們進(jìn)行了一些組合,規(guī)則如下:
FSMC_BCRx和FSMC_BTRx,組合成BTCR[8]寄存器組,他們的對(duì)應(yīng)關(guān)系如下:
? ????????BTCR[0]對(duì)應(yīng)FSMC_BCR1,BTCR[1]對(duì)應(yīng)FSMC_BTR1
? ????????BTCR[2]對(duì)應(yīng)FSMC_BCR2,BTCR[3]對(duì)應(yīng)FSMC_BTR2
????????? BTCR[4]對(duì)應(yīng)FSMC_BCR3,BTCR[5]對(duì)應(yīng)FSMC_BTR3
????????? BTCR[6]對(duì)應(yīng)FSMC_BCR4,BTCR[7]對(duì)應(yīng)FSMC_BTR4
FSMC_BWTRx則組合成BWTR[7]寄存器組,他們的對(duì)應(yīng)關(guān)系如下:
????????? BWTR[0]對(duì)應(yīng)FSMC_BWTR1,BWTR[2]對(duì)應(yīng)FSMC_BWTR2,
? ????????BWTR[4]對(duì)應(yīng)FSMC_BWTR3,BWTR[6]對(duì)應(yīng)FSMC_BWTR4,
? ????????BWTR[1]、BWTR[3]和BWTR[5]保留,沒(méi)有用到
FSMC相關(guān)HAL庫(kù)函數(shù)簡(jiǎn)介
????????本例程涉及HAL庫(kù)相關(guān)函數(shù)如下:
HAL_StatusTypeDef HAL_SRAM_Init (
SRAM_HandleTypeDef *hsram,
FSMC_NORSRAM_TimingTypeDef *Timing,
FSMC_NORSRAM_TimingTypeDef *ExtTiming )
?SRAM_HandleTypeDef
typedef struct
{ FSMC_NORSRAM_TypeDef *Instance; /* 寄存器基地址 */FSMC_NORSRAM_EXTENDED_TypeDef *Extended; /* 擴(kuò)展模式寄存器基地址 */ FSMC_NORSRAM_InitTypeDef Init; /* SRAM初始化結(jié)構(gòu)體*/ HAL_LockTypeDef Lock; /* SRAM鎖對(duì)象結(jié)構(gòu)體 */ __IO HAL_SRAM_StateTypeDef State; /* SRAM設(shè)備訪(fǎng)問(wèn)狀態(tài) */ DMA_HandleTypeDef *hdma; /* DMA結(jié)構(gòu)體 */
} SRAM_HandleTypeDef;
寄存器基地址選擇:FSMC_NORSRAM_DEVICE
擴(kuò)展模式寄存器基地址:FSMC_NORSRAM_EXTERNDEVICE
FSMC_NORSRAM_InitTypeDef
typedef struct
{ uint32_t NSBank; /* 存儲(chǔ)區(qū)塊號(hào) */ uint32_t DataAddressMux; /* 地址/數(shù)據(jù)復(fù)用使能 */ uint32_t MemoryType; /* 存儲(chǔ)器類(lèi)型 */ uint32_t MemoryDataWidth; /* 存儲(chǔ)器數(shù)據(jù)寬度 */uint32_t BurstAccessMode; /* 設(shè)置是否支持突發(fā)訪(fǎng)問(wèn)模式,只支持同步類(lèi)型的存儲(chǔ)器 */uint32_t WaitSignalPolarity; /* 設(shè)置等待信號(hào)的極性 */uint32_t WrapMode; /* 突發(fā)模式下存儲(chǔ)器傳輸使能 */uint32_t WaitSignalActive; /* 等待信號(hào)在等待狀態(tài)之前或等待狀態(tài)期間有效 */ uint32_t WriteOperation; /* 存儲(chǔ)器寫(xiě)使能 */ uint32_t WaitSignal; /* 是否使能等待狀態(tài)插入 */ uint32_t ExtendedMode; /* 使能或者禁止使能擴(kuò)展模式 */ uint32_t AsynchronousWait; /* 用于異步傳輸期間,使能或者禁止等待信號(hào) */ uint32_t WriteBurst; /* 用于使能或者禁止異步的寫(xiě)突發(fā)操作 */ uint32_t PageSize; /* 設(shè)置頁(yè)大小 */
} FSMC_NORSRAM_InitTypeDef;
?儲(chǔ)存區(qū)塊號(hào)選擇:FSMC_NORSRAM_BANK4
地址/數(shù)據(jù)復(fù)用功能選擇:FSMC_DATA_ADDRESS_MUX_DISABLE
儲(chǔ)存器類(lèi)型選擇:FSMC_MEMORY_TYPE_SRAM
儲(chǔ)存器數(shù)據(jù)寬度選擇:FSMC_NORSRAM_MEM_BUS_WIDTH_16
儲(chǔ)存器寫(xiě)使能選擇:FSMC_WRITE_OPERATION_ENABLE
使能或者禁止使能擴(kuò)展模式選擇:FSMC_EXTENDED_MODE_ENABLE
FSMC_NORSRAM_TimingTypeDef
typedef struct
{ uint32_t AddressSetupTime; /* 地址建立時(shí)間 */ uint32_t AddressHoldTime; /* 地址保持時(shí)間 */ uint32_t DataSetupTime; /* 數(shù)據(jù)建立時(shí)間 */ uint32_t BusTurnAroundDuration; /* 總線(xiàn)周轉(zhuǎn)階段的持續(xù)時(shí)間 */uint32_t CLKDivision; /* CLK時(shí)鐘輸出信號(hào)的周期 */uint32_t DataLatency; /* 同步突發(fā)NOR FLASH的數(shù)據(jù)延遲 */uint32_t AccessMode; /* 異步模式配置 */
} FSMC_NORSRAM_InitTypeDef;
這里要配置addressSetupTime地址建立時(shí)間和DataSetupTime數(shù)據(jù)建立時(shí)間。
FSMC模擬8080時(shí)序讀寫(xiě)簡(jiǎn)化代碼
void lcd_wr_cmd(volatile uint16_t cmd){cmd = cmd;*(uint16_t *)(FSMC_ADDR_CMD) = cmd;}
void lcd_wr_data(volatile uint16_t data)
{data = data;*(uint16_t *)(FSMC_ADDR_DATA) = data;
}
uint16_t lcd_rd_data(void)
{volatile uint16_t ram; ram = *(uint16_t *)(FSMC_ADDR_DATA);return ram;
}
硬件IO連接關(guān)系