Skip to main content

5. Display with framebuffer in external RAM

動機#

このステップでは、フレームバッファを内部RAMから外部RAMに移動し、外部RAMからでもディスプレイに転送できることを確認します。

Note
外付けRAMがご使用のボードに関係ない場合は、このステップをスキップしてください。

ディスプレイ・コントローラには転送速度に関して一定の要求があるため、このステップでは外部RAMに対してストレス・テストを実行します。 そのテストでは、エラーが発生する可能性があります。 一般的なエラーは、外部RAMのバンド幅不足によるLTDCのアンダーラン、またはRAMの誤設定による「仕様外」の動作を原因とするピクセル・エラーです。

目標#

このステップの目標は、内部RAMからフレームバッファの配列を削除し、外部RAM内のフレームバッファを使用することです。

検証#

次の表に、このセクションの検証ポイントを示します。 これらは、フレームバッファを内部RAMに配置した場合に似ていますが、外部メモリの速度がフレームバッファのディスプレイへの送信に影響を与える可能性があるため、再度確認する必要があります。

検証ポイント検証内容
フレームバッファが表示されるディスプレイ・コントローラまたはSPIが設定され動作していること。
更新されたフレームバッファが表示されるフレームバッファを繰り返し送信する仕組みがわかること。
フレームレートが正しいピクセル・クロックとポーチが必要なフレームレートを得られるように設定されていること。

前提条件#

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

  • 外部RAM内のフレームバッファのアドレス

作業内容#

次の2つの作業を実施します。

  • フレームバッファを外部RAM内に配置する
  • 外部RAMから読み出すようにディスプレイ・コントローラを設定する

フレームバッファを外部RAMに配置する場合は、配列を割り当てないことが一般的です。 適切なアドレスへのポインタを宣言するだけで、 外部RAM内のアドレスは手動で選択します。 外部RAM内の任意の場所を指定できますが、通常はRAMの開始アドレスを使用します。

main.c
uint16_t* framebuffer = (uint16_t*)0xC0000000;  //16 bpp framebuffer

内部RAMのフレームバッファのステップで作成した小さなテスト・プログラムを再利用できます。

LTDCレイヤの設定#

LTDC レイヤの設定を忘れずに変更してください。 ここではフレームバッファに対して固有のアドレスがあるため、CubeMXでそのアドレス(カラー・フレーム・バッファの開始アドレス)を挿入します。

LTDCレイヤ・パラメータの設定

プログラムの次の行およびフレームバッファ配列を削除することを忘れないでください。

main.c
  /* USER CODE BEGIN 2 */  HAL_LTDC_SetAddress(&hltdc, framebuffer, LTDC_LAYER_1);  /* USER CODE END 2 */

内部RAMの容量不足により、ステップ03でLTDCレイヤのサイズを、ディスプレイの一部のみを更新するように設定した場合は、ここでその設定をやり直します。 ディスプレイ全体をカバーするようにLTDCレイヤを再設定してください。