当前位置: 首页 > news >正文

自定义ESP32-S3开发板适配ESP-WHO框架

一、ESP-WHO 示例部署

1、ESP-WHO概述

ESP-WHO 是乐鑫官方开源、面向ESP系列芯片的边缘机器视觉AI开发框架,主打低门槛快速实现人脸、物体、手势等视觉AI任务,完全基于ESP-IDF构建,底层依赖乐鑫自研深度学习库ESP-DL做模型推理加速。
核心定位:给资源有限的ESP32/ESP32-S3/ESP32-P4等MCU提供开箱即用的视觉流水线,不用从零搭建图像采集、预处理、AI推理、结果渲染整套代码。

版本适配关系

  • ESP-IDF v5.x → 新版ESP-WHO主分支(主推S3、P4)
  • ESP-IDF v4.4 → 对应esp-who/idfv4.4分支(老ESP32芯片)

ESP-WHO 提供了人脸检测、人脸识别、行人检测、二维码识别等示例。您可以基于这些示例,衍生出丰富的实际应用。ESP-WHO 基于ESP-DL开发,配合各种外设可以实现许多有趣的应用。

ESP-WHO 支持的开发版ESP32-P4 Function EV Board、ESP32-S3-EYE、ESP32-S3-Korvo-2,有的缺货,有的成本较高。

ESP32-S3-EYE 开发板:

2、 编译运行 ESP-WHO 示例

ESP-WHO 的所有示例都存放在 examples 中,进入对应的文件夹,执行下面的步骤。
添加环境变量

export IDF_EXTRA_ACTIONS_PATH=/path_to_esp-who/tools/ echo $IDF_EXTRA_ACTIONS_PATH

设定目标 SOC 和默认 sdkconfig 配置文件

idf.py -DSDKCONFIG_DEFAULTS=sdkconfig.bsp.bsp_name set-target esp32xx

配置 sdkconfig 选项

idf.py menuconfig

编译,烧录并监视

idf.py flash monitor [-p port]

ESP32_S3_EYE 配置与编译

基于esp32_s3_eye 开发板完整配置与编译步骤:

下述开发前提环境,Ubuntu22.04 + IDF5.5。

cd /home/tony/esp git clone git@gitee.com:EspressifSystems/esp-who.git export IDF_EXTRA_ACTIONS_PATH=/home/tony/esp/esp-who/tools/ cd esp-who/examples/human_face_recognition/ idf.py set-target esp32s3 idf.py -D SDKCONFIG_DEFAULTS="sdkconfig.bsp.esp32_s3_eye" set-target esp32s3 idf.py menuconfig idf.py update-dependencies idf.py build idf.py flash idf.py monitor

二、自定义硬件说明

第三方 ESP32-S3-WROOM N16R8 带 DVP 开发板 + 外接 OV3660

1. 关键硬件差异

跟ESP32_S3_EYE 区别

  • 核心模组一致:ESP32-S3-WROOM-1 N16R8(16MB Flash + 8MB Octal PSRAM,NNA 硬件加速完全相同)
  • DVP 摄像头引脚定义完全对齐 ESP32-S3-EYE 官方标准,DVP 总线 GPIO 一一对应
  • 都支持 OV2640/OV3660 DVP 摄像头,ESP-WHO 相机底层驱动通用

硬件模块

ESP32-S3-EYE(乐鑫原厂)

第三方 S3-WROOM N16R8 DVP 开发板

摄像头

板载 OV2640,自带独立相机 LDO 电源,软件自动上电

外接 OV3660,无专用相机电源电路;需外部 3.3V 供电

LCD 屏幕

板载 ST7789 SPI 小屏,BSP 内置 LCD 引脚、背光控制

无自带 LCD,SPI 屏需要额外接线,引脚自定义

麦克风

内置 PDM 数字麦,ESP-ADF 语音开箱即用

无板载麦克风

SD 卡槽

自带 TF 卡槽,人脸库可存 SD 卡

无板载 SD 卡,人脸模板只能存在 Flash 分区

按键 / LED

板载功能按键、状态 LED,BSP 封装按键录入人脸逻辑

仅有通用 IO,录入人脸需要外接按键或串口指令触发

BSP 原生适配

ESP-WHO 内置esp32_s3_eye

/esp32_s3_eye_noglib

官方配置

无专属官方 BSP 配置文件,只能两种方案:1. 复用 S3-EYE 相机配置,关闭 LCD / 麦 / SD2. 自建自定义 bsp 配置

电源噪声

相机独立供电,图像横纹、噪点极少

共用主板 3.3V,布线差容易图像干扰

2. 关键移植内容

LCD (ST7789) 引脚

#define BSP_LCD_SPI_MOSI (GPIO_NUM_20) #define BSP_LCD_SPI_CLK (GPIO_NUM_19) #define BSP_LCD_SPI_CS (GPIO_NUM_45) #define BSP_LCD_DC (GPIO_NUM_47) #define BSP_LCD_RST (GPIO_NUM_NC) #define BSP_LCD_BACKLIGHT (GPIO_NUM_48)

关键驱动修改

  • SPI 模式改为:spi_mode = 0
  • 背光反向关闭:.flags.output_invert = false
  • 背光避开 SD 卡冲突:GPIO38 → GPIO48

三、完整移植步骤

因为第三方 ESP32-S3-WROOM 开发板与ESP32-S3-EYE开发板核心与摄像头接口一致,项目移植时可借用sdkconfig.bsp.esp32_s3_eye 配置文件,增加修订 LCD ST7789 的配置,项目基础功能就可以编译运行起来。

1、硬件引脚固化

修改managed_components/espressif__esp32_s3_eye/include/esp32_s3_eye.h

① LCD ST7789 引脚

// Display #define BSP_LCD_SPI_MOSI (GPIO_NUM_20) #define BSP_LCD_SPI_CLK (GPIO_NUM_19) #define BSP_LCD_SPI_CS (GPIO_NUM_45) #define BSP_LCD_DC (GPIO_NUM_47) #define BSP_LCD_RST (GPIO_NUM_NC) #define BSP_LCD_BACKLIGHT (GPIO_NUM_48) // Camera OV3660(原厂引脚和当前硬件完全匹配,无需改动) #define BSP_CAMERA_XCLK (GPIO_NUM_15) #define BSP_CAMERA_PCLK (GPIO_NUM_13) #define BSP_CAMERA_VSYNC (GPIO_NUM_6) #define BSP_CAMERA_HSYNC (GPIO_NUM_7) #define BSP_CAMERA_D0 (GPIO_NUM_11) #define BSP_CAMERA_D1 (GPIO_NUM_9) #define BSP_CAMERA_D2 (GPIO_NUM_8) #define BSP_CAMERA_D3 (GPIO_NUM_10) #define BSP_CAMERA_D4 (GPIO_NUM_12) #define BSP_CAMERA_D5 (GPIO_NUM_18) #define BSP_CAMERA_D6 (GPIO_NUM_17) #define BSP_CAMERA_D7 (GPIO_NUM_16)

② 修改esp32_s3_eye.c两处驱动参数

  1. SPI 模式修正
esp_lcd_panel_io_spi_config_t io_config = { .dc_gpio_num = BSP_LCD_DC, .cs_gpio_num = BSP_LCD_SPI_CS, .pclk_hz = BSP_LCD_PIXEL_CLOCK_HZ, .lcd_cmd_bits = LCD_CMD_BITS, .lcd_param_bits = LCD_PARAM_BITS, .spi_mode = 0, // 原厂2改为0,适配外置ST7789 .trans_queue_depth = 10, };
  1. 背光 PWM 关闭反向输出
const ledc_channel_config_t LCD_backlight_channel = { .gpio_num = BSP_LCD_BACKLIGHT, .speed_mode = LEDC_LOW_SPEED_MODE, .channel = LCD_LEDC_CH, .intr_type = LEDC_INTR_DISABLE, .timer_sel = 1, .duty = 0, .hpoint = 0, .flags.output_invert = false // 原厂true改为false,高电平点亮背光 };

2、idf.py menuconfig 必须修改的配置项

进入配置界面命令:

idf.py set-target esp32s3 idf.py -D SDKCONFIG_DEFAULTS="sdkconfig.bsp.esp32_s3_eye" set-target esp32s3 idf.py menuconfig

① 芯片与基础硬件

  1. Serial flasher config
    • Flash size:16MB(硬件 16MB flash)
    • PSRAM mode:Octal PSRAM
    • PSRAM clock:80MHz
  1. Component config → ESP PSRAM
    • ✅ Support external SPI RAM
    • ✅ Map rodata to PSRAM(日志里提示复制模型到 PSRAM,必须开启)
    • ✅ Map instruction to PSRAM(可选,释放内部 RAM)

② BSP 板卡选择(关键)

Component config → ESP BSP → Board selection

  • 选中:ESP32-S3-EYE

不要选其他板子,否则引脚宏全部错乱

③ 摄像头 Camera 配置(OV3660 专属)

Component config → ESP Camera

  1. Camera sensor type:OV3660
  2. Pixel format:RGB565(匹配 LCD 显示格式)
  3. Frame size:推荐 QVGA (320×240) / 480×360;人脸识别不要开太高分辨率
  4. XCLK frequency:20MHz(和硬件 XCLK 15 脚输出匹配)
  5. DVP GPIO override:关闭(我们已经在 BSP 头文件写死引脚,这里不要覆盖)
  6. SCCB I2C port:I2C0(SDA=4,SCL=5 固定)

④ LCD & LVGL 配置

Component config → ESP BSP → Display

  1. ✅ Enable display support(必须开启,禁用则无屏幕)
  2. Backlight LEDC channel:1(代码里 timer=1,保持一致)
  3. LVGL 配置:
    • ✅ Enable LVGL GUI library
    • LVGL buffer placement:PSRAM(画面帧缓存放外部内存)
    • Tick period ms:10(默认即可)

⑤ ESP-WHO 人脸识别框架配置

Component config → ESP-WHO

  1. Model storage location:PSRAM(模型大,必须放 PSRAM)
  2. Face recognition database:
    • 存储介质:SPIFFS / FATFS Flash(二选一,默认 SPIFFS 够用)
    • Max registered faces:可改成 30(支持最多 30 张人脸录入)
  1. Inference optimization:
    • ✅ Use PSRAM for model tensor buffer
    • Quantization type:int8(S3 最优速度)

⑥ 串口调试

Component config → ESP System Settings

  • Console UART:UART0,TX=43 RX=44(原厂默认,不要改,否则串口无法打印)

⑦ 内存与编译优化(防内存溢出)

Component config → Compiler options

  • Stack size of main task:≥8192
  • Enable extra heap tracing(调试内存泄漏可选)

3、app_main.cpp 最小标准代码

#include "frame_cap_pipeline.hpp" #include "who_recognition_app_lcd.hpp" #include "who_spiflash_fatfs.hpp" using namespace who::frame_cap; using namespace who::app; extern "C" void app_main(void) { vTaskPrioritySet(xTaskGetCurrentTaskHandle(), 5); #if CONFIG_DB_FATFS_FLASH ESP_ERROR_CHECK(fatfs_flash_mount()); #elif CONFIG_DB_SPIFFS ESP_ERROR_CHECK(bsp_spiffs_mount()); #endif auto frame_cap = get_dvp_frame_cap_pipeline(); auto recognition_app = new WhoRecognitionAppLCD(frame_cap); recognition_app->run(); }

4、编译烧录流程

# 清理旧编译缓存 idf.py clean # 编译 idf.py build # 烧录+串口监视 idf.py flash monitor
http://www.jsqmd.com/news/1071628/

相关文章:

  • Java Stream API 并行性能优化
  • 单用拓扑图能给出零件每个面的语义吗
  • Rust的#[derive(Default)]初始化
  • agent中记忆系统总结Memory
  • Redis 内存管理与分配策略
  • 基于Microchip AN3553的嵌入式G代码解析与运动控制实践指南
  • 网络安全架构设计
  • Dolphin:在电脑和手机上玩 GameCube 和 Wii 游戏
  • 智慧水文监测平台
  • 时序数据库 TDengine 支撑会泽卷烟厂核心生产环节智能化转型
  • CTF -信息收集
  • Microchip Curiosity开发板硬件接口深度解析与实战应用指南
  • Java CompletableFuture 并发执行模式
  • Web安全技术分析:源码泄露与备份文件利用全纪
  • [github]cursor导入项目失败,由于使用http2协议,修改为http1.1
  • 【Springboot毕设全套源码+文档】基于vue+springboot智慧教育系统(丰富项目+远程调试+讲解+定制)
  • 拆解 Claude Code SubAgent:隔离、专业化与权限设计
  • 【Harness Engineering(1)】如何判断一个系统是否真的进入上下文工程
  • c# GDI+
  • 山海鲸可视化 v4.7.7 重磅发布
  • 软件分析管理中的洞察发现过程
  • 智能分析+预警推送+自动研判,AI在声誉管理中的三大应用场景
  • Python asyncio 并发文件操作优化
  • 服务端渲染水合:客户端激活与状态同步的处理逻辑
  • SpringBoot 定时任务统一处理微信提现、订单状态同步(无人饺子机后台实战)
  • Ubuntu26.04下Loki与Spring Boot集成实战指南
  • 软件开发的伦理问题与社会责任思考
  • Java性能监控与诊断工具使用
  • 移动端混合开发实战
  • Android 开发者为什么必须掌握 AI 能力?端侧视角下的技术变革