esp32开发与应用(lvgl之上的开发) 【 声明版权所有欢迎转载请勿用于商业用途。 联系信箱feixiaoxing 163.com】前面为了开发lvgl我们做了一些准备。这里面包括了屏幕的驱动触摸屏的驱动屏幕和lvgl的适配触摸和lvgl的适配以及触摸的简单修改和标定。做好了这几部分之后基本上就可以做lvgl的开发了。1、lvgl开发基本就是纯软开发这里的lvgl其实不光用在mcu上还比较多的用在了linux上。比如很多的linux界面早期的时候可能用qt还是比较多的现在越来越多的开发者转到了lvgl上面。如果底层驱动都ok了相关的适配也就没有问题了那么l此时vgl之上的开发基本就是纯软开发了。2、lvgl可以用windows仿真对于lvgl开发的同学如果对底层参与不多完全可以先用windows vs开发后再移植到嵌入式设备上面这样效率反而是最高的。反之如果每一步都是用硬件去开发反而效率是最低的。3、纯软ai开发软件开发中ai适配最好的其实就是纯软开发。比如一般的网页前端开发、java后端开发这部分用ai的其实已经很多了。那现在有了ai之后用ai做lvgl开发也是非常方便的。对于简单的、不复杂的、页面不多的应用ai开发的效率远远高于个人本身。所以大家在开发的过程当中对于纯软这部分呢也要尽可能用ai去做。这部分既然效率高是趋势我们不妨好好研究、好好去利用起来就好了。4、以抽奖程序作为demo进行ai开发前面我们用ai写了一个进度条程序。其实自己稍微改一下或者让ai改一下界面和逻辑就可以变成一个抽奖程序。当然下面代码里面因为还涉及到了驱动和适配的内容稍显复杂。而真正和业务相关的部分代码不算多的。#include stdio.h #include stdlib.h #include string.h #include freertos/FreeRTOS.h #include freertos/task.h #include driver/spi_master.h #include driver/gpio.h #include esp_log.h #include esp_timer.h #include lvgl.h static void lvgl_task(void *arg); // CONFIG #define LCD_W 480 #define LCD_H 320 #define PIN_MOSI 13 #define PIN_CLK 14 #define PIN_CS 15 #define PIN_DC 2 #define PIN_RST 4 #define PIN_BL 12 #define TP_MOSI 23 #define TP_MISO 19 #define TP_CLK 18 #define TP_CS 5 #define TP_IRQ 27 static spi_device_handle_t spi_lcd; static spi_device_handle_t spi_tp; static const char *TAG ILI9488_LVGL; // // GPIO control // static inline void dc_cmd(void) { gpio_set_level(PIN_DC, 0); } static inline void dc_data(void) { gpio_set_level(PIN_DC, 1); } static void lcd_reset(void) { gpio_set_level(PIN_RST, 0); vTaskDelay(pdMS_TO_TICKS(100)); gpio_set_level(PIN_RST, 1); vTaskDelay(pdMS_TO_TICKS(150)); } // // SPI CMD / DATA // static void lcd_cmd(uint8_t cmd) { spi_transaction_t t { .length 8, .tx_buffer cmd, }; dc_cmd(); spi_device_polling_transmit(spi_lcd, t); } static void lcd_data(const void *data, int len) { spi_transaction_t t { .length len * 8, .tx_buffer data, }; dc_data(); spi_device_polling_transmit(spi_lcd, t); } // // ILI9488 INIT (stable version) // static void ili9488_init(void) { lcd_reset(); lcd_cmd(0x01); // Software reset vTaskDelay(pdMS_TO_TICKS(120)); lcd_cmd(0x11); // Sleep out vTaskDelay(pdMS_TO_TICKS(120)); // RGB565 mode (important for stability) lcd_cmd(0x3A); uint8_t pix 0x66; lcd_data(pix, 1); // MADCTL (display orientation) lcd_cmd(0x36); uint8_t mad 0x28; // change to 0x28 if upside-down lcd_data(mad, 1); lcd_cmd(0x29); // Display ON vTaskDelay(pdMS_TO_TICKS(50)); ESP_LOGI(TAG, LCD init OK); } // // Set drawing window // static void set_window(int x1,int y1,int x2,int y2) { uint8_t d[4]; lcd_cmd(0x2A); d[0]x18; d[1]x1; d[2]x28; d[3]x2; lcd_data(d,4); lcd_cmd(0x2B); d[0]y18; d[1]y1; d[2]y28; d[3]y2; lcd_data(d,4); lcd_cmd(0x2C); } // // Touch read (XPT2046 style) // static uint16_t tp_read(uint8_t cmd) { uint8_t tx[3] {cmd,0,0}; uint8_t rx[3] {0}; spi_transaction_t t { .length 24, .tx_buffer tx, .rx_buffer rx, }; spi_device_polling_transmit(spi_tp, t); return ((rx[1] 8) | rx[2]) 3; } static void touch_read(lv_indev_drv_t *drv, lv_indev_data_t *data) { static bool touched false; if (gpio_get_level(TP_IRQ) 0) { >5、后续验证和测试如之前所说如果是纯lvgl的开发可以先用windows vs2019 lvgl8.3仿真好再port到设备上面进行测试。哪怕是串口、232、485、can这些其实也是可以通过serial做一个接口先在windows开发好之后再移植到设备这样效率才是最高的。软硬分离的好处就是各司其职。如果软件规模不大软硬件都是一个人来做这种情况还可以接受。一旦软件规模超过一个人能力的范围就必须要软硬分家了。