前言
我們?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)試
下一篇:最后一頁
推薦閱讀最新更新時(shí)間:2025-06-09 11:25

設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 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è)試
- API調(diào)用小記(Touchdesigner和ESP32)
- 關(guān)于ESP32/8266使用async-mqtt-client庫(kù)的一些基本介紹
- arduino環(huán)境下利用ESP32控制舵狗(初始位置的調(diào)試)
- LT1172HVCT、5V/1.25A 正降壓轉(zhuǎn)換器的典型應(yīng)用
- 【訓(xùn)練營(yíng)】四條腿機(jī)器狗
- SG3525A 推挽式脈寬調(diào)制器控制電路的典型應(yīng)用
- LT1108CS8-12掌上電腦邏輯電源微功率DC/DC轉(zhuǎn)換器典型應(yīng)用電路
- AM2M-1515DH30-NZ ±15 Vout、2W 雙路輸出 DC-DC 轉(zhuǎn)換器的典型應(yīng)用
- LTC2945HMS 具有高達(dá) 200V 浪涌保護(hù)的堅(jiān)固型 4V 至 70V 高壓側(cè)功率監(jiān)視器的典型應(yīng)用
- 常用MCU全能燒錄器
- 【航順訓(xùn)練營(yíng)】國(guó)產(chǎn)航順MCU開發(fā)學(xué)習(xí)板
- LTC3624EMSE-25 5V 輸出電壓、2A 同步降壓型穩(wěn)壓器的典型應(yīng)用,具有 1MHz、突發(fā)模式操作
- 具有備用電源監(jiān)控功能的 LTC4420IMSE 18V 雙輸入微電源路徑優(yōu)先器的典型應(yīng)用電路
- 2021軟件百?gòu)?qiáng)企業(yè)前五:中興通訊“軟實(shí)力”突顯
- 傳蘋果VR頭顯已進(jìn)入試產(chǎn)階段 預(yù)計(jì)2022年發(fā)布
- 基于51單片機(jī)和ADC0808 ADC0809的自動(dòng)數(shù)字電壓表設(shè)計(jì)
- ATMEGA16定時(shí)器0
- 11-S3C2440驅(qū)動(dòng)學(xué)習(xí)(五)嵌入式linux-網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)(一)虛擬網(wǎng)卡驅(qū)動(dòng)程序
- 黑客宣稱竊取了微軟37GB源代碼 涵蓋Bing和Cortana
- STM32-DAC生成1Hz三角波【DAC觸發(fā)方式深入理解】
- 如何為您的應(yīng)用選擇光傳感器
- Samtec新型農(nóng)業(yè)漫談系列二 | 垂直農(nóng)業(yè)案列分享
- Samtec應(yīng)用科普 | C-V2X技術(shù)在汽車領(lǐng)域的應(yīng)用
- 尼得科運(yùn)動(dòng)&能源事業(yè)本部在印度卡納塔克邦胡布利舉行新工廠竣工儀式
- 貿(mào)澤開售Qorvo適用于5G和mMIMO應(yīng)用的新型QPA9822線性5G高增益/高驅(qū)動(dòng)放大器
- 邊緣計(jì)算網(wǎng)關(guān)工業(yè)物聯(lián)網(wǎng)應(yīng)用:空壓機(jī)遠(yuǎn)程運(yùn)維監(jiān)控管理
- 納芯微電子工業(yè)控制、機(jī)器人解決方案器件選型概述
- 使用瑞薩電子RZ/T2H產(chǎn)品實(shí)現(xiàn)多關(guān)節(jié)機(jī)器人
- 新能源純電動(dòng)汽車無法行駛故障分析
- AI玩具,還是AI工具?
- 小米VR一體機(jī)評(píng)測(cè)合集:Oculus帶來了什么改變?
- 華為2020年硬件視頻會(huì)議市場(chǎng)位列第一
- 歐時(shí)中國(guó)與京東簽署合作協(xié)議 攜手領(lǐng)軍工業(yè)品電商市場(chǎng)
- 彭博社:日本芯片的發(fā)展未來或在中國(guó)臺(tái)灣科學(xué)園區(qū)
- 被收購(gòu)的夏普開始發(fā)力,富士康將要賺翻?
- 新思科技收購(gòu)AI驅(qū)動(dòng)的實(shí)時(shí)性能優(yōu)化領(lǐng)導(dǎo)企業(yè)Concertio
- GF攜新思科技提供符合云標(biāo)準(zhǔn)和面向ASIL-D設(shè)計(jì)的汽車參考流程
- 貿(mào)澤電子攜手Analog Devices推出全新電子書
- MediaTek與AMD打造AMD RZ600系列Wi-Fi 6E模塊
- 表情太逼真!英國(guó)制造“最先進(jìn)人形機(jī)器人”,網(wǎng)友直呼“太可怕”
- TI 可以申請(qǐng)DSP學(xué)習(xí)板嗎
- EEWORLD大學(xué)堂----LM25066I系統(tǒng)電源管理和保護(hù)IC概述
- wm5 下 怎么獲得另一個(gè)程序右軟健的菜單句柄???
- EEWORLD大學(xué)堂----USB 3.1接收機(jī)一致性測(cè)試
- 誰沒睡覺的,進(jìn)來教我ISE的測(cè)試模塊怎么操作吧~
- linux密碼正確也進(jìn)不去了
- 舊耳機(jī)驅(qū)動(dòng)小喇叭
- Flash sector erase 跟 block erase 有什麼不同呢
- MicroPython的"Season of Docs"項(xiàng)目
- 嵌入式系統(tǒng)原理