esp32开发与应用(继续升级到3.5寸屏幕)
【 声明版权所有欢迎转载请勿用于商业用途。 联系信箱feixiaoxing 163.com】前面我们已经升级了一次屏幕当时是从240*240升级到320*240。在这过程中屏幕驱动ic也发生了改变。这一次我们继续升级屏幕升级到480*320驱动芯片从ILI9341调整为ILI9488。对于mcu应用来说480*320的分辨率足以覆盖大部分场景了。1、总线部分驱动芯片虽然发生了变化但是使用的还是spi总线这部分不变。2、连接线实际连线的时候除了spi的三根线去除miso还有三根线即dc、rst、bl。这和之前也是一样的没有发生改变。3、查找代码时的注意事项这一次用ai查找代码的时候本来想一步到位希望ai直接生成基于lvgl的ili9488驱动代码。实际操作下来错误很多。一会是lvgl的问题一会是9488的问题。所以最后还是从基础开始直接用ai生成裸屏驱动代码这才错误慢慢收敛起来。4、用ai生成裸屏驱动代码这里生成驱动代码时候有一些细节是需要高速ai的比如用esp32驱动驱动芯片是ili9488分辨率是480*320希望生成宽屏代码。这样不出意外就可以得到下面这些内容#include stdio.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 // 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 static spi_device_handle_t spi; static const char *TAG ILI9488_AUTO; // LCD MODE typedef enum { MODE_RGB565 0, MODE_RGB666 1, } lcd_mode_t; static lcd_mode_t lcd_mode MODE_RGB565; // GPIO 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 static void lcd_cmd(uint8_t cmd) { spi_transaction_t t { .length 8, .tx_buffer cmd, }; dc_cmd(); spi_device_transmit(spi, t); } static void lcd_data(const void *data, int len) { spi_transaction_t t { .length len * 8, .tx_buffer data, }; dc_data(); spi_device_transmit(spi, t); } // INIT static void ili9488_init(lcd_mode_t mode) { lcd_reset(); lcd_cmd(0x01); // Software reset vTaskDelay(pdMS_TO_TICKS(120)); lcd_cmd(0x11); // Sleep out vTaskDelay(pdMS_TO_TICKS(150)); lcd_cmd(0x3A); // Pixel format uint8_t pix (mode MODE_RGB565) ? 0x55 : 0x66; lcd_data(pix, 1); lcd_cmd(0x36); // Memory access control uint8_t mad 0x28; lcd_data(mad, 1); lcd_cmd(0x29); // Display on vTaskDelay(pdMS_TO_TICKS(50)); lcd_mode mode; ESP_LOGI(TAG, init mode %s, mode MODE_RGB565 ? RGB565 : RGB666); } // WINDOW static void set_window(int x1,int y1,int x2,int y2) { uint8_t d[4]; lcd_cmd(0x2A); // Column address set d[0]x18; d[1]x1; d[2]x28; d[3]x2; lcd_data(d,4); lcd_cmd(0x2B); // Page address set d[0]y18; d[1]y1; d[2]y28; d[3]y2; lcd_data(d,4); lcd_cmd(0x2C); // Memory write } // AUTO SAFE FILL #define BUF_PIXELS 1024 static uint8_t buf[BUF_PIXELS * 3]; // Maximum size prepared for RGB666 static void fill_color(uint16_t color) { set_window(0,0,LCD_W-1,LCD_H-1); if (lcd_mode MODE_RGB565) { uint8_t hi color 8; uint8_t lo color 0xFF; for (int i0;iBUF_PIXELS;i) { buf[i*2] hi; buf[i*21] lo; } spi_transaction_t t { .length BUF_PIXELS * 16, .tx_buffer buf, }; int blocks (LCD_W*LCD_H)/BUF_PIXELS; for (int i0;iblocks;i) { dc_data(); spi_device_transmit(spi,t); } } else { uint8_t r (color 11) 0x1F; uint8_t g (color 5) 0x3F; uint8_t b color 0x1F; r 3; g 2; b 3; for (int i0;iBUF_PIXELS;i) { buf[i*30]r; buf[i*31]g; buf[i*32]b; } spi_transaction_t t { .length BUF_PIXELS * 24, .tx_buffer buf, }; int blocks (LCD_W*LCD_H)/BUF_PIXELS; for (int i0;iblocks;i) { dc_data(); spi_device_transmit(spi,t); } } } // BACKLIGHT static void backlight_init(void) { gpio_config_t io{ .pin_bit_mask1ULLPIN_BL, .modeGPIO_MODE_OUTPUT }; gpio_config(io); gpio_set_level(PIN_BL,1); } // MAIN void app_main(void) { gpio_set_direction(PIN_DC,GPIO_MODE_OUTPUT); gpio_set_direction(PIN_RST,GPIO_MODE_OUTPUT); backlight_init(); spi_bus_config_t bus{ .mosi_io_numPIN_MOSI, .miso_io_num-1, .sclk_io_numPIN_CLK, .max_transfer_sz1024*3 }; spi_bus_initialize(SPI2_HOST,bus,SPI_DMA_CH_AUTO); spi_device_interface_config_t dev{ .clock_speed_hz20*1000*1000, .mode0, .spics_io_numPIN_CS, .queue_size7, }; spi_bus_add_device(SPI2_HOST,dev,spi); // ⭐ Auto mode: try RGB565 first, switch to RGB666 if it doesnt work ili9488_init(MODE_RGB666); while (1) { ESP_LOGI(TAG, COLOR TEST - RED (0xF800)); fill_color(0xF800); vTaskDelay(pdMS_TO_TICKS(500)); ESP_LOGI(TAG, COLOR TEST - GREEN (0x07E0)); fill_color(0x07E0); vTaskDelay(pdMS_TO_TICKS(500)); ESP_LOGI(TAG, COLOR TEST - BLUE (0x001F)); fill_color(0x001F); vTaskDelay(pdMS_TO_TICKS(500)); ESP_LOGI(TAG, COLOR TEST - WHITE (0xFFFF)); fill_color(0xFFFF); vTaskDelay(pdMS_TO_TICKS(500)); ESP_LOGI(TAG, COLOR TEST - BLACK (0x0000)); fill_color(0x0000); vTaskDelay(pdMS_TO_TICKS(500)); } }5、编译和测试编译和测试这部分和之前一样。先保证代码是对的能运行的。然后再去慢慢理解这样比较明智。但是比较难的地方是遇到问题的时候如何和ai进行交互这部分其实还是比较吃经验的。指望从来没有驱动经验的同学可以短时间快速驱动好屏幕着实有点困难。

相关新闻

5步高效部署HunterPie:Monster Hunter: World游戏覆盖层终极指南

5步高效部署HunterPie:Monster Hunter: World游戏覆盖层终极指南

5步高效部署HunterPie:Monster Hunter: World游戏覆盖层终极指南 【免费下载链接】HunterPie-legacy A complete, modern and clean overlay with Discord Rich Presence integration for Monster Hunter: World. 项目地址: https://gitcode.com/gh_mirrors/hu/Hu…

2026/6/21 6:16:15阅读更多 →
[Django] DisallowedHost突然爆发?ALLOWED_HOSTS=‘*‘为什么没用+中间件根治方案(附代码)

[Django] DisallowedHost突然爆发?ALLOWED_HOSTS=‘*‘为什么没用+中间件根治方案(附代码)

Django 生产环境 DisallowedHost 突然爆发?ALLOWED_HOSTS[*] 为什么没用? TL;DR:你的 Django 项目突然开始报 DisallowedHost,日志里 Host 是一个奇怪的下划线 _,而你明明设了 ALLOWED_HOSTS [*]。问题出在 Django 的…

2026/6/21 6:16:15阅读更多 →
MMEmb-R1框架:多模态嵌入与推理增强技术解析

MMEmb-R1框架:多模态嵌入与推理增强技术解析

1. MMEmb-R1框架解析:多模态嵌入的推理增强革命在跨模态检索和推荐系统的实际应用中,我们常常遇到这样的困境:当用户输入"樱花树下女孩喂猫的照片"时,传统嵌入模型可能无法准确关联"女孩喂食的对象是什么"这类…

2026/6/21 6:11:15阅读更多 →
炉石传说增强插件架构深度解析与实战配置指南

炉石传说增强插件架构深度解析与实战配置指南

炉石传说增强插件架构深度解析与实战配置指南 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod HsMod是一款基于BepInEx框架开发的开源炉石传说功能增强插件,为技术爱好者和进阶玩…

2026/6/21 7:26:36阅读更多 →
NSK MCM10重载极速定位单元技术解析

NSK MCM10重载极速定位单元技术解析

根据NSK官方《精机综合样本》的定位承载装置选型体系,太绝了!您本次查询的 MCM10017H20D00 标志着我们在 MCM10 旗舰系列中,成功将“双滑块的重装抗扭装甲”与“20mm大导程的 1,000 mm/s 极速”完美融合在了一起! | 编码 | 属性 …

2026/6/21 7:26:36阅读更多 →
SQL注入检测进阶:Burp Suite插件高级用法与实战技巧

SQL注入检测进阶:Burp Suite插件高级用法与实战技巧

1. 项目概述:为什么我们需要更精细的SQL注入检测工具?在安全测试的日常工作中,SQL注入检测是绕不开的“基本功”。无论是做渗透测试、代码审计,还是日常的漏洞排查,我们手里总得有几把趁手的“刷子”。从最原始的手工拼…

2026/6/21 7:26:36阅读更多 →
Selenium等待机制深度解析:隐式与显式等待的原理、应用与避坑指南

Selenium等待机制深度解析:隐式与显式等待的原理、应用与避坑指南

1. 项目概述:为什么“等待”是自动化测试的命门?如果你用过Selenium写过自动化脚本,十有八九遇到过这个场景:脚本运行得飞快,页面元素还没加载出来,代码就已经开始点击或输入了,结果就是抛出一个…

2026/6/21 7:26:36阅读更多 →
终极指南:3步快速解决Unity游戏语言障碍的完整方案

终极指南:3步快速解决Unity游戏语言障碍的完整方案

终极指南:3步快速解决Unity游戏语言障碍的完整方案 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾因语言不通而错过精彩的Unity游戏?XUnity自动翻译器为你提供了一站式解…

2026/6/21 7:26:36阅读更多 →
嵌入式VoIP网关开发实战:基于PDK套件的软硬件协同设计

嵌入式VoIP网关开发实战:基于PDK套件的软硬件协同设计

1. 项目概述:PDK开发套件与嵌入式VoIP网关在通信设备开发领域,尤其是VoIP(Voice over IP)媒体网关这类产品,其核心挑战在于如何将传统的电话网络(PSTN)与基于IP的数据网络无缝桥接,并…

2026/6/21 7:21:36阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/21 0:00:40阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/21 0:00:40阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/21 0:00:40阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/21 0:00:40阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/21 0:00:40阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/21 0:00:40阅读更多 →