メイン・コンテンツまでスキップ

6. 外部Flash(メモリ・マップド・モード)

動機

このステップでは、外部のQuad SPIまたはOctal SPI Flashをメモリ・マップド・モードで有効化します。 大容量の画像を多数使用できることから、ほとんどのプロジェクトで外部Flashの使用が推奨されます。 中程度のアプリケーションでも、内蔵Flashはすぐにいっぱいになります。

Note
ボードの立ち上げに外部Flashが関係しない場合は、このステップをスキップしてください。

データを外部Flashに配置する場合、マイクロコントローラで外部Flashを読み出せることが重要です。 最適性能を得るために、外部Flashは目的の速度(通常は最大) で動作する必要があります。

目標

このセクションの目標は、外部Flashを有効化してメモリ・マップド・モードに変更し、そこからデータを読み出すことです。 外部Flashの読出し速度はグラフィックにとって極めて重要であるため、読出し速度のテストも必要です。

検証

次の表に、このセクションの検証ポイントを示します。

検証ポイント検証内容
外部Flashを読み出せる画像の格納に外部Flashを使用できること。
外部Flashの性能グラフィック性能は、画像メモリの性能に大きく依存します。

前提条件

以下に、このステップの前提条件を示します

  • Flashに関する情報(通常はデータシート)
  • マイクロコントローラと外部Flashの接続に関する情報

作業内容

QSPIコントローラは、STM32CubeMXの[Connectivity]>[QUADSPI]で設定します。

QSPI Flashの設定

モードのセクションでは、Flashのデータ・ラインをシングル / デュアル / クワッドに設定できます。 クワッド・ラインが最速です。 外部RAMと同様に、ここではデータ・ライン、チップ・セレクト、クロック信号に使用するGPIOを選択および設定することも必要です。

ブロック・モード

Flashを有効化したら、ここからデータを読み出してテストします。 STM32Cubeファームウェア・パッケージには、そのためのサンプルが含まれています。

メモリ・マップド・モード

Flashを有効化してブロック・モードでテストしたら、メモリ・マップド・モードに切り替える必要があります。 これによって、CPUはFlashから直接データをフェッチできるようになります。

STM32Cube HALには、メモリ・マップド・モードに変更するための関数があります。 以下に例を示します。 設定データについては、データシートで確認する必要があります。 使用するマイクロコントローラに対応する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評価キットと同じFlashを使用している場合、それらのボード(およびSTM32Cubeファームウェア・パッケージ)のBSPパッケージには、ご自身のハードウェアに合わせて変更可能な貴重なサンプルが含まれています。

Flashをメモリ・マップド・モードに設定すると、外部RAMで使用したものと同様のコードでこれをテストできます(アドレスはマイクロコントローラのデータシートで確認してください)。

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];
}

前のステップで行ったメモリ性能テストを再利用して、外部Flashの性能もテストします。