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