跳轉到主要內容

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。

執行

Chrom-ART在 Multimedia -> DMA2D 類別下的STM32CubeMX中進行設定。 啟動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的性能與前一個步驟的讀寫記憶體的性能結果進行比較。 我們可以期待使用Chrom-ART的程式碼會比之前CPU讀寫操作的性能更高。

Tip
相較於sysTick,使用CCSTEP時鐘週期暫存器可以更精確的測量中斷之間所花費的時鐘週期。