Arduino esp32移植LVGL
關(guān)于lvgl 移植到SPI觸摸屏,網(wǎng)上有很多教程,但都只提到了顯示部分。對于觸屏部分都沒有寫清楚。對于小白來說還是不明不白。買了這塊屏后,從接線開始,研究了研究了一天,終于遷移成功了,寫個總結(jié)。
硬件:普中esp32開發(fā)板、SPI觸摸屏幕240*320



軟件:Ardunio IDE, LVGL v8.3.8, TFT_eSPI
第一步:下載依賴包
下載LVGL依賴包,直接用IDE的包管理工具安裝即可。如果因為網(wǎng)絡問題無法安裝,可到github上直接下載源碼,復制到libraries 目錄下。(注意:lvgl的master分支是9.0開發(fā)版本,語法跟V8大不相同,但是全部文檔和示例都是V8的,因此需要下載V8.3的源碼)
官方示例用的驅(qū)動是TFT_eSPI,所以還要下載TFT_eSP驅(qū)動包。方法同上。這個對版本沒有要求,這次使用的是v2.5.31。
第二步:選擇驅(qū)動
打開TFT_eSPI目目錄下的User_Setup_Select.h 文件,選擇對應的驅(qū)動頭文件,取消對應行的注釋,注釋默認的行我這里選的是Setup42_ILI9341_ESP32.h
注意,只能選擇一個驅(qū)動
點擊剛剛選中的頭文件,IDE會直接跳轉(zhuǎn)到對應文件,文件對引腳的定義如下:
引腳5是觸屏輸入,默認不開啟,我們之后會用到,先把這一行注釋取消
我們先測試一下屏幕能不能正常顯示。
按照上面引腳定義,把對應的引腳接上線。(TOUCH_CS 5 可以先不接)。屏幕上有字,對照接線即可。此外,還要接上電源(VCC,GND)和LED背光。我們沒有對LED進行控制,直接接到3.3V電源
打開TFT_eSPI的examples\320 x 240\TFT_Clock, 打開TFT_Clock.ino 文件,編譯上傳到開發(fā)板。在屏幕上看到一個時鐘,說明運行正常。(Ardunio IDE可以快速打開示例,請自己摸索)。
第三步:移植LVGL。
打開LVGL文件夾。復制lv_conf_template.h 到LVGL同級目錄下,重命名為lv_conf.h,
最終目錄結(jié)構(gòu)如下:

修改lv_conf.h文件,把第一個#if改為1:
然后根據(jù)屏幕修改顏色屬性,我的是16,不知道的話就默認值就好
復制官方lvgl\examples\arduino\LVGL_Arduino目錄下的LVGL_Arduino.ino 到項目目錄。然后修改文件,把行和高改成屏幕的行和高。(這個示例代碼只需要改這一點就能用,下面的代碼大部分只作分析,不需要修改)
在setup里初始化屏幕,官方代碼如下:
flush_cb是一個回調(diào)函數(shù),具體作用官方解釋是把緩存寫到屏幕上。具體怎么寫,由用戶自定義
官方實現(xiàn)代碼如下,本質(zhì)就是把lvgl的像素畫到實際屏幕上,注意最后一句,每次寫完后要通知lvgl
取消以下代碼的注釋:
編譯上傳到開發(fā)板。在屏幕正中央顯示
Hello Ardino and LVGL!?
說明移植成功。具體的實現(xiàn)可以看實例程序。如果編譯時報函數(shù)沒有定義錯誤,多半是版本問題。更換LVGL版本試試。
如果編譯上傳成功,屏幕一片空白,檢查引腳是否接對。
到這一步屏幕能顯示內(nèi)容了,但還不能觸摸,接下來實現(xiàn)觸摸功能。
第四步:觸屏功能實現(xiàn)
1首先回到引腳定義文件:
可見對于touch的引腳定義只有一個。但是屏幕上的引腳有5個,這要怎么接?這就涉及spi協(xié)議的規(guī)定,這里不細入。簡單來說,多個設(shè)備可以共用同一個引腳,把觸摸屏看成顯示和輸入兩個設(shè)備,共用部分引腳。
一個主設(shè)備和多個從設(shè)備的SCK、MISO、MOSI,是共享線路的,而CS引腳在這里就起到了重要的作用。它能夠讓主設(shè)備選擇某一時刻與哪一個從設(shè)備進行通信。因此我們只需要將主設(shè)備的SCK、MISO、MOSI引腳引出,然后將多個從設(shè)備的SCK、MISO、MOSI引腳分別接在引出的三條對應的線路上,最后通過程序設(shè)置CS引腳來分時的選通從設(shè)備,就可以在這里實現(xiàn)對觸摸顯示屏的正常驅(qū)動。
另外根據(jù)我們引腳定義的第一行說明(leave TFT SDO disconnected if other SPI devices share MISO) ,顯示MISO 接口是不需要接的。所以只要共享SCK,MOSI 兩個引腳即可

注:一個引腳接兩個接口用面包板或直接讓兩個接口短路即可。
2、接下來移植lvgl。還是剛剛那個程序,下面這段代碼是定義輸入設(shè)備
my_touchpad_read 是一個自定義函數(shù),把輸入設(shè)備上的信息給到lvgl。具體實現(xiàn)官方源碼
我們抄一個簡單的按鍵demo試一下:定義一個button,按下去就改變文字
定義回調(diào)函數(shù):
注釋掉剛剛的測試代碼,在后面添加:
編譯上傳,屏幕上可以正常顯示一個button。點一下,沒有反應。這是怎么回事?
一開始按網(wǎng)上教程做到這一步我也懵了,還以為是屏幕壞了,單獨跑eSPI的觸屏檢測程序,結(jié)果正常。
到LVGL官網(wǎng),看看官方怎么說。
https://docs.lvgl.io/master/get-started/platforms/arduino.html

注意說明 5. Set LV_TICK_CUSTOM
?打開配置文件lv_conf.h,找到 LV_TICK_CUSTOM
使用自定義時鐘源,不需要使用`lv_tick_inc()手動更新。也就是說要把ardunio的時鐘信號給加上。改一下配置,啟用arduino的時鐘信號:
保存后再次編譯上傳,成功。
這個配置很重要,網(wǎng)上很多 教程都沒提到。
這篇是我的實踐,做個筆記,供大家參考吧。