跳轉到主要內容

9. 觸控控制器

動機

必須能夠從觸控控制器讀取觸控座標,以便使用者與應用程式進行互動。 此處開發的程式碼將被用於以後開發TouchGFX抽象層。

Note
如果您的開發板沒有觸控控制器,請跳過該步。

目標

此步驟的目標是確保從顯示器的觸控控制器可以讀取觸摸座標。

驗證

以下是本節的驗證點:

驗證點基本原理
已設定觸控控制器與MCUMCU必須設定為透過I2C等讀取觸控控制器資訊。
可讀取觸控控制器暫存器TouchGFX抽象層可使用此程式碼從控制器獲取觸控座標。
讀取操作按預期進行輪詢是應用程式渲染算圖時間的一部分。 如果觸控輪詢花費的時間太長,則應將其移至其他執行緒,或產生中斷。

先決條件

  • 帶觸控控制器的顯示器
  • 從觸控控制器讀取資料的驅動程式

執行

此步驟包含兩個元素:基於觸控控制器的通訊需求對MCU進行設定,同時編寫驅動程式實現MCU與觸控控制器的通訊。

大多數觸控控制器連接至I2C匯流排。 I2C通訊在 Connectivity -> I2C1 下的STM32CubeMX中設定。

設定I2C

許多STM32 MCU具有不止一個I2C控制器,因此請選擇一個連接至觸控控制器。 另外,請記得設定相關的GPIO。

如果您沒有用於觸控控制器的驅動程式,則需要從頭開始編寫。 MCU的STM32Cube韌體包含I2C通訊範例。 這些可作為起點。 根據觸摸控制器的資料手冊,確認通過讀取哪些暫存器可以獲取觸控座標。 首先要檢查的是觸摸控制器的I2C位址,然後讀取「設備ID」寄存器,以進行測試。

您需要開發驅動程式確保I2C正常運行,稍後與TouchGFX整合時將用到此函數。 如果有觸控,函數應返回True並提供座標,否則返回False。

以下範例顯示此程式碼的框架,驅動程式碼被函數myTouchController_GetState抽象化:

main.c
    uint16_t x;
uint16_t y;

TouchControllerState state;
if (myTouchController_GetState(&state))
{
x = state.touchY;
y = state.touchX;
//break point here
}

借由除錯器檢查是否可以從觸控控制器接收到正確的x值和y值。

一些觸控控制器能夠報告多個觸控點。 TouchGFX不支援此功能,此處忽略。 通常,您只需選擇第一個接觸點。

"TouchGFX AL開發"文章抽象層解釋了如何將這些值發送至TouchGFX。

性能符合預期

如果觸控程式碼與TouchGFX應用程式在相同的線程中執行,則觸摸採樣可以在1ms內完成。 如果速度不夠快,可考慮在後期將程式碼分為獨立的任務。