04_【正点原子】DNESP32S3开发板显示图片

发布时间:2026/7/24 20:45:17
04_【正点原子】DNESP32S3开发板显示图片 开发板 【正点原子】DNESP32S3开发板基于 ESP-IDF esp_lcd 驱动框架驱动 ST7789 SPI 液晶屏320*240搭配 XL9555 I2C IO 扩展芯片控制 LCD 电源、硬件复位支持两种显示模式波纹动画特效 / 静态原图显示采用双行缓冲 DMA 分片刷屏提升 SPI 传输效率。SPI 总线初始化spi_bus_config_tbuscfg{.sclk_io_numEXAMPLE_PIN_NUM_PCLK,.mosi_io_numEXAMPLE_PIN_NUM_DATA0,.miso_io_num-1,// 单向SPI无读取MISO不使用.quadwp_io_num-1,.quadhd_io_num-1,// 单次SPI最大传输长度分片行数×宽度×2字节像素 头部预留.max_transfer_szPARALLEL_LINES*EXAMPLE_LCD_H_RES*28};// 挂载SPI2总线自动分配DMA通道ESP_ERROR_CHECK(spi_bus_initialize(LCD_HOST,buscfg,SPI_DMA_CH_AUTO));创建 SPI-LCD IO 适配器esp_lcd_panel_io_handle_tio_handleNULL;esp_lcd_panel_io_spi_config_tio_config{.dc_gpio_numEXAMPLE_PIN_NUM_DC,.cs_gpio_numEXAMPLE_PIN_NUM_CS,.pclk_hzEXAMPLE_LCD_PIXEL_CLOCK_HZ,.lcd_cmd_bitsEXAMPLE_LCD_CMD_BITS,.lcd_param_bitsEXAMPLE_LCD_PARAM_BITS,.spi_mode0,// SPI模式0 CPOL0 CPHA0ST7789标准.trans_queue_depth10,// SPI异步传输队列深度缓存多笔刷屏请求};// 绑定SPI总线生成IO句柄ESP_ERROR_CHECK(esp_lcd_new_panel_io_spi((esp_lcd_spi_bus_handle_t)LCD_HOST,io_config,io_handle));创建 ST7789 面板驱动 屏幕参数配置esp_lcd_panel_dev_config_tpanel_config{.reset_gpio_numEXAMPLE_PIN_NUM_RST,// 无直连复位脚填NC.rgb_ele_orderLCD_RGB_ELEMENT_ORDER_RGB,// 像素色彩顺序RGB.bits_per_pixel16,// RGB565 16bit色深};// 实例化ST7789厂商驱动生成全局panel_handleESP_ERROR_CHECK(esp_lcd_new_panel_st7789(io_handle,panel_config,panel_handle));// 执行ST7789寄存器初始化发送初始化指令序列ESP_ERROR_CHECK(esp_lcd_panel_init(panel_handle));// 打开屏幕显示输出ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(panel_handle,true));ESP_ERROR_CHECK(esp_lcd_panel_invert_color(panel_handle,true));// 反转颜色适配屏幕底色ESP_ERROR_CHECK(esp_lcd_panel_swap_xy(panel_handle,true));// 交换XY轴旋转90度ESP_ERROR_CHECK(esp_lcd_panel_mirror(panel_handle,true,false));// X轴镜像Y轴不镜像图片显示函数externuint16_t*pixels;// 外部全局原图缓冲区外部文件定义的全屏RGB565图像for(inty0;yEXAMPLE_LCD_V_RES;yPARALLEL_LINES){uint16_t*dsts_lines[calc_line];// 目标DMA缓冲// 遍历分片内每一行for(intyy0;yyPARALLEL_LINES;yy){intreal_yyyy;// 拷贝单行所有像素到DMA缓冲for(intx0;xEXAMPLE_LCD_H_RES;x){*dstpixels[real_y*EXAMPLE_LCD_H_RESx];}}sending_linecalc_line;calc_line!calc_line;esp_lcd_panel_draw_bitmap(panel_handle,0,y,EXAMPLE_LCD_H_RES,yPARALLEL_LINES,s_lines[sending_line]);}