1.引言
越來越多的智能設(shè)備會在 MCU 上實現(xiàn)圖形界面,而 TouchGFX 是專門用于 ST MCU上的圖形界面設(shè)計軟件,使圖形界面在 MCU 上能達(dá)到類似智能手機的顯示效果。TouchGFX 圖形引擎包括三部分:搜集、更新、渲染。其中在搜集階段,圖形引擎從外部環(huán)境收集事件,這些事件通常是觸摸和按鈕事件。TouchGFX 采樣并將事件傳遞到應(yīng)用程序,這樣原始觸摸動作就被轉(zhuǎn)換為更具體的應(yīng)用程序的觸摸事件。例如,點擊(用戶在顯示屏上按下或松開手指)、拖動(用戶觸摸顯示屏并在顯示屏上移動手指)、手勢(用戶向一個方向快速移動手指,然后松開)等功能,這些操作都會被圖形引擎識別并轉(zhuǎn)發(fā)給當(dāng)前活動的 UI 元素。
本文主要介紹 TouchGFX 從顯示器的觸摸控制器讀取觸摸坐標(biāo),并將其傳遞給應(yīng)用程序的方法及原理,使開發(fā)者能夠很容易的在 TouchGFX 生成的代碼中添加觸摸功能。
2.TouchGFX 抽象層架構(gòu)
TouchGFX 引擎通過 實例化了的HAL子類來訪問 HAL。這些子類由 TouchGFX Generator生成,Generator 是創(chuàng)建抽象層的主要工具,可以生成反映 STM32CubeMX 配置的 HAL 部分,以及 CMSIS V1 或 V2 的 OSAL。通常 HAL 的架構(gòu)如下圖 1 所示。
TouchGFX 抽象層(Abstraction Layer,簡稱 AL)具有一套特殊的職責(zé), 職責(zé)要么在AL (HAL)的硬件部分實現(xiàn),要么在與 TouchGFX Engine 同步的 AL 部分實現(xiàn),典型的做法是通過 RTOS (OSAL)來實現(xiàn)。圖 2 總結(jié)了 TouchGFX AL 的主要職責(zé),其中有一項任務(wù)就是報告觸摸與物理按鈕事件,TouchGFX 將原始觸摸動作轉(zhuǎn)換為具體的觸摸事件,并轉(zhuǎn)發(fā)給當(dāng)前活動的 UI 元素。
3.觸摸功能實現(xiàn)步驟
要實現(xiàn)觸摸功能,首先需通過 STM32CubeMX 正確配置觸摸控制器和 MCU,并添加相應(yīng)驅(qū)動代碼,保證 MCU 通過 I2C 或其他接口從觸摸控制器讀取信息,最后在TouchController 接口函數(shù)中添加相應(yīng)的實現(xiàn)代碼。
3.1. STM32CubeMX 配置
為了實現(xiàn)與觸摸控制器的通訊,大多數(shù)觸摸控制器都會連接至 I2C 總線,因此需要在STM32CubeMX 中對 I2C 外設(shè)進行設(shè)置。許多 STM32 MCU 具有多個 I2C 外設(shè),因此需選擇正確的 I2C 進行配置,此外還需配置相關(guān) GPIO,圖 3 是 I2C 在 STM32CubeMX 中的配置界面,開發(fā)者需要根據(jù)觸摸控制器驅(qū)動芯片進行正確配置。
配置好 I2C 后,還需添加 I2C 的驅(qū)動代碼,如果沒有用于觸摸控制器的驅(qū)動代碼,則需要從頭開始編寫。STM32Cube 固件庫中提供了一些 I2C 通訊的驅(qū)動程序,開發(fā)者可以從中參考相關(guān)代碼進行修改使用。根據(jù)觸摸控制器的數(shù)據(jù)手冊,為確保通過讀取寄存器可以獲取觸摸坐標(biāo),首先要檢查的是觸摸控制器的 I2C 地址,然后讀取“設(shè)備 ID”寄存器,以進行測試,然后測試是否可以從觸摸控制器接收到正確的 x 值和 y 值。
3.2. 在接口函數(shù)中添加實現(xiàn)代碼
在渲染新的一幀之前,TouchGFX 引擎從 TouchController 和 ButtonController 接口收集外部輸入。通過引擎將觸摸控制器的坐標(biāo)轉(zhuǎn)換為點擊、拖動和手勢事件,并傳遞至應(yīng)用程序。一些觸摸控制器能夠報告多個觸摸點,TouchGFX 不支持此功能,通常,只需選擇第一個觸摸點。
TouchGFX 引擎在收集輸入時,引擎會調(diào)用 tc 對象的 sampleTouch()函數(shù)。TouchGFX Generator 會生成一個 TouchController 類,并將接口函數(shù)定義為空。在STM32TouchController.hpp 中會聲明了 init()和 sampleTouch()兩個成員函數(shù),開發(fā)者需要做的就是在 STM32TouchController.cpp 源文件中添加相應(yīng)的實現(xiàn)代碼,在 init()函數(shù)中添加觸摸控制器的初始化代碼,在 sampleTouch()函數(shù)中添加相應(yīng)實現(xiàn)代碼,將讀取的觸摸坐標(biāo)值分配給 x 和 y,并返回是否檢測到觸摸。
其中有多種實現(xiàn) sampleTouch()函數(shù)的方法:一種是在 sampleTouch()中輪詢,另一種是基于中斷實現(xiàn)。在 sampleTouch() 中輪詢:通過發(fā)送請求并輪詢結(jié)果,從硬件觸摸控制器(通常為 I2C) 讀取觸摸狀態(tài)和觸摸坐標(biāo),默認(rèn)情況下,該函數(shù)每個 tick 時間被調(diào)用一次, 如下圖 5 所示。
基于中斷:I2C 讀取命令由定時器定期啟動,或作為對觸摸硬件外部中斷的響應(yīng)而啟動。圖 6 中 STM32TouchController.cpp 代碼顯示了 sampleTouch 如何在 RTOS 的系統(tǒng)中實現(xiàn)。當(dāng)觸摸事件產(chǎn)生時,I2C 會產(chǎn)生中斷,并將數(shù)據(jù)通過消息隊列或全局變量提供給STM32TouchController。
小結(jié)
本文介紹了 TouchGFX 從顯示器的觸摸控制器讀取觸摸坐標(biāo),并將其傳遞給應(yīng)用程序的方法及原理。通過 STM32CubeMX 來初始化 I2C 外設(shè),添加相應(yīng)的驅(qū)動代碼,然后在STM32TouchController.cpp 源文件中實現(xiàn) init()和 sampleTouch()函數(shù),開發(fā)者就能夠很容易的為 TouchGFX 工程添加觸摸功能。
來源:STM32單片機
免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問題,請聯(lián)系小編進行處理
審核編輯 黃宇
-
TouchGFX
+關(guān)注
關(guān)注
1文章
42瀏覽量
13196 -
HAL
+關(guān)注
關(guān)注
2文章
69瀏覽量
12576
發(fā)布評論請先 登錄
相關(guān)推薦
評論