前言
我們?cè)谏掀幸呀?jīng)實(shí)現(xiàn)了模擬器環(huán)境下可變字體字重的設(shè)置.
是時(shí)候掏出你吃灰已久的ESP32了.
本文會(huì)使用PlatformIO創(chuàng)建一個(gè)全新的項(xiàng)目,直到顯示出現(xiàn)上篇文章末尾的動(dòng)圖為止.
如遇到問題,可參考'常見問題'內(nèi)解答.
準(zhǔn)備工作
軟件準(zhǔn)備
為了后續(xù)內(nèi)容順利進(jìn)行下去,這里需要你安裝好VSCode,并在VSCode上安裝PlatformIO插件.
硬件準(zhǔn)備
名稱 | 數(shù)量 | 備注 | 圖例 |
---|---|---|---|
ESP32 開發(fā)板 | 1 | ESP32 | |
1.54寸LCD | 1 | 驅(qū)動(dòng)ST7789,分辨率240x240 | LCD |
杜邦線若干 | N | wires |
創(chuàng)建項(xiàng)目
使用PlatformIO創(chuàng)建一個(gè)名為lvgl_with_freetype的項(xiàng)目
create project
創(chuàng)建完畢后目錄結(jié)構(gòu)如下:
. ├── include │ └── README ├── lib │ └── README ├── platformio.ini ├── src │ └── main.cpp └── test └── README
點(diǎn)亮屏幕
由于已經(jīng)寫過一篇點(diǎn)亮屏幕的文章,故本文不做過多贅述,只說明一下區(qū)別.
之前的屏幕分辨率是135x240,這次的屏幕分辨率是240x240.
所以需要使用TFT_eSPI里面的Setup24_ST7789.h
同時(shí)接線變更為
ESP32引腳名稱 | 液晶屏引腳名稱 |
---|---|
VCC | VCC |
GND | GND |
G23 | SDA |
G18 | SCL |
G2 | DC |
G4 | RES |
GND | CS |
VCC | BLK |
對(duì)應(yīng)Setup24_ST7789.h里面內(nèi)容
#define TFT_MISO 19#define TFT_MOSI 23#define TFT_SCLK 18#define TFT_CS -1#define TFT_DC 2#define TFT_RST 4
隨便寫點(diǎn)內(nèi)容.測(cè)試下屏幕的點(diǎn)亮.
#include Serial.begin(115200); // Set to a high rate for fast image transfer to a PC tft.init(); tft.setRotation(0); tft.fillScreen(TFT_BLACK);}void loop() { tft.print('Ready Perfectly');} lcd_ready_perfect 屏幕點(diǎn)亮以后,就可以開始移植LVGL了. 當(dāng)前時(shí)間為2021.12.19,GitHub上LVGL最新版本是8.1.1-dev 使用命令 獲取LVGL后將其復(fù)制到lib文件夾下.此時(shí)文件目錄為 platformio.ini文件內(nèi)容 創(chuàng)建LVGL的配置文件,找到lvgl文件夾內(nèi)的lv_conf_templat.h,復(fù)制一份lv_conf_templat.h并重命名為lv_conf.h,然后打開lv_conf.h 為了使配置文件內(nèi)容生效,找到第15行(其他版本的lvgl行數(shù)可能不在這里,需要自行尋找) 改為 找到第30行,修改顏色順序 改為 找到第49行,啟用自定義內(nèi)存管理 修改為 找到第88行,設(shè)置自定義周期函數(shù) 修改為 找到第174行,啟用LVGL日志功能 修改為 按照目錄 創(chuàng)建lv_port_disp.cpp和lv_port_disp.h #ifndef LV_PORT_DISP_H_#define LV_PORT_DISP_H_#include 'TFT_eSPI.h'#include 'lvgl.h'#define DISP_HOR_RES 240#define DISP_VER_RES 240#define DISP_BUF_SIZE (DISP_HOR_RES*DISP_VER_RES/4)extern TaskHandle_t handleTaskLvgl;void Port_Init();void lv_port_disp_init(TFT_eSPI* scr);#endif{% endcodeblock %}{% codeblock 'lv_port_disp.cpp' lang:cpp%}#include 'lv_port_disp.h'// 用于初始化完畢后啟用LVGL顯示的TaskHandle_tTaskHandle_t handleTaskLvgl;// lvgl顯示驅(qū)動(dòng)static lv_disp_drv_t disp_drv;// lvgl更新任務(wù)void TaskLvglUpdate(void* parameter) { // 阻塞在此處,直到xTaskNotifyGive ulTaskNotifyTake(pdTRUE, portMAX_DELAY); for (;;) { lv_task_handler(); delay(5); }}/** * @brief 顯示初始化 * @param 無 * @retval 無 */void Port_Init() { static TFT_eSPI screen; /* 屏幕初始化 */ screen.begin(); screen.initDMA(true); screen.setRotation(0); screen.fillScreen(TFT_BLACK); /* lvgl初始化 */ lv_init(); lv_port_disp_init(&screen); printf('lvInitDonen'); // 在核心2上執(zhí)行LVGL xTaskCreatePinnedToCore(TaskLvglUpdate, 'LvglThread', 20480, nullptr, configMAX_PRIORITIES, &handleTaskLvgl, 1);}/** * @brief 自定義打印函數(shù) * @param 無 * @retval 無 */void my_print(lv_log_level_t level, const char *file, uint32_t line, const char *fun, const char *dsc) { Serial.printf('%s@%d %s->%srn', file, line, fun, dsc); Serial.flush();}/** * @brief 屏幕刷新回調(diào)函數(shù) * @param disp:屏幕驅(qū)動(dòng)地址 * @param area:刷新區(qū)域 * @param color_p:刷新緩沖區(qū)地址 * @retval 無 */static void disp_flush_cb(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p) { TFT_eSPI *screen = (TFT_eSPI *)disp->user_data; int32_t w = (area->x2 - area->x1 + 1); int32_t h = (area->y2 - area->y1 + 1); screen->startWrite(); screen->setAddrWindow(area->x1, area->y1, w, h); screen->pushPixelsDMA((uint16_t *)(&color_p->full), w * h); screen->endWrite(); lv_disp_flush_ready(disp);}/** * @brief 屏幕初始化 * @param 無 * @retval 無 */void lv_port_disp_init(TFT_eSPI* scr) { lv_log_register_print_cb(reinterpret_cast my_print)); /* register print function for debugging */ DMA_ATTR static lv_color_t *lv_disp_buf = static_cast DISP_BUF_SIZE * sizeof(lv_color_t), MALLOC_CAP_DMA)); static lv_disp_draw_buf_t disp_buf; lv_disp_draw_buf_init(&disp_buf, lv_disp_buf, nullptr, DISP_BUF_SIZE); /*Initialize the display*/ lv_disp_drv_init(&disp_drv); disp_drv.hor_res = DISP_HOR_RES; disp_drv.ver_res = DISP_VER_RES; disp_drv.flush_cb = disp_flush_cb; disp_drv.draw_buf = &disp_buf; disp_drv.user_data = scr; lv_disp_drv_register(&disp_drv);}{% endcodeblock %}再寫個(gè)簡(jiǎn)單例子測(cè)試下LVGL能不能運(yùn)行{% codeblock 'main.cpp' lang:cpp%}#include Serial.begin(115200); // Set to a high rate for fast image transfer to a PC Port_Init(); lv_obj_t *label = lv_label_create(lv_scr_act()); lv_label_set_text(label, 'Toou.nAnata wa watashi no masuta ka?'); // 一切就緒, 啟動(dòng)LVGL任務(wù) xTaskNotifyGive(handleTaskLvgl);}void loop() {} Toou.Anata wa watashi no masuta ka? lvgl_ready_perfect 施工中,待更新 常見問題 Q:點(diǎn)亮屏幕時(shí)候,編譯器報(bào)找不到TFT_eSPI A:檢查TFT_eSPI是否集成 將TFT_eSPI放置在lib文件夾內(nèi),并向platformio.ini文件末尾添加 lib_extra_dirs = lib/TFT_eSPI Q:在移植LVGL時(shí)候,屏幕顏色異常 A:可能與lv_conf.h文件內(nèi)#define LV_COLOR_16_SWAP 0有關(guān) 可以嘗試將此處的0改成1,或1改回0 環(huán)境: Espressif 32 (3.4.0) > ESP32 Pico Kit framework-arduinoespressif32 3.10006.210326 (1.0.6)tool-esptoolpy 1.30100.210531 (3.1.0)toolchain-xtensa32 2.50200.97 (5.2.0) esptool.py v3.1 參考資料 https://github.com/lvgl/lvgl https://github.com/peng-zhihui/Peak移植LVGL
git clone https://github.com/lvgl/lvgl.git
.
├── include
│ └── README
├── lib
│ └── README
│ └── lvgl
│ └── TFT_eSPI
├── platformio.ini
├── src
│ └── main.cpp
└── test
└── README
[env:pico32]
platform = espressif32
board = pico32
framework = arduino
monitor_speed = 115200
lib_extra_dirs =
lib/TFT_eSPI
lib/lvgl
修改LVGL配置文件
#if 0 /*Set it to '1' to enable content*/
#if 1 /*Set it to '1' to enable content*/
#define LV_COLOR_16_SWAP 0
#define LV_COLOR_16_SWAP 1
#define LV_MEM_CUSTOM 0
#define LV_MEM_CUSTOM 1
#define LV_TICK_CUSTOM 0
#define LV_TICK_CUSTOM 1
#define LV_USE_LOG 1
#define LV_USE_LOG 1
對(duì)接LVGL和TFT_eSPI
.
├── include
│ └── README
├── lib
│ └── README
│ └── lvgl
│ └── TFT_eSPI
├── platformio.ini
├── src
│ └── main.cpp
│ └── Port
│ └── lv_port_disp.cpp
│ └── lv_port_disp.h
└── test
└── README
上一篇:使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
下一篇:如何讓ESP32支持analogWrite函數(shù)
推薦閱讀最新更新時(shí)間:2025-06-23 11:48

設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- Microchip 升級(jí)數(shù)字信號(hào)控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測(cè)試
- STM32RCT6
- 使用 Seeed Technology Co.,Ltd 的 XVF3000-TQ128-C 的參考設(shè)計(jì)
- SP691A,用于便攜式 SP691A/693A 微處理器電源監(jiān)控的評(píng)估套件
- IS31AP4991 1.2W AB類音頻功率放大器的典型應(yīng)用(單端輸入)
- 485toCAN_motor_controller
- LT1308ACS8 SEPIC(單端初級(jí)電感轉(zhuǎn)換器)的典型應(yīng)用電路將 3V 至 10V 輸入轉(zhuǎn)換為 5V/500mA 穩(wěn)壓輸出
- 溫控器
- 帶有四路降壓穩(wěn)壓器、監(jiān)控電路和 I2C 接口的 ADP5051 集成電源解決方案的典型應(yīng)用電路
- air_inspector
- EVAL-ADCMP551BRQ,具有 ADCMP551、雙高速 PECL 比較器的評(píng)估板,采用 16 引腳 QSOP
- uboot 替代 eboot 燒寫、啟動(dòng) wince
- 自制動(dòng)電動(dòng)機(jī)的結(jié)構(gòu)特點(diǎn)和制動(dòng)原理
- 進(jìn)一步降低RISC-V芯片的門檻,西部數(shù)據(jù)核心開源
- PLC使用脈沖方式控制伺服電機(jī)
- ADI收購(gòu)Maxim獲中國(guó)國(guó)家市場(chǎng)監(jiān)督管理總局反壟斷許可
- 面向ISO7637的12V車載電源浪涌防護(hù)方案
- iQOO U5提前上架:搭高通驍龍695、5000mAh電池、120Hz屏
- 使用萬用表測(cè)試電腦電源好壞的方法
- 芯片工程師,是時(shí)候了解GAA晶體管了
- 南芯科技推出高集成度多口移動(dòng)電源解決方案,助力充電寶市場(chǎng)穩(wěn)健發(fā)展
- 英飛凌推出具有超低導(dǎo)通電阻的CoolSiC? MOSFET 750 V G2,適用于汽車和工業(yè)功率電子應(yīng)用
- DigiKey 慶祝 B 站賬號(hào)粉絲突破 10 萬,贈(zèng)送驚喜禮包
- 碳化硅企業(yè) Wolfspeed 啟動(dòng)破產(chǎn)重組,預(yù)計(jì) 2025 年三季度末完成司法重整
- 蘋果被曝考慮放棄自研模型 轉(zhuǎn)而與Anthropic或OpenAI合作
- ?百度文心4.5來襲!英特爾Day0即支持端側(cè)部署
- 【廣瀨電機(jī)】關(guān)于中國(guó)發(fā)明專利侵權(quán)訴訟達(dá)成和解的公告
- 英飛凌BMS解決方案推動(dòng)電動(dòng)汽車創(chuàng)新
- 地平線的L3判斷與實(shí)踐路徑
- 汽車網(wǎng)絡(luò)升級(jí)攻略:CAN-CAN FD-車載以太網(wǎng)
- 感受工業(yè)4.0精益生產(chǎn) 全面展示十大工藝
- CHAdeMO與中國(guó)共同制定新標(biāo)準(zhǔn)即將落地
- 央視:汽車產(chǎn)業(yè)迎來變革,日本或率先普及氫燃料電池汽車
- 歐洲電池逆襲日韓和中國(guó),勝算幾何?
- 解析大陸集團(tuán)的自動(dòng)駕駛技術(shù)創(chuàng)新布局
- MSP430G2553的引腳功能詳細(xì)圖解
- keil寫STM32程序出現(xiàn)literal treated as "long long"
- STM32 變量無法賦值問題
- fatfs文件系統(tǒng)f_lseek追加文件
- stm32 堆和棧(stm32 Heap & Stack)
- 2通道的雜波這么多是什么原因?
- 哥今天估計(jì)被忽悠了
- 基于CPLD的LCD接口設(shè)計(jì)
- 塑封料發(fā)展?fàn)顩r及其工藝選擇
- 修身養(yǎng)性,為人處事100條
- 智能手機(jī)的操作系統(tǒng),哪個(gè)比較人性化?
- WinCE6.0修改.cpl文件屬性
- 基于AT89C52單片機(jī)的平板硫化機(jī)測(cè)控系統(tǒng)的抗干擾設(shè)計(jì)和研究
- IAR5.XX關(guān)于實(shí)時(shí)查看變量變化的功能
- 一種簡(jiǎn)易高精度頻率信號(hào)發(fā)生器的設(shè)計(jì)與實(shí)現(xiàn)