Skip to main content

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を搭載したマイクロコントローラ

作業内容#

The Chrom-ART is configured in STM32CubeMX under the Multimedia -> DMA2D category. DMA2Dを有効化し、ディスプレイに応じて[Transfer Mode]**[Color Mode]を設定します。

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

Chrom-ARTの設定

TouchGFXアプリケーションでは、フレームバッファ・アクセスの同期に、DMA2Dグローバル割込みが重要な役割を果たします。 Ensure that the global interupt is enabled (NVIC tab) and that code generation for interrupt handlers is enabled (Code Generation tab) in the STM32CubeMX NVIC settings as shown below. この段階では、優先度は重要ではありません。

Chrom-ART割込みの有効化

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

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

ターゲット・メモリ内(レジスタからメモリ) の矩形を特定の色で塗りつぶすコードの概要を示します。 Check STM32Cube Firmware packs for a concrete project for your MCU.

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

If the Transfer Completed setup is configured correctly in STM32CubeMX, a custom handler can be assigned to handle this event:

    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による読出し / 書込み動作よりも高性能であることが予想されます。

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