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