天天看點

STM32F429_固件庫_FMC

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 控制指令 中的宏,這

些宏代表了不同指令;

STM32F429_固件庫_FMC

(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 外設就會發送相應的指令了。