6. 外部Flash(メモリ・マップド・モード)
動機
このステップでは、外部のQuad SPIまたはOctal SPI Flashをメモリ・マップド・モードで有効化します。 大容量の画像を多数使用できることから、ほとんどのプロジェクトで外部Flashの使用が推奨されます。 中程度のアプリケーションでも、内蔵Flashはすぐにいっぱいになります。
Note
データを外部Flashに配置する場合、マイクロコントローラで外部Flashを読み出せることが重要です。 最適性能を得るために、外部Flashは目的の速度(通常は最大) で動作する必要があります。
目標
このセクションの目標は、外部Flashを有効化してメモリ・マップド・モードに変更し、そこからデータを読み出すことです。 外部Flashの読出し速度はグラフィックにとって極めて重要であるため、読出し速度のテストも必要です。
検証
次の表に、このセクションの検証ポイントを示します。
検証ポイント | 検証内容 |
---|---|
外部Flashを読み出せる | 画像の格納に外部Flashを使用できること。 |
外部Flashの性能 | グラフィック性能は、画像メモリの性能に大きく依存します。 |
前提条件
以下に、このステップの前提条件を示します
- Flashに関する情報(通常はデータシート)
- マイクロコントローラと外部Flashの接続に関する情報
作業内容
QSPIコントローラは、STM32CubeMXの[Connectivity]>[QUADSPI]で設定します。
モードのセクションでは、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の性能もテストします。