單片機低代碼交互UI制作 - LVGL+Squareline+Arduino平臺 學習記錄(1)

TFT-eSPI的安裝和配置

在LVGL項目中TFT-eSPI才是實際控制屏幕顯示的庫,網(wǎng)上能找到很多應用教程,在這里重寫只是為了從零開始的連貫性,會用的可以略過,我寫的不一定有人家的詳細,畢竟我只要實用,LVGL也并未使用它太多的功能。
Arduino IDE 自2.0 之后改版很大,最大的特點就是輸入中文注釋時CPU占用率會飆升,然后自動補全會崩潰。。。
在寫這篇時我的IDE版本為2.1.0,不用再去自己下載庫文件,然后拷貝進庫文件夾了,直接在左側(cè)搜索安裝就行,嗯。。。該掛梯子的還得掛梯子。。。實在下不下來的按著之前版本的拷貝文件吧。
搜索tft_espi,大小寫無所謂,但注意是下劃線,輸錯了要么找不到,要么就得往下刨。
官方庫鏈接:https://github.com/Bodmer/TFT_eSPI

一般默認是最高版本,直接點安裝就行。
下面找到Arduino的庫文件夾找到TFT-eSPI庫:文件 -> 首選項
(建議給庫這個文件夾設個快捷方式,用的會比較多)

在libraries文件夾下的TFT_eSPI,例如:
C:\Users\Administrator\Documents\Arduino\libraries\TFT_eSPI
補充下ESP32的開發(fā)板地址,網(wǎng)上好多文章的都失效了:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

TFT-eSPI庫需要修改兩個文件:User_Setup_Select.h?和 對應屏幕驅(qū)動的文件
前者選擇主控型號和屏幕驅(qū)動,后者更改引腳,在此我對User_Setup_Select.h進行些翻譯和注釋的修改。

User_Setup_Select.h在改之前最好是建一個副本,省的改亂了后面還得重下。
注釋掉30行

由于我使用的是ESP32-C3,屏幕驅(qū)動芯片型號為ILI9341,所以開啟第98行

注意:這是SPI通信的,不是并口。(話說第99行文件名標識了并口,但注釋寫的卻是SPI)
真的挺亂的,雖然98行標識的是ILI9341,但包含了ILI9341、ST7796、ILI9488三個型號的屏幕驅(qū)動芯片,所以User_Setup_Select.h里找不到的不一定沒有,如果沒找到,從主控對應的文件進去多看看,不一定不支持。
接著上面,下一步改引腳,98行的對應文件在User_Setups文件夾下,例如:
C:\Users\Administrator\Documents\Arduino\libraries\TFT_eSPI\User_Setups\Setup70c_ESP32_C3_ILI9341.h
ESP32-C3是支持IO矩陣的,所以并不一定SPI對應的引腳必須是標明的引腳,可以隨意搞,不過盡量還是用對應的,記得手冊有說IO矩陣有頻率限制,通常也用不到那么高,特殊需求的注意下就OK了。
改引腳沒什么可說的,CS、MOSI(主出從進)、MISO(主進從出)、SCLK、DC、RST、TOUCH_CS,這幾個換成自己的,如果沒有觸摸功能,注釋掉TOUCH_CS就可以了。
注意:這里支持的觸摸是電阻觸摸,電容觸摸的需要自己搞。
引腳設置對應到我的板子上:

SPI的頻率用默認最大的就行,如果是線連不穩(wěn)定,可以嘗試改小,不同的主控和屏幕驅(qū)動芯片SPI最大頻率支持也不一樣,需要查手冊。
保存更改的兩個文件,打開Arduino IDE,找到如下圖所示的觸摸校準例程:

開發(fā)板選擇ESP32C3 Dev Module,目前已經(jīng)支持直接下載,不需要加TTL轉(zhuǎn)串口芯片,選擇9.9的簡配版模塊就行。

下面的配置需要改三項:
1、默認的Flash Mode應該是QIO,合宙為了節(jié)省C3本就不多的IO,F(xiàn)lash使用的是DIO。
2、Flash Size按實際改,默認應該是4MB,換過Flash的需要改成自己的。
3、Partition Scheme 分區(qū)表,就是把外置的Flash內(nèi)部的空間有多少放程序,有多少劃歸文件系統(tǒng),默認的就這幾個,APP是程序,SPIFFS/FATFS是不同的文件系統(tǒng)格式,Squareline將圖片、字庫生成為了.h文件,所以是程序的一部分,若默認的分區(qū)表APP空間不夠的話,就需要自己添加分區(qū)表了,這個后面單開一篇講,這篇是講TFT-eSPI的。

在下載之前需要注意一個地方,觸摸校準程序的第24行

這個是屏幕的顯示方向,需要和實際想要的顯示方向一致,否側(cè)輸出的校準參數(shù)會與實際不一致,導致的現(xiàn)象也就是觸摸不準。
0 (默認0度方向)、1(順時針90度)、2(順180度)、3(順270度),通常是這樣的,并且通常屏幕排線沖下擺放時為0。
這就可以下載了?
?
如果你用的是帶TTL轉(zhuǎn)串口的ESP32-C3確實可以了,上傳后打開Arduino IDE自帶的串口助手,波特率115200。按屏幕上指示觸摸4個角(圖示屏幕方向為1),完成后會輸出一串下圖所示的代碼,這便是校準的參數(shù)值,記下它?。。?/p>
如果使用的是簡約版不帶TTL轉(zhuǎn)串口芯片的板子,還需要開啟下圖所示的USB CDC,此時使用Serial輸出的數(shù)據(jù)便可以顯示。

或者不嫌麻煩的可以改下代碼,把數(shù)據(jù)顯示在屏幕上。
得到串口輸出的觸摸校準參數(shù),TFT-eSPI這一塊就結(jié)束了,LVGL不需要TFT-eSPI的其它功能,只是把它作為了一個屏幕顯示的工具,畢竟主控種類、屏幕驅(qū)動種類太多了,適配起來也太麻煩,不如直接用人家的。
重要的事說三遍。
記下那串代碼?。。?/p>
記下那串代碼?。?!
記下那串代碼?。?!
嗯。。。
記下了嗎?
其實也沒那么重要,我在后面把校準這一塊單獨拿出來了,數(shù)據(jù)自動存儲在EEPROM(掉電存儲)中,如果檢測到存儲中有數(shù)據(jù)則自動加載,沒數(shù)據(jù)則在運行前啟動屏幕校準并存儲。
畢竟要是每次都這么搞,下過來下過去的太麻煩了,拷貝代碼不省事嗎?

最后說個不重要的東西,ESP32-C3編譯使用了TFT-eSPI的程序時會報一個DMA的警告,C3沒有DMA,這個警告是正常的,忽略即可。
既然說到這了,簡述下DMA是什么。
DMA (Direct Memory Access) 是一種硬件機制,可以讓外設直接訪問系統(tǒng)內(nèi)存,而不需要通過 CPU 的干預。這樣可以大大減輕 CPU 的負擔,提高系統(tǒng)的效率。
ESP32 的 DMA 功能,可以讓外設(比如 SPI、I2S、UART、ADC、DAC 等)直接訪問系統(tǒng)內(nèi)存,而不需要 CPU 的干預??梢源蟠筇岣邤?shù)據(jù)傳輸?shù)乃俣群托省M瑫r,ESP32 的 DMA 還支持多種傳輸模式,包括單次傳輸、循環(huán)傳輸、鏈式傳輸?shù)?,可以滿足不同應用場景的需求。
附圖:TFT-eSPI顯示圖片(TFT的可視角度真的腦瓜疼)
