跳轉到主要內容

6. 外部可定址快閃記憶體

動機

在這一步,我們將在記憶體映射模式下使能外部的Quad或Octo SPI快閃記憶體。 對於大多數專案,建議使用外部快閃記憶體,因為這允許應用程式使用多個大型影像。 即便最普通的應用,內部快閃記憶體也可能會很快被用完。

Note
若開發板不支援外部快閃記憶體,請跳過此步驟。

如欲將資料存放在外部快閃記憶體,必須確保MCU可以讀取外部快閃記憶體。 外部快閃記憶體應以所需的速度運行(通常為最大速度),以獲得最佳性能。

目標

本節的目的為使能外部快閃記憶體,並使用記憶體映射模式,從中讀取數據。 由於外部快閃記憶體的讀取速度對圖形的處理非常重要,因此您應該要測試讀取速度。

驗證

以下是本節的驗證點:

驗證點基本原理
外部快閃記憶體可讀外部快閃記憶體可用於影像存儲
外部快閃記憶體性能圖形處理性能在很大程度上取決於記憶體性能

先決條件

以下是此步驟的先決條件:

  • 有關快閃記憶體的資訊,查閱資料手冊
  • 關於MCU與外部快閃記憶體之間的連接的資訊

執行

QSPI控制器在 Connectivity -> QUADSPI中的STM32CubeMX 設定:

設定QSPI快閃記憶體

在模式部分,您可以將快閃記憶體配置為單/雙/四資料線。 四資料線最快。 與外部RAM相似,這裡還需選擇和設定用於資料線、晶片選擇和時鐘訊號的GPIO。

區塊模式

使能快閃記憶體後,我們可以通過從中讀取數據來對其進行測試。 STM32Cube韌體套件包含有關範例。

記憶體映射模式

使能快閃記憶體的區塊模式並對其進行測試後,必須將其更改為記憶體映射模式。 這將允許CPU直接從快閃記憶體中獲取數據。

STM32Cube HAL包含變更記憶體映射模式的函數。 這裡給出了一個範例。 必須通過查閱資料手冊來獲取配置數據。 MCU的STM32Cube韌體套件包含更多範例。

main.c
QSPI_CommandTypeDef      s_command;
QSPI_MemoryMappedTypeDef s_mem_mapped_cfg;

/* Configure the command for the read instruction */
s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
s_command.Instruction = QUAD_INOUT_FAST_READ_CMD;
s_command.AddressMode = QSPI_ADDRESS_4_LINES;
s_command.AddressSize = QSPI_ADDRESS_24_BITS;
s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
s_command.DataMode = QSPI_DATA_4_LINES;
s_command.DummyCycles = N25Q128A_DUMMY_CYCLES_READ_QUAD;
s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;

/* Configure the memory mapped mode */
s_mem_mapped_cfg.TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE;

if (HAL_QSPI_MemoryMapped(&QSPIHandle, &s_command, &s_mem_mapped_cfg) != HAL_OK)
{
return QSPI_ERROR;
}

如果您使用與某STM32評估套件相同的快閃記憶體,這些開發板的BSP套件(也在STM32Cube韌體中)裡整合了供您修改硬體的參考範例。

當快閃記憶體處於記憶體映射模式時,您可以使用像外部RAM中的程式碼那樣對外部快閃記憶體進行測試(在MCU資料表手冊中尋找位址):

volatile uint32_t *externalFlash = 0x90000000;
const uint32_t size = 1000;
volatile uint32_t result = 0;

//read external Flash
for(int i = 0; i < size; i++)
{
result += externalFlash[i];
}

重新使用先前記憶體效能測試的步驟,以測試外部快閃記憶體的性能。