跳轉到主要內容

SPI 顯示器介面

本情境說明如何在使用具有 SPI 序列介面和 GRAM 的顯示器時,設定 SPI 以及 TouchGFX Generator

Note
此情境假設在開發板初次啟動階段,已經開發出可用的顯示器驅動程式。 驅動程式必須能夠將像素傳輸到顯示器,並且能夠控制顯示器的記憶體寫入位置。 詳細資訊請查看您的顯示器資料表。

設定

SPI 設定

與其他顯示器介面 (例如 FMC) 相比,SPI 的頻寬較低。 因此,最佳化 SPI 設定至最高鮑率,以達到最大的頻寬非常重要。 在 STM32CubeMX 類別清單中從連線群組啟用 SPI。 建議為 SPI 設定 DMA 通道,以盡可能減少 CPU 負載。 以下範例適用於 64MHz MCU,其 SPI 鮑率上限為 32 MBit/s。

FMC 庫設定

務必確保時脈參數設定與顯示器一致。

TouchGFX Generator

使用 SPI 顯示器介面時,必須在 TouchGFX Generator 中選擇自訂顯示器介面。 這表示無法自動產生完整的 HAL,開發人員必須實作能夠手動設定和將像素從影格緩衝記憶體傳輸到顯示器的功能。 實現此操作所需的所有必要控制指標均由 TouchGFX Generator 產生:

顯示器介面-自訂

DMA 設定

為了盡可能減少 CPU 負載,可以設定 DMA 通道以將像素資料從影像緩衝區傳輸到 SPI TX 位址。

使用者程式碼

一般而言,對於具有嵌入式 GRAM 的顯示器,實作 TouchGFXHAL.cpp 中產生的 TouchGFX HAL 控制指標應執行以下步驟,以將像素傳輸到顯示器並使顯示器與 TouchGFX Engine 同步:

  1. 等待「VSYNC」(有時稱為螢幕撕裂效果 (TE) 訊號) 向 TouchGFX Engine 發出訊號。
  2. 根據要重繪的影像緩衝區區域,將「顯示游標」和「作用中視窗」(正在更新的顯示區域) 移至 GRAM 中與該區域相符的位置。
  3. 準備將傳入的像素資料寫入GRAM。 根據所使用的影像緩衝區策略和顯示器介面,可能是交換影像緩衝區指標、向 TouchGFX Engine 發出訊號,或等待之前的傳輸完成。
  4. 發送像素資料。

根據所使用的顯示器和影像緩衝區策略,上述步驟的實作會有所不同。

支援的影像緩衝區策略

  • 單一
  • 雙重
  • 局部-GRAM 顯示器 (建議)
Further reading
請參閱「影像緩衝區策略」一文有關 TouchGFX 影像緩衝區策略的一般簡介。

由於與其他顯示器介面相比,SPI 實現的頻寬有限,因此建議使用局部-GRAM 顯示器策略。 這種策略的優點是僅需要使用極少 RAM (SPI 通常用於 RAM 有限的簡單系統),並且僅針對包含已更新像素的顯示器啟用傳輸,藉此最佳化可用頻寬的使用。 然而,其存在螢幕撕裂的風險。

透過使用 SPI 的單一緩衝,可避免因長時間渲染而造成的螢幕撕裂。 然而,SPI 的頻寬較低,亦即將像素傳輸到顯示器的速度 通常會比顯示器掃描線讀取 GRAM 緩衝區來得慢。 因此,在下降沿 (當顯示器進入作用中區域時) 開始傳輸 TE 訊號非常重要, 這麼做可避免螢幕撕裂。 看起來可能像這樣:

TouchGFXHAL.cpp
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == LCD_TE_Pin)
{
// VSync 已發生,遞增 TouchGFX 引擎的 vsync 計數器
HAL::getInstance()->vSync();
// VSync 已發生,通知 TouchGFX 引擎
OSWrappers::signalVSync();
GPIO::clear(GPIO::VSYNC_FREQ);

if (refreshRequested)
{
refreshRequested = false;
nextSendToDisplayLine = refreshMinLine;
maxSendToDisplayLine = refreshMaxLine;
sendNextFrameBufferBlockToDisplay();
}
}
}
Note
如果顯示器傳輸頻寬比顯示器掃描線更慢,則必須在 TE 訊號的下降沿啟動傳輸,以避免螢幕撕裂。

透過使用 SPI 的雙重緩衝,可避免因長時間渲染而造成的螢幕撕裂。 然而,如果太多像素傳送到顯示器的每個影格,讀取 GRAM 緩衝區的掃描線可能會因為傳輸頻寬慢, 而與正在傳輸的區域發生衝突,進而導致螢幕撕裂。 為了緩解此問題,可以僅傳輸已更新的像素區域,而不是整個影像緩衝區。 函數 TouchGFXHAL::flushFrameBuffer 可 用於計算每個影格中更新的區域,以定義要傳輸的最小區域。

單一

目前,未有 TouchGFX 開發板支援針對 SPI 的單一緩衝提供參考實作。 其設定類似於 FMC 單一緩衝區設定, 但使用 SPI 驅動程式函數而不是 FMC。

雙重

目前,未有 TouchGFX 開發板支援針對 SPI 的雙重緩衝提供參考實作。 其設定類似於 FMC 雙重緩衝區設定, 但使用 SPI 驅動程式函數而不是 FMC。

局部-GRAM 顯示器

TouchGFX 開發板設定 NUCLEO-G071RB GFX01M2 包括透過 SPI 的局部-GRAM 顯示器的參考實作。 其設定類似於 FMC 局部緩衝區設定, 但使用 SPI 驅動程式函數而不是 FMC: