跳转到主要内容

8. 硬件加速器

动机

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可读取存储器Chrom-ART可用于绘制图形(M2M)
Chrom-ART可写入存储器Chrom-ART可用于绘制图形(M2M和R2M)
Chrom-ART性能Chrom-ART产生所需的图形性能

先决条件

以下是此步骤的先决条件:

  • 带Chrom-ART的MCU。

执行

在STM32CubeMX中,Chrom-ART在“Multimedia ”->“DMA2D”类别下进行配置。 激活DMA2D,并根据您的显示屏配置传输模式颜色模式

在下图中,激活DMA2D,并将其配置为存储器到存储器传输模式和RGB565颜色模式。 选择与您的显示屏匹配的颜色模式。

配置Chrom-ART

DMA2D全局中断对于TouchGFX应用中的帧缓存访问同步至关重要。 确保在STM32CubeMX NVIC设置中使能全局中断(NVIC选项卡),并为中断处理程序使能了代码生成(“代码生成”选项卡),如下所示。 在该阶段,优先级并不重要。

使能Chrom-ART中断

使能Chrom-ART中断处理程序的代码生成

写入帧缓存

下文概述了在目标存储器中将特定颜色填充到矩形中(寄存器到存储器模式)。 在STM32Cube固件包中查找适用于您的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);

如果在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的性能与先前仅CPU读写存储器的性能结果进行比较。 我们可以期待使用Chrom-ART的代码比之前基于CPU读/写操作的读取性能更高。

Tip
相比毫秒级计数的sysTick,使用“CCSTEP”时钟周期寄存器的值可以更精确地测量断点之间所花费的时钟数。