DVP 普通模式捕获示例

功能说明

本示例演示如何使用 LISA DVP 驱动的普通模式捕获图像数据,使用单缓冲区进行连续帧捕获。

硬件连接

  • PAD_A 10: HSYNC

  • PAD_A 11: VSYNC

  • PAD_A 12: PCLK

  • PAD_A 13-20: D0-D7(8位数据总线)

  • PAD_A 26: MCLK

连接支持 DVP 接口的摄像头模块(如 GC032A)。

示例步骤

  1. 获取 DVP 设备

  2. 配置 DVP 参数(分辨率 640x480、YUV422 格式、信号极性等)

  3. 启用时钟输出(为摄像头提供 25MHz MCLK)

  4. 清空缓冲区,启动 DVP 普通模式捕获

  5. 通过回调函数处理接收到的图像数据,重载缓冲区实现连续捕获

  6. 捕获 10 帧后自动停止

编译

重要提示:编译前需要先确认当前示例支持的目标板型,然后将板型标识传给 -DBOARD。请按以下方式选择:

  1. 确认示例限制:查看当前示例 README 中的硬件连接和注意事项,确认是否限定板型。

  2. 参考示例配置:查看相关示例目录下的 sample.yaml,确认支持的板型。

  3. 填写板型标识:SDK 内置板型的标识为 boards/ 下的目录名。例如实际使用的板型目录为 boards/<板型名称>/,则编译参数填写为 -DBOARD=<板型名称>

在 SDK 根目录执行编译,并将命令中的 <示例路径><板型名称> 替换为实际值。

Linux 使用 build.sh

# 通用命令
./build.sh -C -S samples/<示例路径> -DBOARD=<板型名称>

# 示例:使用 arcs_evb 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_evb

Windows PowerShell 使用 build.ps1

# 通用命令
.\build.ps1 -C -S samples/<示例路径> -DBOARD=<板型名称>

# 示例:使用 arcs_evb 开发板
.\build.ps1 -C -S samples/<示例路径> -DBOARD=arcs_evb

Note

确保已安装对应平台的工具链和 ListenAI 开发工具包。Windows 环境请先执行 .\env.ps1 或直接使用 .\build.ps1 自动加载环境。

注意事项-DBOARD 填写的是板型标识,不是芯片系列名称。如果示例有板型专用配置或额外编译参数,以示例 README 中的说明为准。

烧录

编译完成后,使用 SDK tools/burn 目录下的 cskburn 工具烧录固件。请先根据目标板型和当前示例确定芯片系列、串口设备、烧录地址和固件路径。

Linux:

# 通用命令
./tools/burn/cskburn -C <芯片系列> -s <串口设备> -b 3000000 <烧录地址> <固件路径>

# 示例:使用 arcs_evb 开发板
./tools/burn/cskburn -s /dev/ttyUSB0 -b 3000000 0x0 build/arcs.bin -C arcs

Windows PowerShell:

# 通用命令
.\tools\burn\cskburn.exe -C <芯片系列> -s <串口号> -b 3000000 <烧录地址> <固件路径>

# 示例:使用 arcs_evb 开发板
.\tools\burn\cskburn.exe -C arcs -s COM7 -b 3000000 0x0 .\build\arcs.bin

Note

烧录参数说明

  • -s /dev/ttyUSB0 / -s COM7:串口设备路径,需要根据实际情况修改 - Linux 系统:通常是 /dev/ttyUSB0/dev/ttyACM0 - 可通过 ls /dev/tty* 命令查看可用串口设备 - Windows 系统:通常是 COM7COM8 等,可在“设备管理器”的“端口”中查看 - 不同开发板或 USB 转串口芯片可能使用不同的设备名

  • -b 3000000:烧录波特率(3Mbps)

  • 0x0:烧录起始地址

  • build/arcs.bin / .\build\arcs.bin:编译生成的固件路径

  • -C arcs:芯片类型

注意事项

  • 确保开发板已正确连接到电脑

  • 如果无法识别串口设备,请检查 USB 连接线是否正常,或尝试其他 USB 端口

预期输出

========================================
  LISA DVP Driver Sample - Normal Mode
========================================
Frame format: YUV422
Resolution: 640x480
Max frames: 10

DVP device obtained
DVP setup completed (DMA channel: 2)
DVP clockout enabled (25MHz)
DVP capture started (normal mode)
Frame size: 640x480, buffer size: 614400 bytes
Waiting for frames...
Frame 1 captured, size=614400 bytes
Frame data: XX XX XX XX XX XX XX XX
...
Frame 10 captured, size=614400 bytes
Reached maximum capture frames, stopping...
DVP stopped successfully

========================================
Capture completed, total frames: 10
========================================

核心 API

API

说明

lisa_dvp_setup()

初始化并配置 DVP 设备

lisa_dvp_enable_clockout()

启用时钟输出

lisa_dvp_start()

启动普通模式捕获

lisa_dvp_reload()

重载缓冲区(在回调中调用)

lisa_dvp_stop()

停止捕获

关键代码

/* 配置 DVP 参数 */
lisa_dvp_config_t config = {
    .width = 640,
    .height = 480,
    .format = LISA_DVP_FORMAT_YUV422,
    .dma_channel = 2,
    .vsync_polarity = LISA_DVP_POLARITY_RISING,
    .hsync_polarity = LISA_DVP_POLARITY_RISING,
    .pclk_polarity = LISA_DVP_POLARITY_RISING,
};
lisa_dvp_setup(dvp_dev, &config, dvp_callback, NULL);

/* 启动普通模式捕获 */
lisa_dvp_start(dvp_dev, frame_buffer, sizeof(frame_buffer));

/* 回调中重载缓冲区 */
static void dvp_callback(lisa_dvp_event_t event, void *user_data)
{
    if (event == LISA_DVP_EVENT_DONE) {
        /* 处理帧数据 */
        lisa_dvp_reload(dvp_dev, frame_buffer, sizeof(frame_buffer));
    }
}

注意事项

  1. 缓冲区对齐:帧缓冲区必须 4 字节对齐

  2. 缓冲区位置:帧缓冲区放在 PSRAM 中以节省 SRAM 空间

  3. 缓冲区大小:必须足够容纳一帧完整数据(640x480x2 = 614400 字节)

  4. 重载时机:必须在回调函数中及时重载缓冲区,否则会停止捕获

  5. 回调上下文:回调函数在中断上下文中执行,应避免耗时操作