这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 【ESP32P4】3编译M5Tab5-UserDemo

共1条 1/1 1 跳转至

【ESP32P4】3编译M5Tab5-UserDemo

高工
2026-06-21 18:47:37     打赏

M5Stack Tab5 编译M5Tab5-UserDemo完整记录

【前言】

昨开我实现lvgl的完整移植,但是摄像头一直没有驱动好,在官方的M5Tab5-UserDemo上是可以实现的。因此编译这个demo非常有必要。经过一天的偿试终于给编译通过,并跑起来了,特此记录。

适用版本:M5Tab5-UserDemo(github.com/m5stack/M5Tab5-UserDemo) 硬件:M5Stack Tab5(ESP32-P4 主控 + ESP32-C6 无线) IDF 版本:ESP-IDF v5.4.2(实测也兼容 v5.5.3) 编写日期:2026-06-21(项目调试踩坑实录)


目录

  1. 硬件环境准备

  2. 软件环境准备

  3. 下载项目与依赖

  4. 关键编译参数修改

  5. 编译

  6. 烧录与运行

  7. 常见编译问题

  8. 常见运行问题

  9. 修改摄像头参数

  10. 项目目录结构


1. 硬件环境准备

1.1 板子

  • M5Stack Tab5 主控板(型号 K145)

    • 主控:ESP32-P4NRW32(RISC-V 双核 360MHz)

    • 无线协处理器:ESP32-C6-MINI-1U(Wi-Fi 6 / BLE 5)

    • Flash:16MB Octal

    • PSRAM:32MB Octal(200MHz)

    • 屏幕:5 寸 MIPI-DSI IPS 触控,1280x720

    • 板载摄像头:SC2356 MIPI-CSI(在项目中以 SC202CS 驱动运行)

    • 音频:ES8388 DAC + ES7210 ADC(四麦克风阵列)

    • 传感器:BMI270(IMU)、INA226(电池监测)、RX8130(RTC)

1.2 USB 连接

  • 用 USB-C 数据线把 Tab5 接电脑

  • 串口驱动:Tab5 内置 USB-Serial-JTAG,免驱(CH340/CP210x 等外置 USB 转串芯片不需要)

  • 在 Windows 设备管理器里找到串口(比如 COM3、COM7),烧录/监控时用 idf.py -p COMx flash monitor

1.3 摄像头注意事项

  • 板子出厂就有 SC2356 摄像头

  • 不需要外接任何东西

  • 摄像头通过 io_expander (PI4IOE5V6408) 上电,所以摄像头初始化必须在 IO Expander 初始化之后


2. 软件环境准备

2.1 Windows 安装 ESP-IDF

推荐用 ESP-IDF Windows Installer(C:\Espressif\tools\idf-exe\1.0.3\idf.ps1),它会注册一个 PowerShell 命令:

# 进入项目目录
cd D:\M5_Tab5\M5Tab5-UserDemo\platforms\tab5

# 激活 ESP-IDF(每次新开 PowerShell 都要执行)
& 'C:\Espressif\tools\idf-exe\1.0.3\idf.ps1'

激活后 idf.py、esptool.py、xtensa-esp-elf-gdb 等命令自动可用。

2.2 ESP-IDF 路径要求

路径用途
C:\esp\v5.4.2\esp-idfESP-IDF 源码(项目要求的版本)
C:\Espressif\toolsESP-IDF 工具链(ccache、cmake、esp-clang、python venv 等)
C:\Espressif\tools\python\v5.4.2\venv\Scripts\python.exeIDF Python 解释器
C:\Espressif\tools\idf-exe\1.0.3\idf.ps1PowerShell 激活脚本

2.3 项目要求的 IDF 版本

# platforms/tab5/main/idf_component.yml
idf: '>=5.3'

实测可用 IDF v5.4.2(项目原始指定)或 v5.5.3(已验证)。


3. 下载项目与依赖

3.1 下载主项目

cd D:\
git clone --depth 1 https://github.com/m5stack/M5Tab5-UserDemo.git
cd M5Tab5-UserDemo

或下载 zip 解压到 D:\M5_Tab5\M5Tab5-UserDemo。

3.2 拉依赖子模块

项目依赖 4 个外部组件,通过 fetch_repos.py 拉取(脚本读取 repos.json):

  • mooncake(GUI 框架)

  • mooncake_log(日志)

  • lvgl(LVGL v9.2.2)

  • smooth_ui_toolkit

cd D:\M5_Tab5\M5Tab5-UserDemo
python fetch_repos.py

依赖会被拉到 dependencies/ 目录:

dependencies/
  lvgl/
  mooncake/
  mooncake_log/
  smooth_ui_toolkit/

注意:lvgl 仓库体积大(~50MB),网络不稳定时 git clone 可能超时,可以手动 git clone 后放到该位置。

3.3 目录结构

M5Tab5-UserDemo/
  app/               # 桌面 app(launcher、启动动画等)
  dependencies/         # fetch_repos.py 拉的子组件
  platforms/
    desktop/          # 桌面模拟构建
    tab5/            # 真机编译目录 ← 重点
      components/      # 项目自带 ESP-IDF components
        esp_cam_sensor/ # 摄像头驱动(含 SC202CS = SC2356)
        esp_video/     # V4L2 视频子系统
        esp_ipa/      # 图像处理算法
        esp_sccb_intf/  # SCCB 总线
        esp_lcd_st7121/ 
        # LCD 驱动
        espressif__esp_lvgl_port/
        imlib/          # 图像处理库
        m5stack_tab5/     # BSP
        sensor_bmi270/    # IMU
        sensor_icm20602/
        power_monitor_ina226/
        keypad_scanner_tca8418/
        ...                # 还有 wifi_c6_fw/(SDIO slave firmware)
      main/                 # 应用主程序
        app_main.cpp
        hal/              # HAL 抽象层
      CMakeLists.txt
      partitions.csv
      sdkconfig             # 已生成的配置(改这里 → build)
      sdkconfig.defaults    # 默认配置(改这里 → 全员共享)
      dependencies.lock     # component manager 锁文件
  fetch_repos.py

4. 关键编译参数修改

这部分是项目能在 ESP-IDF v5.5.3 + ESP32-P4 + ESP32-C6(SDIO2)板上跑通的核心改动。直接编辑 platforms/tab5/sdkconfig.defaults 把以下行追加到文件末尾(或编辑 sdkconfig):

4.1 修 I2C legacy driver 冲突(IDF v5.5+ 必须)

# 跳过新旧 I2C driver 冲突检查
CONFIG_I2C_SKIP_LEGACY_CONFLICT_CHECK=y
# 关闭 ESP Codec Dev 旧 I2C 兼容
# CONFIG_CODEC_I2C_BACKWARD_COMPATIBLE is not set

作用:不修这个会启动后立即 abort:E i2c: CONFLICT! driver_ng is not allowed to be used with this old driver

4.2 选对音频 Codec(Tab5 板载硬件决定)

Tab5 用 ES8388(喇叭 DAC) + ES7210(麦克风 ADC),其它一律关闭:

# Tab5 实际 codec (audio player + codec_dev 探测用)
CONFIG_CODEC_ES8388_SUPPORT=y
CONFIG_CODEC_ES7210_SUPPORT=y

# 其它 codec 关闭(节省 flash,避免误识别)
# CONFIG_CODEC_ES8311_SUPPORT is not set
# CONFIG_CODEC_ES7243_SUPPORT is not set
# CONFIG_CODEC_ES7243E_SUPPORT is not set
# CONFIG_CODEC_ES8156_SUPPORT is not set
# CONFIG_CODEC_AW88298_SUPPORT is not set
# CONFIG_CODEC_ES8374_SUPPORT is not set
# CONFIG_CODEC_TAS5805M_SUPPORT is not set

验证方法:看 m5stack_tab5.c 里实际调用了哪些 *_codec_new():

// components/m5stack_tab5/m5stack_tab5.c:822
const audio_codec_if_t* es8388_dev = es8388_codec_new(&es8388_cfg);
// line 860
const audio_codec_if_t* es7210_dev = es7210_codec_new(&es7210_cfg);

4.3 SDIO 引脚(关键:Tab5 用 SDIO2 不用 SDIO1)

ESP-Hosted 用 SDIO 接 ESP32-C6,Tab5 板子的引脚跟 ESP32-P4 Function EV-Board 不一样:

信号EV-Board(参考)Tab5(实际)
CLK1812
CMD1913
D01411
D11510
D2169
D3178
RESET5415
CONFIG_ESP_HOSTED_SDIO_PIN_CLK=12
CONFIG_ESP_HOSTED_SDIO_PIN_CMD=13
CONFIG_ESP_HOSTED_SDIO_PIN_D0=11
CONFIG_ESP_HOSTED_SDIO_PIN_D1=10
CONFIG_ESP_HOSTED_SDIO_PIN_D2=9
CONFIG_ESP_HOSTED_SDIO_PIN_D3=8
CONFIG_ESP_HOSTED_GPIO_SLAVE_RESET_SLAVE=15

不改会出现的错误:

E sdmmc_common: sdmmc_init_ocr: send_op_cond (1) returned 0x107
HINT: Please reboot the board and then try again

4.4 ESP-Hosted slave target(必须是 ESP32-C6)

CONFIG_ESP_HOSTED_IDF_SLAVE_TARGET="esp32c6"
CONFIG_SLAVE_IDF_TARGET_ESP32C6=y
# CONFIG_SLAVE_IDF_TARGET_ESP32 is not set
CONFIG_SLAVE_IDF_TARGET_ARCH_RISCV=y
# CONFIG_SLAVE_IDF_TARGET_ARCH_XTENSA is not set

不改会出现的错误:

E transport: Identified slave [esp32c6] != Expected [esp32]
              run 'idf.py menuconfig' at host to reselect the slave?
              Aborting..

4.5 启用 SC202CS sensor 驱动(支持 SC2356)

重要发现:Tab5 板载摄像头是 SC2356,但 Espressif 没有独立的 SC2356 driver。SC2356 在驱动上等同 SC202CS,README.md 也明确写了:

| SC202CS(SC2356) | 1600 x 1200 | MIPI | 8/10-bit Raw RGB data | 1/5.1" |
# Tab5 板载 SC2356 用 SC202CS 驱动
CONFIG_CAMERA_SC202CS=y

不改会出现的错误:

============= video init ==============
============= video open ==============
E camera: Open video failed
E camera: video cam open failed
Guru Meditation Error: Core 1 panic'ed (Instruction access fault)

4.6 完整 sdkconfig.defaults 改动(汇总)

# 在 platforms/tab5/sdkconfig.defaults 末尾追加

# --- 1. I2C legacy conflict skip ---
CONFIG_I2C_SKIP_LEGACY_CONFLICT_CHECK=y
# CONFIG_CODEC_I2C_BACKWARD_COMPATIBLE is not set

# --- 2. Codec 选择 ---
CONFIG_CODEC_ES8388_SUPPORT=y
CONFIG_CODEC_ES7210_SUPPORT=y
# CONFIG_CODEC_ES8311_SUPPORT is not set
# CONFIG_CODEC_ES7243_SUPPORT is not set
# CONFIG_CODEC_ES7243E_SUPPORT is not set
# CONFIG_CODEC_ES8156_SUPPORT is not set
# CONFIG_CODEC_AW88298_SUPPORT is not set
# CONFIG_CODEC_ES8374_SUPPORT is not set
# CONFIG_CODEC_TAS5805M_SUPPORT is not set

# --- 3. SDIO 引脚 (Tab5 实际) ---
CONFIG_ESP_HOSTED_SDIO_PIN_CLK=12
CONFIG_ESP_HOSTED_SDIO_PIN_CMD=13
CONFIG_ESP_HOSTED_SDIO_PIN_D0=11
CONFIG_ESP_HOSTED_SDIO_PIN_D1=10
CONFIG_ESP_HOSTED_SDIO_PIN_D2=9
CONFIG_ESP_HOSTED_SDIO_PIN_D3=8
CONFIG_ESP_HOSTED_GPIO_SLAVE_RESET_SLAVE=15

# --- 4. ESP-Hosted slave target ---
CONFIG_ESP_HOSTED_IDF_SLAVE_TARGET="esp32c6"
CONFIG_SLAVE_IDF_TARGET_ESP32C6=y
# CONFIG_SLAVE_IDF_TARGET_ESP32 is not set
# CONFIG_SLAVE_IDF_TARGET_ARCH_XTENSA is not set
CONFIG_SLAVE_IDF_TARGET_ARCH_RISCV=y

# --- 5. 摄像头 sensor (SC2356 = SC202CS) ---
CONFIG_CAMERA_SC202CS=y

重要:改完 sdkconfig.defaults 后,不要跑 idf.py menuconfig 或 idf.py reconfigure —— 它们会用 Kconfig 的 default 重算,可能覆盖掉上述手动配置。直接 idf.py build 即可。


5. 编译

5.1 激活 ESP-IDF 环境

cd D:\M5_Tab5\M5Tab5-UserDemo\platforms\tab5
& 'C:\Espressif\tools\idf-exe\1.0.3\idf.ps1'

提示符变成 (venv) PS D:...\tab5 即激活成功。

5.2 第一次编译(或改了 sdkconfig.defaults 后)

# 第一次必须清 build,否则 set-target 会报 "build/ 存在但不是 CMake build"
Remove-Item -Recurse -Force .\build -ErrorAction SilentlyContinue
idf.py set-target esp32p4
idf.py build

首次编译耗时 10-30 分钟(LVGL + mooncake + ESP-Video + 全部 sensor 都进二进制)。

5.3 增量编译(只改了代码,没改 SDK config)

idf.py build

5.4 编译成功标志

输出最后会看到类似:

Project build complete. To flash, run:
 idf.py -p COMx flash
or
 idf.py -p COMx -b 460800 flash

5.5 编译产物

  • build/m5stack_tab5.bin —— 主固件

  • build/m5stack_tab5.elf —— ELF 调试文件

  • build/bootloader/bootloader.bin —— 2nd stage bootloader

  • build/partition_table/partition-table.bin —— 分区表

  • build/flash_project_args —— idf.py flash 自动读这个文件决定烧哪些 bin

5.6 ESP32-C6 WiFi slave firmware(板载已烧,通常不用动)

ESP-Hosted 需要 ESP32-C6 上有匹配的 SDIO slave firmware,项目自带在:

platforms/tab5/wifi_c6_fw/
  ESP32C6-WiFi-SDIO-Interface-V1.4.1-96bea3a_0x0.bin
  flash.sh

板子出厂时这个 firmware 已经烧好,不需要重新烧。如果遇到 SDIO 通信故障排查,可以重烧(需要让 C6 进 download mode,Tab5 板上没有专用按钮)。


6. 烧录与运行

6.1 烧录 + 打开串口监视

idf.py -p COMx flash monitor
  • -p COMx 改成实际的串口号(设备管理器里查看)

  • flash 烧录,monitor 烧完后启动串口监视器(看到 boot log + 后续运行 log)

  • 退出 monitor 按 Ctrl + ]

6.2 启动后正常 boot log 关键节点

I (832)  boot: Loaded app from partition at offset 0x10000
I (1061) esp_psram: Found 32MB PSRAM device
I (1062) esp_psram: Speed: 200MHz
I (1676) main_task: Started on CPU0
[info] [hal] init
[info] [hal] camera init
[info] [hal] i2c init
[info] [hal] io expander init
[info] [hal] codec init
I (2062) ES7210: Work in Slave mode
I (2147) ES8388: Start on mode:2
[info] [hal] imu init
I (2441) bmi270: Set sensors odr and range
[info] [hal] display init
I (3873) M5STACK_TAB5: ST7123 Display initialized with resolution 720x1280
[info] [hal] wifi init
sdio_wrapper: GPIOs: CLK[12] CMD[13] D0[11] D1[10] D2[9] D3[8] Slave_Reset[15]
I (7789) transport: Identified slave [esp32c6]
wifi: Wi-Fi AP started. SSID:M5Tab5-UserDemo-WiFi
esp_netif_lwip: DHCP server started on interface WIFI_AP_DEF with IP: 192.168.4.1

这些都出现 = 系统启动正常。AP 模式开启后,你可以用手机连 M5Tab5-UserDemo-WiFi(无密码)测 wifi。


7. 常见编译问题

7.1 idf.py set-target 报错 "build/ directory exists but not CMake build"

Directory 'D:\M5_Tab5\M5Tab5-UserDemo\platforms\tab5\build' doesn't seem to be a CMake build directory.
Refusing to automatically delete files in this directory.
Delete the directory manually to 'clean' it.

解决:

Remove-Item -Recurse -Force .\build -ErrorAction SilentlyContinue
idf.py set-target esp32p4

7.2 fetch_repos.py 时 lvgl clone 超时

fatal: unable to access 'https://github.com/lvgl/lvgl.git/': Failed to connect

解决:多次重试,或者手动 git clone 后放到 dependencies/lvgl/:

git clone --depth 1 -b v9.2.2 https://github.com/lvgl/lvgl.git
mv lvgl dependencies/lvgl

7.3 编译时 I2C driver conflict(没修 4.1)

参考 §4.1,加 CONFIG_I2C_SKIP_LEGACY_CONFLICT_CHECK=y。

7.4 编译时找不到 esp_video / esp_cam_sensor

这两个 component 是项目自带,如果 git pull 时被覆盖,重新 clone 项目即可。

7.5 idf.py menuconfig 后改动丢失

menuconfig 会按 Kconfig 的 default 重算所有未"显式 set"的值。如果你手动改了 sdkconfig 又跑了 menuconfig,改动可能被覆盖。

解决:重要改动写到 sdkconfig.defaults(持久化),并避免不必要地跑 menuconfig。


8. 常见运行问题

8.1 启动后 Core 1 panic + I2C conflict

参考 §4.1。

8.2 SDIO timeout 0x107

参考 §4.3(SDIO 引脚)和 §4.4(slave target)。也可能是 C6 slave firmware 损坏,但 Tab5 出厂不会坏。

8.3 Camera App 打开后崩

参考 §4.5(SC202CS sensor)。

8.4 WiFi 起不来

  • 检查 §4.3 引脚

  • 检查 §4.4 slave target

  • 确认板载 ESP32-C6 模块没坏(可以靠近路由器,如果其他设备能找到 C6 热点说明 C6 还活着)

8.5 LCD 显示异常(花屏、偏移)

修改屏驱动时区:

// m5stack_tab5.c:1207
esp_lcd_panel_mirror(disp_panel, false, true);

或调整 partitions.csv 里 factory app size。

8.6 触摸不准

修改 esp_lcd_touch_config_t:

// m5stack_tab5.c:1463
const esp_lcd_touch_config_t tp_cfg = {
    .x_max        = BSP_LCD_H_RES,    // 1280
    .y_max        = BSP_LCD_V_RES,    // 720
    .rst_gpio_num = -1,
    .int_gpio_num = 23,
    .mirror_x     = false,            // 改这两个翻转
    .mirror_y     = false,
};

9. 修改摄像头参数

9.1 改分辨率

platforms/tab5/main/hal/components/hal_camera.cpp:

#define CAMERA_WIDTH  1280    // 改这里
#define CAMERA_HEIGHT 720     // 改这里

要支持的所有分辨率列表在 Kconfig:

CONFIG_CAMERA_SC202CS_MIPI_RAW8_1280x720_30FPS=y      ← 默认
CONFIG_CAMERA_SC202CS_MIPI_RAW8_1600x1200_30FPS=y
CONFIG_CAMERA_SC202CS_MIPI_RAW10_1600x1200_30FPS=y
CONFIG_CAMERA_SC202CS_MIPI_RAW10_1600x900_30FPS=y

9.2 改输出格式

// hal_camera.cpp
int video_cam_fd = app_video_open(CAM_DEV_PATH, EXAMPLE_VIDEO_FMT_RGB565);
//                                                 ↑ 改成其它格式

可选:

typedef enum {
    EXAMPLE_VIDEO_FMT_RAW8   = V4L2_PIX_FMT_SBGGR8,
    EXAMPLE_VIDEO_FMT_RAW10  = V4L2_PIX_FMT_SBGGR10,
    EXAMPLE_VIDEO_FMT_GREY   = V4L2_PIX_FMT_GREY,
    EXAMPLE_VIDEO_FMT_RGB565 = V4L2_PIX_FMT_RGB565,    // ← 默认
    EXAMPLE_VIDEO_FMT_RGB888 = V4L2_PIX_FMT_RGB24,
    EXAMPLE_VIDEO_FMT_YUV422 = V4L2_PIX_FMT_YUV422P,
    EXAMPLE_VIDEO_FMT_YUV420 = V4L2_PIX_FMT_YUV420,
} example_fmt_t;

9.3 加摄像头回调(比如拍照存 SD 卡)

修改 app_camera_display 函数,在 ppa_do_scale_rotate_mirror 之后加:

// 拍照保存
if (拍照触发) {
    FILE* f = fopen("/sdcard/capture.bmp", "wb");
    // 写 BMP header + RGB565 -> BMP888 转换
    fwrite(buf, 1, size, f);
    fclose(f);
}

9.4 改 LCD 显示摄像头画面大小

platforms/tab5/main/hal/components/hal_camera.cpp:

uint16_t screen_width  = 1280;
uint16_t screen_height = 720;
uint8_t* img_show_data = NULL;
uint32_t img_show_size = screen_width * screen_height * 2;  // RGB565 = 2 bytes/pixel

9.5 加人脸检测

imlib 已经在 components 里,可以用:

#include "imlib.h"

image_t img = { .w=1280, .h=720, .pixfmt=PIXFORMAT_RGB565, .data=img_show->data };
rect_t r = { .x=0, .y=0, .w=1280, .h=720 };
// human_face_detector->detect(&img, &r);

10. 项目目录结构(关键文件)

D:\M5_Tab5\M5Tab5-UserDemo\
  README.md                                    # 英文原版 readme
  README_工程使用手册.md                       # 本文档
  fetch_repos.py                               # 拉 dependencies
  repos.json                                   # 依赖列表
  app/                                         # 桌面 app
    app_installer.h
    app_generator.py
    apps/
      app_launcher/                        # 启动器(主桌面)
      app_startup_anim/                    # 开机动画
      app_template/
  dependencies/                                # 4 个子组件(fetch_repos.py 拉)
    lvgl/                                    # v9.2.2
    mooncake/                                # GUI framework
    mooncake_log/                            # log
    smooth_ui_toolkit/
  platforms/
    tab5/                                    # ★ 真机编译目录
      CMakeLists.txt                       # 顶层 CMake
      sdkconfig                            # 已生成的配置
      sdkconfig.defaults                   # 默认配置 ← 改这里
      partitions.csv                       # 分区表
      dependencies.lock                    # 组件锁
      main/                                # 应用代码
        app_main.cpp
        CMakeLists.txt
        idf_component.yml
        hal/                             # HAL 抽象
          hal_esp32.cpp                # 初始化顺序总控
          hal_esp32.h
          components/
            hal_camera.cpp            # 摄像头初始化
            hal_wifi.cpp              # WiFi
      components/                          # 12 个项目自带 component
        esp_cam_sensor/                  # 摄像头 sensor 驱动
          Kconfig                      # Kconfig 入口
          CMakeLists.txt               # 条件编译
          sensors/
            sc202cs/                 # ← SC2356 用这个
              Kconfig.sc202cs
              sc202cs.c
              include/
              private_include/
                sc202cs_settings.h   # ← 有 SC2356 init reglist 注释
            sc2336/
            ov2640/, ov5645/, ...
        esp_video/                       # V4L2 video subsystem
        esp_ipa/                         # 图像处理算法
        esp_sccb_intf/                   # SCCB I2C interface
        esp_lcd_st7121/                  # LCD 驱动(ST7121/ST7123)
        m5stack_tab5/                    # BSP
          m5stack_tab5.c               # ← GPIO/I2C/SDIO/Codec/IO Expander
          esp_lcd_st7123.c
          Kconfig
          include/bsp/m5stack_tab5.h   # ← GPIO 宏定义
        sensor_bmi270/                   # IMU
        sensor_icm20602/
        power_monitor_ina226/             # 电池监测
        keypad_scanner_tca8418/          # I2C keypad
        espressif__esp_lvgl_port/         # LVGL port
        imlib/                           # 图像处理
      wifi_c6_fw/                          # ESP32-C6 SDIO slave firmware
        ESP32C6-WiFi-SDIO-Interface-V1.4.1-96bea3a_0x0.bin
        flash.sh                          # 出厂已烧,不需要重新烧

附录 A:完整编译烧录脚本

保存为 build_and_flash.ps1:

# M5Stack Tab5 编译烧录脚本
# 用法: powershell -ExecutionPolicy Bypass -File build_and_flash.ps1 -Port COM7

param(
    [string]$Port = "COM7"
)

$ErrorActionPreference = "Stop"
$ProjectDir = $PSScriptRoot

Write-Host "=== M5Stack Tab5 编译烧录脚本 ===" -ForegroundColor Green
Write-Host "项目目录: $ProjectDir"
Write-Host "目标串口: $Port"
Write-Host ""

# 1. 激活 ESP-IDF 环境
Write-Host "[1/5] 激活 ESP-IDF..." -ForegroundColor Yellow
& 'C:\Espressif\tools\idf-exe\1.0.3\idf.ps1'

# 2. 检查 fetch_repos
if (-not (Test-Path "$ProjectDir\..\..\dependencies\lvgl")) {
    Write-Host "[2/5] 拉 dependencies..." -ForegroundColor Yellow
    Push-Location "$ProjectDir\..\.."
    python fetch_repos.py
    Pop-Location
} else {
    Write-Host "[2/5] dependencies 已存在,跳过" -ForegroundColor Gray
}

# 3. 切到编译目录
Set-Location $ProjectDir

# 4. 编译
Write-Host "[3/5] 编译..." -ForegroundColor Yellow
idf.py build
if ($LASTEXITCODE -ne 0) {
    Write-Host "编译失败!" -ForegroundColor Red
    exit 1
}

# 5. 烧录 + 监控
Write-Host "[4/5] 烧录到 $Port ..." -ForegroundColor Yellow
idf.py -p $Port flash
if ($LASTEXITCODE -ne 0) {
    Write-Host "烧录失败!" -ForegroundColor Red
    exit 1
}

# 6. 打开 monitor
Write-Host "[5/5] 打开 monitor (Ctrl+] 退出)..." -ForegroundColor Yellow
idf.py -p $Port monitor

附录 B:关键文件改对照表

改什么改哪里备注
屏幕方向 / 镜像m5stack_tab5.c esp_lcd_panel_mirror
摄像头分辨率hal_camera.cpp CAMERA_WIDTH/HEIGHT
摄像头输出格式hal_camera.cpp EXAMPLE_VIDEO_FMT_xxx
GPIO 复用m5stacktab5.h BSP*_xxx 宏
WiFi SSID / 密码hal_wifi.cpp
SDIO 引脚sdkconfig.defaults 或 sdkconfig关键 6 个 + RESET
Codec 选择sdkconfig.defaults只留 ES8388 + ES7210
Camera sensorsdkconfig.defaultsCONFIG_CAMERA_SC202CS=y
Slave targetsdkconfig.defaultsesp32c6
触摸方向m5stack_tab5.c esp_lcd_touch_config_t mirror_x/y
LVGL logsdkconfig.defaultsCONFIG_LV_USE_LOG=y

附录 C:踩坑记录(本工程调试过程实录)

  1. I2C conflict: ESP-IDF v5.5 启用新 I2C driver_ng,但 esp_cam_sensor 等组件仍编旧 driver。CONFIG_I2C_SKIP_LEGACY_CONFLICT_CHECK=y 跳过守卫。

  2. Codec 选错: 默认 sdkconfig 启用了 ES8311/ES8374/... 等 8 个 codec,但 Tab5 实际只用 ES8388 + ES7210。其他 6 个关掉,否则 BSP 找不到匹配的 codec。

  3. SDIO 引脚错配: 项目默认走 ESP32-P4 Function EV-Board 的引脚(CLK=18/CMD=19/D0=14/...),但 Tab5 板子的 P4↔C6 走 SDIO2 复用,实际是 G12/G13/G11/G10/G9/G8。

  4. Slave target 错配: 默认 SDK 期望 ESP32 当 slave,但 Tab5 上是 ESP32-C6。改 SLAVE_IDF_TARGET=ESP32C6。

  5. Camera 识别失败: Tab5 板载 SC2356,但 Espressif 没单独 SC2356 driver;SC2356 复用 SC202CS driver(README.md 表格明确说明)。

  6. SDK config vs menuconfig: Kconfig 有 conditional default,手动改 sdkconfig 会被 menuconfig/reconfigure 重算。改完改 sdkconfig.defaults 持久化,build 前不要再跑 menuconfig。

  7. fetch_repos 网络: lvgl ~50MB clone 不稳定,可手动 git clone 后放到 dependencies/lvgl/。


附录 D:调试快捷命令

# 只看错误和警告
idf.py -p COMx monitor 2>&1 | Select-String "E \(|W \("

# 只看关键子系统日志
& 'C:\Espressif\tools\idf-exe\1.0.3\idf.ps1'
idf.py -p COMx monitor | Select-String "M5STACK_TAB5|transport|sc202cs|wifi:|sdmmc|esp_psram"

# 烧完直接重启板子(不发 Ctrl+R)
# 在 monitor 里按 Ctrl+T,再按 Ctrl+F 直接 reset

# 看分区表
Get-Content D:\M5_Tab5\M5Tab5-UserDemo\platforms\tab5\partitions.csv

# 看当前 sdconfig 生效值
Get-Content D:\M5_Tab5\M5Tab5-UserDemo\platforms\tab5\sdkconfig | Select-String "CAMERA|SDIO|HOSTED|CODEC_ES"

# 单独烧录 ESP32-C6 SDIO slave firmware(慎重,板载已烧好)
cd D:\M5_Tab5\M5Tab5-UserDemo\platforms\tab5\wifi_c6_fw
& 'C:\Espressif\tools\idf-exe\1.0.3\idf.ps1'
esptool.py --chip esp32c6 -p COMx write_flash 0x0 ESP32C6-WiFi-SDIO-Interface-V1.4.1-96bea3a_0x0.bin

【实验效果】

image.png




关键词: ESP32P4     M5Tab5-UserDemo    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]