跳轉到主要內容

SPI

下列將介紹在一般情況下,在使用SPI的TouchGFX Generator中選擇“Custom”顯示介面時,創建TouchGFX驅動程式所包含的步驟。 其步驟與缺少嵌入式顯示控制器的MCU顯示介面的相同。

在STM32CubeMX中配置SPI外設後,可以使用TouchGFX Generator生成HAL,生成時使用“custom”顯示介面,以便開發者使用自己編寫的專屬驅動將影像緩衝的更新部分傳輸到連接的顯示器。 圖X顯示了TouchGFX Generator的配置,在其中選擇custom顯示介面,以便用生成的程式碼支援影像緩衝更新部分向顯示器的傳輸。

專案設置

通常,對於自帶GRAM的顯示器(如8080或SPI介面顯示器),驅動程式的結構如下:

  1. 根據要重繪的影像緩存區域,將“顯示游標”移動到GRAM中與此對應的位置。
  2. 準備將傳入的像素資料寫入GRAM。
  3. 發送像素資料。

傳輸影像緩衝

在影像緩存內容被更新後,TouchGFX Engine會呼叫HAL::flushFrameBuffer

響應來自TouchGFX Engine的信號 (S?)。

void  TouchGFXHAL::flushFrameBuffer(const Rect& rect)
{
/* Set Cursor */
__ST7789H2_SetDisplayWindow(rect.x, rect.y, rect.width, rect.height);

/* Prepare to write to LCD RAM */
ST7789H2_WriteReg(ST7789H2_WRITE_RAM, (uint8_t*)NULL, 0);

/* Send Pixels */
this->copyFrameBufferBlockToLCD(rect);
}

以下__ST7789H2_SetDisplayWindow函數用以寫入特定暫存器來設定GRAM中虛擬「游標」的xy座標,對於使用GRAM來說這很常見的用法。

extern "C"
void __ST7789H2_SetDisplayWindow(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
{
uint8_t parameter[4];

/* CASET: Column Address Set */
parameter[0] = 0x00;
parameter[1] = Xpos;
parameter[2] = 0x00;
parameter[3] = Xpos + Width - 1;
ST7789H2_WriteReg(ST7789H2_CASET, parameter, 4);

/* RASET: Row Address Set */
parameter[0] = 0x00;
parameter[1] = Ypos;
parameter[2] = 0x00;
parameter[3] = Ypos + Height - 1;
ST7789H2_WriteReg(ST7789H2_RASET, parameter, 4);
}

以下TouchGFXHAL::copyFrameBufferBlockToLCD函數是一個私有函數,該函數一次發送一行更新過的區域(Rect),並更新相應的影像緩衝區指標。

void TouchGFXHAL::copyFrameBufferBlockToLCD(const Rect rect)
{
__IO uint16_t* ptr;
uint32_t height;

// Use default implementation (CPU copy!).
// This can be accelerated using regular DMA hardware
for (height = 0; height < rect.height ; height++)
{
ptr = getClientFrameBuffer() + rect.x + (height + rect.y) * BSP_LCD_GetXSize();
LCD_IO_WriteMultipleData((uint16_t*)ptr, rect.width);
}
}

flushFrameBuffer返回

在函數返回後,TouchGFX Engine返回。 如果開發者想要使用DMA執行這些傳輸,則必須通過等待DMA完成中斷發送的信號標來確保HAL::flushFrameBuffer(Rect& rect)不返回。