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可用于绘制图形(M2M) |
Chrom-ART可写入存储器 | Chrom-ART可用于绘制图形(M2M和R2M) |
Chrom-ART性能 | Chrom-ART产生所需的图形性能 |
先决条件
以下是此步骤的先决条件:
- 带Chrom-ART的MCU。
执行
在STM32CubeMX中,Chrom-ART在“Multimedia ”->“DMA2D”类别下进行配置。 激活DMA2D,并根据您的显示屏配置传输模式和颜色模式。
在下图中,激活DMA2D,并将其配置为存储器到存储器传输模式和RGB565颜色模式。 选择与您的显示屏匹配的颜色模式。
DMA2D全局中断对于TouchGFX应用中的帧缓存访问同步至关重要。 确保在STM32CubeMX NVIC设置中使能全局中断(NVIC选项卡),并为中断处理程序使能了代码生成(“代码生成”选项卡),如下所示。 在该阶段,优先级并不重要。
写入帧缓存
下文概述了在目标存储器中将特定颜色填充到矩形中(寄存器到存储器模式)。 在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读/写操作的读取性能更高。