6. 外部可定址快閃記憶體
動機
在這一步,我們將在記憶體映射模式下使能外部的Quad或Octo SPI快閃記憶體。 對於大多數專案,建議使用外部快閃記憶體,因為這允許應用程式使用多個大型影像。 即便最普通的應用,內部快閃記憶體也可能會很快被用完。
Note
如欲將資料存放在外部快閃記憶體,必須確保MCU可以讀取外部快閃記憶體。 外部快閃記憶體應以所需的速度運行(通常為最大速度),以獲得最佳性能。
目標
本節的目的為使能外部快閃記憶體,並使用記憶體映射模式,從中讀取數據。 由於外部快閃記憶體的讀取速度對圖形的處理非常重要,因此您應該要測試讀取速度。
驗證
以下是本節的驗證點:
驗證點 | 基本原理 |
---|---|
外部快閃記憶體可讀 | 外部快閃記憶體可用於影像存儲 |
外部快閃記憶體性能 | 圖形處理性能在很大程度上取決於記憶體性能 |
先決條件
以下是此步驟的先決條件:
- 有關快閃記憶體的資訊,查閱資料手冊
- 關於MCU與外部快閃記憶體之間的連接的資訊
執行
QSPI控制器在 Connectivity -> QUADSPI中的STM32CubeMX 設定:
在模式部分,您可以將快閃記憶體配置為單/雙/四資料線。 四資料線最快。 與外部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];
}
重新使用先前記憶體效能測試的步驟,以測試外部快閃記憶體的性能。