FMC 固件庫函數結構體講解
1. NOR/SRAM 時序結構體
typedef struct
{
uint32_t FMC_AddressSetupTime; /*位址建立時間, 0-0xF 個 HCLK 周期*/
uint32_t FMC_AddressHoldTime; /*位址保持時間, 0-0xF 個 HCLK 周期*/
uint32_t FMC_DataSetupTime; /*資料建立時間, 0-0xF 個 HCLK 周期*/
uint32_t FMC_BusTurnAroundDuration; /*總線轉換周期,0-0xF個HCLK周期,在 NOR FLASH */
uint32_t FMC_CLKDivision; /*時鐘分頻因子,1-0xF,若控制異步存儲器,本參數無效 */
uint32_t FMC_DataLatency; /*資料延遲時間,若控制異步存儲器,本參數無效 */
uint32_t FMC_AccessMode; /*設定通路模式 */
}FMC_NORSRAMTimingInitTypeDef;
這個結構體成員定義的都是 SRAM 讀寫時序中的各項時間參數,這些成員的的參數都
與 FSMC_BRT 及 FSMC_BWTR 寄存器配置對應,各個成員介紹如下:
(1) FSMC_AddressSetupTime
本成員設定位址建立時間,即 FSMC 讀寫時序圖 27-9 中的 ADDSET 值,它可以被設
置為 0-0xF 個 HCLK 周期數,按 STM32 标準庫的預設配置, HCLK 的時鐘頻率為
168MHz,即一個 HCLK 周期為 1/168 微秒。
(2) FSMC_AddressHoldTime
本成員設定位址保持時間,它可以被設定為 0-0xF 個 HCLK 周期數。
(3) FSMC_DataSetupTime
本成員設定資料建立時間,即 FSMC 讀寫時序圖 27-10 中的 DATAST 值,它可以被設
置為 0-0xF 個 HCLK 周期數。
(4) FSMC_BusTurnAroundDuration
本成員設定總線轉換周期,在 NOR FLASH 存儲器中,位址線與資料線可以分時複用,
總線轉換周期就是指總線在這兩種狀态間切換需要的延時,防止沖突。控制其它存儲
器時這個參數無效,配置為 0 即可。
(5) FSMC_CLKDivision
本成員用于設定時鐘分頻,它以 HCLK 時鐘作為輸入,經過 FSMC_CLKDivision 分頻
後輸出到 FSMC_CLK 引腳作為通訊使用的同步時鐘。控制其它異步通訊的存儲器時
這個參數無效,配置為 0 即可。
(6) FSMC_DataLatency
本成員設定資料保持時間,它表示在讀取第一個資料之前要等待的周期數,該周期指
同步時鐘的周期,本參數僅用于同步 NOR FLASH 類型的存儲器,控制其它類型的存
儲器時,本參數無效。
(7) FSMC_AccessMode
本成員設定存儲器通路模式,不同的模式下 FSMC 通路存儲器位址時引腳輸出的時序
不一樣,可選 FSMC_AccessMode_A/B/C/D 模式。一般來說控制 SRAM 時使用 A 模式。
這個 FSMC_NORSRAMTimingInitTypeDef 時序結構體配置的延時參數,将作為下一節
的 FSMC SRAM 初始化結構體的一個成員
2. NOR/SRAM初始化結構體
4 typedef struct
5 {
6 uint32_t FSMC_Bank; /*設定要控制的 Bank 區域 */
7 uint32_t FSMC_DataAddressMux; /*設定位址總線與資料總線是否複用 */
8 uint32_t FSMC_MemoryType; /*設定存儲器的類型 */
9 uint32_t FSMC_MemoryDataWidth; /*設定存儲器的資料寬度*/
10 uint32_t FSMC_BurstAccessMode; /*設定是否支援突發通路模式,隻支援同步類型的存儲器 */
11 uint32_t FSMC_AsynchronousWait; /*設定是否使能在同步傳輸時的等待信号, */
12 uint32_t FSMC_WaitSignalPolarity; /*設定等待信号的極性*/
13 uint32_t FSMC_WrapMode; /*設定是否支援對齊的突發模式 */
14 uint32_t FSMC_WaitSignalActive; /*配置等待信号在等待前有效還是等待期間有效 */
15 uint32_t FSMC_WriteOperation; /*設定是否寫使能 */
16 uint32_t FSMC_WaitSignal; /*設定是否使能等待狀态插入 */
17 uint32_t FSMC_ExtendedMode; /*設定是否使能擴充模式 */
18 uint32_t FSMC_WriteBurst; /*設定是否使能寫突發操作*/
19 /*當不使用擴充模式時,本參數用于配置讀寫時序,否則用于配置讀時序*/
20 FSMC_NORSRAMTimingInitTypeDef* FSMC_ReadWriteTimingStruct;
21 /*當使用擴充模式時,本參數用于配置寫時序*/
22 FSMC_NORSRAMTimingInitTypeDef* FSMC_WriteTimingStruct;
23 }FSMC_NORSRAMInitTypeDef;
這個結構體,除最後兩個成員是上一小節講解的時序配置外, 其它結構體成員的配置
都對應到 FSMC_BCR 中的寄存器位。各個成員意義介紹如下,括号中的是 STM32 标準庫
定義的宏:
(1) FSMC_Bank
本成員用于選擇 FSMC 映射的存儲區域,它的可選參數以及相應的核心位址映射範圍
見表 27-4。
(2) FSMC_DataAddressMux
本成員用于設定位址總線與資料總線是否複用(FSMC_DataAddressMux_Enable
/Disable),在控制 NOR FLASH 時,可以位址總線與資料總線可以分時複用,以減少
使用 STM32 信号線的數量。
(3) FSMC_MemoryType
本成員用于設定要控制的存儲器類型,它支援控制的存儲器類型為 SRAM、 PSRAM
以及 NOR FLASH(FSMC_MemoryType_SRAM/PSRAM/NOR)。
(4) FSMC_MemoryDataWidth
本成員用于設定要控制的存儲器的資料寬度,可選擇設定成 8 或 16 位
(FSMC_MemoryDataWidth_8b /16b)。
(5) FSMC_BurstAccessMode
本成員用于設定是否使用突發通路模式(FSMC_BurstAccessMode_Enable/Disable),突
發通路模式是指發送一個位址後連續通路多個資料,非突發模式下每通路一個資料都
需要輸入一個位址,僅在控制同步類型的存儲器時才能使用突發模式。
(6) FSMC_AsynchronousWait
本成員用于設定是否使能在同步傳輸時使用的等待信号
(FSMC_AsynchronousWait_Enable/Disable),在控制同步類型的 NOR 或 PSRAM 時,
存儲器可以使用 FSMC_NWAIT 引腳通知 STM32 需要等待。
(7) FSMC_WaitSignalPolarity
本成員用于設定等待信号的有效極性,即要求等待時,使用高電平還是低電平
(FSMC_WaitSignalPolarity_High/Low)。
(8) FSMC_WrapMode
本成員用于設定是否支援把非對齊的 AHB 突發操作分割成 2 次線性操作
(FSMC_WrapMode_Enable/Disable),該配置僅在突發模式下有效。
(9) FSMC_WaitSignalActive
本成員用于配置在突發傳輸模式時,決定存儲器是在等待狀态之前的一個資料周期有
效還是在等待狀态期間有效(FSMC_WaitSignalActive_BeforeWaitState/DuringWaitState)。
(10) FSMC_WriteOperation
這個成員用于設定是否寫使能(FSMC_WriteOperation_ Enable /Disable),禁止寫使能的
話 FSMC 隻能從存儲器中讀取資料,不能寫入。
(11) FSMC_WaitSignal
本成員用于設定當存儲器處于突發傳輸模式時,是否允許通過 NWAIT 信号插入等待
狀态(FSMC_WaitSignal_Enable/Disable)。
(12) FSMC_ExtendedMode
本成員用于設定是否使用擴充模式(FSMC_ExtendedMode_Enable/Disable),在非擴充
模式下,對存儲器讀寫的時序都隻使用 FSMC_BCR 寄存器中的配置,即下面的
FSMC_ReadWriteTimingStruct 結構體成員;在擴充模式下,對存儲器的讀寫時序可以
分開配置,讀時序使用 FSMC_BCR 寄存器,寫時序使用 FSMC_BWTR 寄存器的配置,
即下面的 FSMC_WriteTimingStruct 結構體。
(13) FSMC_ReadWriteTimingStruct
本成員是一個指針,指派時使用上一小節中講解的時序結構體
FSMC_NORSRAMInitTypeDef 設定,當不使用擴充模式時,讀寫時序都使用本成員的
參數配置。
(14) FSMC_WriteTimingStruct
同樣地,本成員也是一個時序結構體的指針,隻有當使用擴充模式時,本配置才有效,
它是寫操作使用的時序。
對本結構體指派完成後,調用 FSMC_NORSRAMInit 庫函數即可把配置參數寫入到
FSMC_BCR 及 FSMC_BTR/BWTR 寄存器中。
3. FMC NAND and PCCARD 時序
4. FMC NAND 結構體
5. PCCARD 結構體
6. SDRAM 時序
/* @brief 控制 SDRAM 的時序參數,這些參數的機關都是“周期”
2 * 各個參數的值可設定為 1-16 個周期。 */
3 typedef struct
4 {
5 uint32_t FMC_LoadToActiveDelay; /*TMRD: 加載模式寄存器指令後的延遲 */
6 uint32_t FMC_ExitSelfRefreshDelay; /*TXSR: 自重新整理指令後的延遲 */
7 uint32_t FMC_SelfRefreshTime; /*TRAS: 自重新整理時間 */
8 uint32_t FMC_RowCycleDelay; /*TRC: 行循環延遲 */
9 uint32_t FMC_WriteRecoveryTime; /*TWR: 恢複延遲 */
10 uint32_t FMC_RPDelay; /*TRP: 行預充電延遲 */
11 uint32_t FMC_RCDDelay; /*TRCD: 行到列延遲 */
12 } FMC_SDRAMTimingInitTypeDef;
這個結構體成員定義的都是 SDRAM 發送各種指令後必須的延遲,它的配置對應到 FMC_SDTR
中的寄存器位。所有成員參數值的機關是周期,參數值大小都可設定成“1-16”。關于這些延時
時間的定義可以看“SDRAM 初始化流程”和“SDRAM 讀寫流程”小節的時序圖了解。具體參
數值根據 SDRAM 晶片的手冊說明來配置。各成員介紹如下:
(1) FMC_LoadToActiveDelay
本成員設定 TMRD 延遲 (Load Mode Register to Active),即發送加載模式寄存器指令後
要等待的時間,過了這段時間才可以發送行有效或重新整理指令。
(2) FMC_ExitSelfRefreshDelay
本成員設定退出 TXSR 延遲 (Exit Self-refresh delay),即退出自我重新整理指令後要等待的
時間,過了這段時間才可以發送行有效指令。
(3) FMC_SelfRefreshTime
本成員設定自我重新整理時間 TRAS,即發送行有效指令後要等待的時間,過了這段時間
才執行預充電指令。
(4) FMC_RowCycleDelay
本成員設定 TRC 延遲 (Row cycle delay),即兩個行有效指令之間的延遲,以及兩個相
鄰重新整理指令之間的延遲
(5) FMC_WriteRecoveryTime
本成員設定 TWR 延遲 (Recovery delay),即寫指令和預充電指令之間的延遲,等待這
段時間後才開始執行預充電指令。
(6) FMC_RPDelay
本成員設定 TRP 延遲 (Row precharge delay),即預充電指令與其它指令之間的延遲。
(7) FMC_RCDDelay
本成員設定 TRCD 延遲 (Row to column delay),即行有效指令到列讀寫指令之間的延
遲。
這個 SDRAMTimingInitTypeDef 時序結構體配置的延時參數,将作為下一節的 FMC SDRAM 初始
化結構體的一個成員。
7. SDRAM結構體
/* @brief FMC SDRAM 初始化結構體類型定義 */
2 typedef struct
3 {
4 uint32_t FMC_Bank; /* 選擇 FMC 的 SDRAM 存儲區域 */
5 uint32_t FMC_ColumnBitsNumber; /* 定義 SDRAM 的列位址寬度 */
6 uint32_t FMC_RowBitsNumber; /* 定義 SDRAM 的行位址寬度 */
7 uint32_t FMC_SDMemoryDataWidth; /* 定義 SDRAM 的資料寬度 */
8 uint32_t FMC_InternalBankNumber; /* 定義 SDRAM 内部的 Bank 數目 */
9 uint32_t FMC_CASLatency; /* 定義 CASLatency 的時鐘個數 */
10 uint32_t FMC_WriteProtection; /* 定義是否使能寫保護模式 */
11 uint32_t FMC_SDClockPeriod; /* 配置同步時鐘 SDCLK 的參數 */
12 uint32_t FMC_ReadBurst; /* 是否使能突發讀模式 */
13 uint32_t FMC_ReadPipeDelay; /* 定義在 CAS 個延遲後再等待多
14 少個 HCLK 時鐘才讀取資料 */
15 FMC_SDRAMTimingInitTypeDef* FMC_SDRAMTimingStruct; /* 定義 SDRAM 的時序參數
16
17 } FMC_SDRAMInitTypeDef;
這個結構體,除最後一個成員是上一小節講解的時序配置外,其它結構體成員的配置都對應到
FMC_SDCR 中的寄存器位。各個成員意義在前面的小節已有具體講解,其可選參數介紹如下,括
号中的是 STM32 标準庫定義的宏:
(1) FMC_Bank
本成員用于選擇 FMC 映射的 SDRAM 存儲區域,可選擇存儲區域 1 或 2
(FMC_Bank1/2_SDRAM)。
(2) FMC_ColumnBitsNumber
本 成 員 用 于 設 置 要 控 制 的 SDRAM 的 列 地 址 寬 度, 可 選 擇 8-11 位
(FMC_ColumnBits_Number_8/9/10/11b)。
(3) FMC_RowBitsNumber
本成員用于設定要控制的 SDRAM 的行位址寬度,可選擇設定成 11-13 位
(FMC_RowBits_Number_11/12/13b)。
(4) FMC_SDMemoryDataWidth
本成員用于設定要控制的 SDRAM 的資料寬度,可選擇設定成 8、 16 或 32 位
(FMC_SDMemory_Width_8/16/32b)。
(5) FMC_InternalBankNumber
本成員用于設定要控制的 SDRAM 的内部 Bank 數目,可選擇設定成 2 或 4 個 Bank 數
目 (FMC_InternalBank_Number_2/4),請注意區分這個結構體成員與 FMC_Bank 的區
别。
(6) FMC_CASLatency
本成員用于設定 CASLatency 即 CL 的時鐘數目,可選擇設定為 1、 2 或 3 個時鐘周期
(FMC_CAS_Latency_1/2/3)。
(7) FMC_WriteProtection
本成員用于設定是否使能寫保護模式,如果使能了寫保護則不能向 SDRAM 寫入數
據,正常使用都是禁止寫保護的。
(8) FMC_SDClockPeriod
本成員用于設定 FMC 與外部 SDRAM 通訊時的同步時鐘參數,可以設定成
STM32 的 HCLK 時鐘頻率的 1/2、 1/3 或禁止輸出時鐘 (FMC_SDClock_Period_2/3 或
FMC_SDClock_Disable)。
(9) FMC_ReadBurst
本成員用于設定是否使能突發讀取模式,禁止時等效于 BL=1,使能時 BL 的值等于
模式寄存器中的配置。
(10) FMC_ReadPipeDelay
本成員用于配置在 CASLatency 個時鐘周期後,再等待多少個 HCLK 時鐘周期才進行
資料采樣,在確定正确的前提下,這個值設定為越短越好,可選擇設定的參數值為 0、
1 或 2 個 HCLK 時鐘周期 (FMC_ReadPipe_Delay_0/1/2)。
(11) FMC_SDRAMTimingStruct
這個成員就是我們上一小節講解的 SDRAM 時序結構體了,設定完時序結構體後再把
指派到這裡即可。
配置完 SDRAM 初始化結構體後,調用 FMC_SDRAMInit 函數把這些配置寫入到 FMC 的 SDRAM
控制寄存器及時序寄存器,實作 FMC 的初始化。
8. SDRAM指令
typedef struct
2 {
3 uint32_t FMC_CommandMode; /* 要發送的指令 */
4 uint32_t FMC_CommandTarget; /* 目标存儲器區域 */
5 uint32_t FMC_AutoRefreshNumber; /* 若發送的是自動重新整理指令,
6 此處為發送的重新整理次數,其它指令時無效 */
7 uint32_t FMC_ModeRegisterDefinition; /* 若發送的是加載模式寄存器指令,
8 此處為要寫入 SDRAM 模式寄存器的參數 */
9 } FMC_SDRAMCommandTypeDef;
指令結構體中的各個成員介紹如下:
(1) FMC_CommandMode
本成員用于配置将要發送的指令,它可以被指派為表 FMC 可輸出的 SDRAM 控制指令 中的宏,這
些宏代表了不同指令;
(2) FMC_CommandTarget
本 成 員 用 于 選 擇 要 控 制 的 FMC 存 儲 區 域, 可 選 擇 存 儲 區 域 1 或
2(FMC_Command_Target_bank1/2);
(3) FMC_AutoRefreshNumber
有時需要連續發送多個“自動重新整理” (Auto Refresh) 指令時,配置本成員即可控
制它發送多少次,可輸入參數值為 1-16,若發送的是其它指令,本參數值無
效。如 FMC_CommandMode 成員被配置為宏 FMC_Command_Mode_AutoRefresh,而
FMC_AutoRefreshNumber 被設定為 2 時, FMC 就會控制發送 2 次自動重新整理指令。
(4) FMC_ModeRegisterDefinition
當向 SDRAM 發送加載模式寄存器指令時,這個結構體成員的值将通過位址線發送到
SDRAM 的模式寄存器中,這個成員值長度為 13 位,各個位一一對應 SDRAM 的模
式寄存器。
配置完這些結構體成員,調用庫函數 FMC_SDRAMCmdConfig 即可把這些參數寫入到
FMC_SDCMR 寄存器中,然後 FMC 外設就會發送相應的指令了。