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を使用してグラフィックを描画できること(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]が設定されています。 カラー・モードはディスプレイに対応したものを選択してください。
TouchGFXアプリケーションでは、フレームバッファ・アクセスの同期に、DMA2Dグローバル割込みが重要な役割を果たします。 下図のように、STM32CubeMXのNVIC設定で、グローバル割込みが有効化されていること([NVIC]タブ)、割込みハンドラのコード生成が有効化されていること([Code Generation]タブ) を確認します。 この段階では、優先度は重要ではありません。
フレームバッファ・メモリへの書込み
ターゲット・メモリ内(レジスタからメモリ) の矩形を特定の色で塗りつぶすコードの概要を示します。 使用するマイクロコントローラの具体的なプロジェクトは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
}
}
メモリからメモリの転送は、ピクセル・データを含むメモリへのポインタを指定することでテストできます。
HAL_DMA2D_Start_IT(&hdma2d,
(unsigned int)srcPtr,
(unsigned int)dstPtr,
displayWidth - nrOfPixels);
期待通りの性能が得られること
Chrom-ARTの性能を、前のステップで実施したメモリの読出し / 書込み性能結果と比較します。 Chrom-ARTを使用したコードの方が、前のステップのCPUによる読出し / 書込み動作よりも高性能であることが予想されます。