주요 내용으로 건너뛰기

8. Hardware acceleration

개요

Chrom-ART(DMA2D) 그래픽 가속기는 메모리에서 이미지 데이터의 부분을 전송하고 이것을 프레임 버퍼에서 그리거나 구성할 수 있습니다. Chrom-ART는 내부 또는 외부 메모리에서 데이터를 읽어올 수 있습니다. 마찬가지로 내부 또는 외부 메모리에 쓰기도 가능합니다. 그래픽을 수행할 때 활용이 가능하며, 그래픽 성능을 획기적으로 개선하는 동시에 애플리케이션의 MCU 사용량을 대폭 줄일 수 있습니다.

모든 제품은 아니지만 대부분의 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를 장착한 MCU

실행

Chrom-ART는 STM32CubeMX에 Multimedia -> DMA2D 범주 아래에서 구성됩니다. DMA2D를 활성화하고 디스플레이에 따라 전송 모드와 색상 모드를 구성하십시오.

아래 그림에서는 DMA2D가 메모리간 전송 모드 및 RGB565 색상 모드를 위해 활성화 및 구성되어 있습니다. 디스플레이에 맞는 색상 모드를 선택하십시오.

Chrom-ART 구성

DMA2D 전역 인터럽트는 TouchGFX 애플리케이션에서 프레임 버퍼 액세스를 동기화하는 데 중요합니다. 아래와 같이 STM32CubeMX NVIC 설정에서 전역 인터럽트의 활성화(NVIC 탭) 여부와 인터럽트 핸들러를 위한 코드 생성의 활성화(Code Generation 탭) 여부를 확인하십시오. 이 단계에서 우선순위는 중요하지 않습니다.

Chrom-ART 인터럽트 활성화

Chrom-ART 인터럽트 핸들러 코드 생성 활성화

프레임 버퍼 메모리에 쓰기

다음은 대상 메모리(레지스터에서 메모리로)의 사각형에 특정 색상을 채우는 코드에 대한 개요입니다. MCU에서 구체적인 프로젝트에 대한 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에 Transfer Completed 설정이 올바르게 구성되어 있으면 이 이벤트를 처리하기 위해 사용자 지정 핸들러를 할당할 수 있습니다.

    hdma2d.XferCpltCallback = DMA2D_XferCpltCallback;

또한 핸들러를 다음과 같이 정의하여 Transfer Completed 인터럽트 구성을 확인할 수 있습니다:

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

ChromART 사용에 대한 더 많은 예는 CubeFW 예제에서 찾아볼 수 있습니다. STM32F429 디스커버리 보드에 대한 예제 링크가 아래에 나와 있습니다.

예상대로 성능이 발휘되는지 여부

Chrom-ART의 성능을 메모리 읽기 및 쓰기를 수행한 이전 단계에서 나온 성능 결과와 비교하십시오. Chrom-ART를 활용하는 코드는 이전의 CPU 읽기/쓰기 작업보다 성능이 뛰어날 것으로 기대됩니다.

Tip
밀리초로 카운팅하는 sysTick보다 정확하게 중단점 간에 소요된 클록 사이클을 측정하려면 `CCSTEP` 클록 사이클 레지스터의 값을 사용하십시오.