Skip to main content

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

動機#

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

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

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

目標#

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

検証#

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

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

前提条件#

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

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

作業内容#

The QSPI controller is configured in STM32CubeMX under Connectivity -> QUADSPI:

QSPI Flashの設定

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

ブロック・モード#

Flashを有効化したら、ここからデータを読み出してテストします。 The STM32Cube Firmware package contains examples for that.

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

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

The STM32 STM32Cube HAL contains functions to change to memory mapped mode. 以下に例を示します。 設定データについては、データシートで確認する必要があります。 The STM32Cube Firmware package for your MCU contains more examples.

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

If you are using the same flash as one of the STM32 evaluation kits, then the BSP packages for these boards (also in the STM32Cube Firmware) contains valuable examples that can be modified for your hardware.

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

volatile uint32_t *externalFlash = 0x90000000;const uint32_t size = 1000;volatile uint32_t result = 0;
//read external Flashfor(int i = 0; i < size; i++){    result += externalFlash[i];}

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