ESP32-P4 摄像头画面实时上屏:基于 esp_video 与 MIPI-DSI 的 Video LCD Display 实战指南
发布时间:2026/9/20 2:13:16 作者:尧图编辑部 阅读量:1,286

ESP32-P4 摄像头画面实时上屏基于 esp_video 与 MIPI-DSI 的 Video LCD Display 实战指南【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solution导读本文以 esp-iot-solution 仓库中的 video_lcd_display 示例为主线完整讲解如何在 ESP32-P4 开发板上把 MIPI-CSI 摄像头采集的画面通过 PPA 硬件加速处理后实时显示到 7 英寸 1024×600 MIPI-DSI 触摸屏上。读完本文你将掌握该示例的硬件接线、menuconfig 配置、编译烧录流程以及从esp_video组件初始化、V4L2 式视频设备打开、双/三缓冲管理到 LCD 刷屏的完整数据通路与源码实现细节。示例概述摄像头 → 屏幕的完整链路该示例基于 Espressif 的 esp_video。它演示了从摄像头采集图像到 LCD 显示的全过程核心数据链路为MIPI-CSI 摄像头SC2336 传感器采集原始图像esp_video组件完成 CSI 控制器、ISP 流水线的初始化并向上层暴露类似 Linux V4L2 的字符设备接口/dev/video*应用层通过标准的 V4L2 ioctl 流程VIDIOC_QUERYCAP/VIDIOC_REQBUFS/VIDIOC_QBUF/VIDIOC_DQBUF/VIDIOC_STREAMON获取视频帧若摄像头分辨率与 LCD 分辨率不一致使用PPAPixel Processing Accelerator像素处理加速器的 SRMScale-Rotate-Mirror算子做缩放/裁剪最终通过esp_lcd_panel_draw_bitmap将帧数据写入MIPI-DSI 接口的 EK79007 LCD 驱动完成上屏。工程目录结构如下源码路径main文件职责main.c主流程初始化 LCD、注册 PPA 客户端、打开摄像头、设置缓冲、启动采集任务app_lcd.cLCD 初始化LDO 上电、MIPI-DSI 总线、DBI 面板 IO、EK79007 面板驱动app_video.c摄像头初始化、V4L2 设备打开、缓冲管理、帧采集 FreeRTOS 任务app_lcd.h / app_video.h对外 API 与宏定义Kconfig.projbuild示例级菜单配置项sdkconfig.defaults目标芯片与默认配置idf_component.yml组件依赖声明环境要求与版本前提支持的芯片仅支持 ESP32-P4sdkconfig.defaults中通过CONFIG_IDF_TARGETesp32p4固定。ESP-IDF 版本支持release/v5.4及更新分支默认按release/v5.4构建sdkconfig.defaults注释中也标明由 ESP-IDF 5.4.0 生成。请先按 ESP-IDF 编程指南 配置好开发环境建议先完成 Build Your First Project 熟悉流程。组件依赖见 idf_component.ymlesp_video0.8.*公共依赖负责摄像头视频通路espressif/esp_lcd_ek790071.*公共依赖EK79007 面板驱动idf 5.3。需要说明示例支持 ESP-IDF release/v5.4 及以后版本因此若使用更高版本的 IDF部分驱动 API 或默认配置可能略有差异请以实际环境编译输出为准。硬件准备与接线步骤官方推荐的硬件组合为一块ESP32-P4-Function-EV-Board开发板一块7 英寸 1024×600 LCD 屏主控 IC 为 EK79007搭配 32-pin FPC 的适配底板一个MIPI-CSI 摄像头传感器 IC 为 SC2336同样搭配 32-pin FPC 适配底板一根USB-C 线用于供电与串口监视。接线分为五个步骤Step 1按下表把屏幕适配底板背面的引脚接到开发板对应引脚注意屏幕背光 PWM 与复位脚必须接对Screen Adapter BoardESP32-P4-Function-EV-Board5V (任意一个)5V (任意一个)GND (任意一个)GND (任意一个)PWMGPIO26LCD_RSTGPIO27Step 2将 LCD 的 FPC 排线插入开发板的MIPI_DSI接口Step 3将摄像头的 FPC 排线插入开发板的MIPI_CSI接口Step 4用 USB-C 线连接开发板USB-UART口到 PC供电 查看串口输出Step 5打开开发板电源开关。值得对照源码的一点复位引脚 GPIO27 在 app_lcd.c 中以EXAMPLE_PIN_NUM_LCD_RST (27)定义而背光 PWM 的 GPIO26 则由屏的硬件配置决定与接线表一一对应接线前务必核对。配置项目menuconfig 关键选项在工程根目录运行idf.py menuconfig进入Example Configuration菜单即可配置引脚与示例相关选项。所有示例级选项均定义在 Kconfig.projbuild 中主要分四类1. MIPI-CSI 摄像头传感器配置Example Configuration → Enable MIPI CSI Camera Sensor默认开启依赖SOC_MIPI_CSI_SUPPORTED。开启后可配置EXAMPLE_MIPI_CSI_SCCB_I2C_PORTSCCB摄像头控制总线I2C 端口号默认0范围0~1EXAMPLE_MIPI_CSI_SCCB_I2C_SCL_PINSCCB SCL 引脚默认34范围-1~56EXAMPLE_MIPI_CSI_SCCB_I2C_SDA_PINSCCB SDA 引脚默认31范围-1~56EXAMPLE_MIPI_CSI_SCCB_I2C_FREQSCCB I2C 频率默认100000范围100000~400000。帮助文本明确指出增大该值可缩短摄像头传感器的初始化时间但需参考传感器手册在允许范围内调整EXAMPLE_MIPI_CSI_CAM_SENSOR_RESET_PIN传感器复位引脚默认-1不接EXAMPLE_MIPI_CSI_CAM_SENSOR_PWDN_PIN传感器掉电引脚默认-1。注意sdkconfig.defaults中针对该示例把 SCL/SDA 实际改为8/7即默认配置下 SCCB 走 GPIO8SCL与 GPIO7SDA与 Kconfig 中的通用默认值不同若自行接线需以实际硬件为准调整。2. 摄像头传感器选型Espressif Camera Sensors 配置README 要求在Espressif Camera Sensors Configurations中选择传感器型号及输出格式Component config --- Espressif Camera Sensors Configurations --- [*] SC2336 ---- Default format select for MIPI (RAW8 1280x720 30fps, MIPI 2lane 24M input) --- (X) RAW8 1280x720 30fps, MIPI 2lane 24M input对应到sdkconfig.defaults的两项开关CONFIG_CAMERA_SC2336y与CONFIG_CAMERA_SC2336_MIPI_RAW8_1024x600_30FPSy。后者的 1024x600 表明示例默认让 SC2336 输出与 LCD 同分辨率1024×600的 RAW8 数据从而避免 PPA 缩放带来的帧率损失。3. 图像处理与显示相关选项EXAMPLE_ENABLE_PRINT_FPS_RATE_VALUE是否周期打印帧率FPS默认开启EXAMPLE_USE_MEMORY_MAPPING是否用内存映射MMAP方式分配摄像头缓冲默认关闭。开启后app_video_set_bufs传入NULL由驱动通过mmap自动分配对应 app_video.c 中V4L2_MEMORY_MMAP分支关闭时使用用户定义缓冲V4L2_MEMORY_USERPTREXAMPLE_CAM_BUF_COUNT摄像头缓冲数量默认2范围2~3。该值同时决定 LCD 的帧缓冲数量见app_lcd.h中EXAMPLE_LCD_BUF_NUM (CONFIG_EXAMPLE_CAM_BUF_COUNT)即摄像头缓冲与 LCD 显示缓冲一一对应复用LCD_PIXEL_FORMAT_RGB565/LCD_PIXEL_FORMAT_RGB888LCD 颜色格式选择默认 RGB56516bpp可选 RGB88824bpp。该选择会同时驱动 app_lcd.h 中EXAMPLE_LCD_BIT_PER_PIXEL、EXAMPLE_MIPI_DPI_PX_FORMAT以及 app_video.h 中APP_VIDEO_FMT的取值保证摄像头输出格式与屏幕格式一致EXAMPLE_ENABLE_CAM_SENSOR_PIC_VFLIP/EXAMPLE_ENABLE_CAM_SENSOR_PIC_HFLIP是否对画面做垂直/水平镜像翻转均默认开启。此外sdkconfig.defaults还启用了CONFIG_ESP_VIDEO_ENABLE_ISP_PIPELINE_CONTROLLERyISP 流水线控制器与CONFIG_IDF_EXPERIMENTAL_FEATURESy并配置了 200MHz SPIRAM 与 1000Hz FreeRTOS 节拍这些是保证高帧率采集与显示的基础。编译、烧录与监视在工程目录examples/camera/video_lcd_display下执行idf.py -p PORT flash monitor其中PORT替换为开发板对应的串口名。该命令会一次性完成编译、烧录并打开串口监视器退出监视器按Ctrl-]。完整的环境配置与工程构建步骤可参考 ESP-IDF Getting Started Guide。运行成功后串口会打印摄像头设备的能力信息driver、card、bus 等并在开启 FPS 打印时每 50 帧输出一次当前帧率与帧尺寸形如I (xxxx) app_main: fps: 29.xxx I (xxxx) app_main: camera_buf_hes: 1024, camera_buf_ves: 600, camera_buf_len: 1228 KB源码级剖析从初始化到逐帧上屏1. 主流程编排main.cmain.c 中app_main的执行顺序清晰展示了先屏后摄的初始化策略app_lcd_init(display_panel)初始化 EK79007 LCD 面板注册PPA SRM 客户端PPA_OPERATION_SRM并查询 SPIRAM 对齐要求esp_cache_get_alignment为后续对齐分配缓冲做准备app_video_main(NULL)初始化 esp_video摄像头通路app_video_open(EXAMPLE_CAM_DEV_PATH, APP_VIDEO_FMT)打开 MIPI-CSI 视频设备设备路径宏为ESP_VIDEO_MIPI_CSI_DEVICE_NAME获取 LCD 帧缓冲esp_lcd_dpi_panel_get_frame_buffer缓冲数量与EXAMPLE_LCD_BUF_NUM即摄像头缓冲数 2 或 3一致根据是否开启内存映射选择app_video_set_bufs(..., NULL)MMAP 自动分配或传入用户缓冲USERPTR若传感器输出恰好为 1024×600CONFIG_CAMERA_SC2336_MIPI_RAW8_1024x600_30FPS直接复用 LCD 帧缓冲作为摄像头缓冲实现零拷贝否则用heap_caps_aligned_calloc在 SPIRAM 中按缓存行对齐分配独立缓冲注册帧操作回调camera_video_frame_operation启动摄像头采集任务app_video_stream_task_start(video_cam_fd0, 0, NULL)固定绑定到 core 0。2. LCD 初始化app_lcd.capp_lcd.c 的初始化要点LDO 上电先通过esp_ldo_acquire_channel为 MIPI PHY 供电通道 32500mVDSI 总线使用 EK79007 驱动预置的EK79007_PANEL_BUS_DSI_2CH_CONFIG()创建 2-lane MIPI-DSI 总线DBI 面板 IOEK79007_PANEL_IO_DBI_CONFIG()创建 DBI命令通道DPI 面板EK79007_1024_600_PANEL_60HZ_CONFIG(EXAMPLE_MIPI_DPI_PX_FORMAT)生成 1024×60060Hz 的 DPI 配置并将num_fbs设为EXAMPLE_LCD_BUF_NUM多帧缓冲是实现无撕裂刷新的关键面板配置中reset_gpio_num 27、rgb_ele_order LCD_RGB_ELEMENT_ORDER_RGB、bits_per_pixel依据 RGB565/RGB888 自动取值随后esp_lcd_new_panel_ek79007创建面板并resetinit。3. 摄像头通路与 V4L2 流程app_video.capp_video.c 把 esp_video 的上层封装成了类 V4L2 的标准流程是理解该示例的关键app_video_main构造esp_video_init_csi_config_tSCCB 的 I2C 端口/引脚/频率、复位与掉电引脚若外部传入 I2C 总线句柄则复用该总线最终调用esp_video_initapp_video_openopen设备 →VIDIOC_QUERYCAP查询能力串口打印版本、驱动名、卡名、总线信息→VIDIOC_G_FMT读取当前分辨率并记录到camera_buf_hes/ves→ 若像素格式与init_fmtRGB565 或 RGB888不一致则VIDIOC_S_FMT设置若使能了翻转则通过VIDIOC_S_EXT_CTRLS设置V4L2_CID_VFLIP/V4L2_CID_HFLIPapp_video_set_bufs校验缓冲数2~3 个MAX_BUFFER_COUNT3、MIN_BUFFER_COUNT2→VIDIOC_REQBUFS请求缓冲传入fb时用V4L2_MEMORY_USERPTR否则V4L2_MEMORY_MMAP→ 逐个VIDIOC_QUERYBUF后mmap或登记userptr→VIDIOC_QBUF入队采集任务video_stream_task4KB 栈、优先级 4、可固定到指定核循环执行VIDIOC_DQBUF取帧 → 调用用户回调处理帧 →VIDIOC_QBUF还帧形成生产者-消费者式的流水线VIDIOC_STREAMON/VIDIOC_STREAMOFF负责开关流app_video_stream_task_stop/restart提供停止与重启能力。4. 帧处理回调PPA 缩放与上屏main.ccamera_video_frame_operation回调main.c是从摄像头到屏幕的最后一公里FPS 统计每 50 帧基于esp_timer_get_time()计算一次平均帧率并打印帧的宽高与字节数分辨率匹配分支摄像头分辨率大于LCD 分辨率时构造ppa_srm_oper_config_t输入为摄像头帧输出为 LCD 帧缓冲按(camera - LCD)/2计算裁剪偏移实现居中裁剪调用ppa_do_scale_rotate_mirrorPPA_TRANS_MODE_BLOCKING阻塞模式完成缩放/旋转/镜像后用esp_lcd_panel_draw_bitmap将结果刷到屏幕。代码注释也提醒分辨率不匹配走 PPA 处理会带来一定帧率损失摄像头分辨率不大于LCD 时直接把摄像头缓冲即复用的 LCD 帧缓冲交给esp_lcd_panel_draw_bitmap实现零拷贝直通显示颜色模式PPA_SRM_COLOR_MODE_RGB565/RGB888与APP_VIDEO_FMT联动保证 PPA 输入输出格式一致。常见问题与调试建议画面方向不对示例默认开启 VFLIP/HFLIP两个开关默认y若传感器安装方向不同导致画面镜像可在 menuconfig 中关闭EXAMPLE_ENABLE_CAM_SENSOR_PIC_VFLIP或HFLIP后重新编译初始化耗时偏长可尝试提高EXAMPLE_MIPI_CSI_SCCB_I2C_FREQ范围 100kHz~400kHz但务必确认传感器手册允许的频率上限帧率低于预期优先确认菜单中 SC2336 的输出格式是否为RAW8 1024x600 30fps与 LCD 同分辨率避免触发 PPA 缩放缓冲数建议保持 2~3配合多帧缓冲num_fbs减少撕裂需要零拷贝直通确保摄像头分辨率与 LCD 分辨率一致默认配置即为此设计此时摄像头缓冲直接复用 LCD 帧缓冲链路为纯直通模式串口无输出检查 USB-UART 接线与idf.py -p PORT monitor的端口号确认开发板电源开关已打开。小结video_lcd_display 示例完整展示了 ESP32-P4 上MIPI-CSI 摄像头 → esp_video/V4L2 → PPA 图像处理 → MIPI-DSI LCD的端到端视频通路。通过 menuconfig 即可切换颜色格式、缓冲模式与镜像方向在摄像头与屏幕同分辨率时示例通过复用 LCD 帧缓冲实现零拷贝直通分辨率不匹配时则借助 PPA 的 SRM 算子完成裁剪缩放。无论是快速评估摄像头实时预览类产品原型还是作为自研视频采集方案的起点本文梳理的接线、配置与源码调用链都能直接指导你的开发实践。【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solution创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考