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

8. ハードウェア・アクセラレータ

動機

Chrom-ART(DMA2D) グラフィック・アクセラレータは、画像データの各部分をメモリから転送し、これをフレームバッファ上に描画または構成できます。 Chrom-ARTは内部または外部のメモリからデータを読み出せます。 同様に、内部または外部のメモリへの書込みも行います。 これはグラフィック処理に利用でき、グラフィック性能を大幅に向上させると同時に、アプリケーションによるマイクロコントローラの使用を大幅に縮小できる可能性があります。

STM32コントローラの多くがChrom-ARTアクセラレータを搭載していますが、すべてではありません。 データシートを確認してください。 DMA2Dは、Chrom-ARTのコード名で、コードやドキュメントで使われます。

Note
ボードの立ち上げにChrom-ARTによるハードウェア・アクセラレーションが関係しない場合は、このステップをスキップしてください。

目標

このステップの目標は、Chrom-ARTを有効化し、これを使用してデータの読出し / 書込みを行うことです。 目標は、Chrom-ARTチップの機能の検証ではなく、Chrom-ARTの観点からメモリ・インタフェースが機能することを確認することです。

検証

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

検証ポイント検証内容
Chrom-ARTが設定されているChrom-ARTを使用して目的とするグラフィックを描画できること。
Chrom-ARTがメモリを読み出せるChrom-ARTを使用してグラフィックを描画できること(M2M)。
Chrom-ARTがメモリに書き込めるChrom-ARTを使用してグラフィックを描画できること(M2MとR2M)。
Chrom-ARTの性能Chrom-ARTが目的とするグラフィック性能を達成すること。

前提条件

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

  • Chrom-ARTを搭載したマイクロコントローラ

作業内容

Chrom-ARTは、STM32CubeMXの[Multimedia]>[DMA2D]カテゴリで設定します。 DMA2Dを有効化し、ディスプレイに応じて[Transfer Mode][Color Mode]を設定します。

下図では、DMA2Dが有効化され、[Transfer Mode]として[Memory to Memory]、[Color Mode]として[RGB565]が設定されています。 カラー・モードはディスプレイに対応したものを選択してください。

Chrom-ARTの設定

TouchGFXアプリケーションでは、フレームバッファ・アクセスの同期に、DMA2Dグローバル割込みが重要な役割を果たします。 下図のように、STM32CubeMXのNVIC設定で、グローバル割込みが有効化されていること([NVIC]タブ)、割込みハンドラのコード生成が有効化されていること([Code Generation]タブ) を確認します。 この段階では、優先度は重要ではありません。

Chrom-ART割込みの有効化

Chrom-ART割込みハンドラのコード生成の有効化

フレームバッファ・メモリへの書込み

ターゲット・メモリ内(レジスタからメモリ) の矩形を特定の色で塗りつぶすコードの概要を示します。 使用するマイクロコントローラの具体的なプロジェクトはSTM32Cubeファームウェア・パッケージを確認してください。

main.c
#include "stm32f7xx_hal.h"
#include "stm32f7xx_hal_dma2d.h"
...

uint32_t color = 0xF800; //Red in RGB565

hdma2d.Init.Mode = DMA2D_R2M;
hdma2d.Init.ColorMode = DMA2D_RGB565;

MODIFY_REG(hdma2d.Instance->CR, DMA2D_CR_MODE, DMA2D_R2M);
MODIFY_REG(hdma2d.Instance->OPFCCR, DMA2D_OPFCCR_CM, DMA2D_RGB565);
MODIFY_REG(hdma2d.Instance->OOR, DMA2D_OOR_LO, displayWidth - rectangleWidth);

hdma2d.LayerCfg[1].InputColorMode = CM_RGB565;
hdma2d.LayerCfg[1].InputOffset = 0;

HAL_DMA2D_ConfigLayer(&hdma2d, 1);

HAL_DMA2D_Start_IT(&hdma2d, color, (unsigned int)dstPtr, rectangleWidth, rectangleHeight);

STM32CubeMXで転送完了の設定が正しく行われていれば、このイベントの処理にカスタム・ハンドラを割り当てることができます。

    hdma2d.XferCpltCallback = DMA2D_XferCpltCallback;

さらに、次のようにハンドラを定義して、転送完了割込みの設定を検証できます。

extern "C" {
static void DMA2D_XferCpltCallback(DMA2D_HandleTypeDef* handle)
{
//Ensure that you this callback is called
}
}

これ以上のChrom-ARTの使用例ついては、CubeFWの例を参照してください。 STM32F429 Discoveryボードの例へのリンクを次に示します。

期待通りの性能が得られること

Chrom-ARTの性能を、前のステップで実施したメモリの読出し / 書込み性能結果と比較します。 Chrom-ARTを使用したコードの方が、前のステップのCPUによる読出し / 書込み動作よりも高性能であることが予想されます。

Tip
ブレークポイント間のクロック・サイクル数は、sysTickをミリ秒単位でカウントするよりも、クロック・サイクル・レジスタCCSTEPの値を使用した方が、より高精度に測定できます。