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에서 메모리 읽기가 가능한지 여부 | 그래픽(M2M)을 그리는 데 Chrom-ART가 사용 가능한지 여부 |
Chrom-ART에서 메모리 쓰기가 가능한지 여부 | 그래픽(M2M 및 R2M)을 그리는 데 Chrom-ART가 사용 가능한지 여부 |
Chrom-ART 성능 | Chrom-ART가 원하는 그래픽 성능을 발휘하는지 여부 |
전제 조건
다음은 이 단계에 대한 전제 조건입니다:
- Chrom-ART를 장착한 MCU
실행
Chrom-ART는 STM32CubeMX에 Multimedia -> DMA2D 범주 아래에서 구성됩니다. DMA2D를 활성화하고 디스플레이에 따라 전송 모드와 색상 모드를 구성하십시오.
아래 그림에서는 DMA2D가 메모리간 전송 모드 및 RGB565 색상 모드를 위해 활성화 및 구성되어 있습니다. 디스플레이에 맞는 색상 모드를 선택하십시오.
DMA2D 전역 인터럽트는 TouchGFX 애플리케이션에서 프레임 버퍼 액세스를 동기화하는 데 중요합니다. 아래와 같이 STM32CubeMX NVIC 설정에서 전역 인터럽트의 활성화(NVIC 탭) 여부와 인터럽트 핸들러를 위한 코드 생성의 활성화(Code Generation 탭) 여부를 확인하십시오. 이 단계에서 우선순위는 중요하지 않습니다.
프레임 버퍼 메모리에 쓰기
다음은 대상 메모리(레지스터에서 메모리로)의 사각형에 특정 색상을 채우는 코드에 대한 개요입니다. 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
}
}
픽셀 데이터를 이용해 메모리에 포인터를 제공함으로써 Memory-to-Memory를 테스트할 수 있습니다.
HAL_DMA2D_Start_IT(&hdma2d,
(unsigned int)srcPtr,
(unsigned int)dstPtr,
displayWidth - nrOfPixels);
예상대로 성능이 발휘되는지 여부
Chrom-ART의 성능을 메모리 읽기 및 쓰기를 수행한 이전 단계에서 나온 성능 결과와 비교하십시오. Chrom-ART를 활용하는 코드는 이전의 CPU 읽기/쓰기 작업보다 성능이 뛰어날 것으로 기대됩니다.