4. 智能相机图像传感器接口与驱动

STM32N6 作为面向边缘视觉的 MCU,其图像采集链路的核心任务是把传感器输出的像素流稳定、低延迟地搬进内存,并让曝光与帧节奏可控。本章围绕 MIPI CSI-2/DCMI 接口时序、I2C 寄存器配置、全局快门与卷帘快门传感器的初始化差异、DMA 双缓冲采集以及帧同步与曝光控制展开,目标是让读者能够独立完成一条可运行的采集通路。

一、接口选择:MIPI CSI-2 与 DCMI 的定位

STM32N6 提供 DCMI(Digital Camera Interface)并配合 CSI-2 接收能力,实际工程中常见两种接法:一是传感器以并行 DVP 输出,直接接入 DCMI;二是传感器以 MIPI CSI-2 差分输出,经 PHY 后进入 CSI 控制器。DCMI 的时序由 PIXCLK、HSYNC、VSYNC 三根信号定义:PIXCLK 每个有效边沿采样一位数据,HSYNC 标记一行起止,VSYNC 标记一帧起止。配置时必须确认采样边沿(上升沿或下降沿)、数据宽度(8/10/12/14 bit)以及 HSYNC/VSYNC 极性,否则会出现整帧错位或图像撕裂。

MIPI CSI-2 则采用差分对传输,数据以包为单位,包含长包(图像行)和短包(帧起始 FS、帧结束 FE、行起始 LS、行结束 LE)。CSI-2 的时序不再由外部 HSYNC/VSYNC 引脚直接给出,而是由协议层解析。STM32N6 的 CSI 控制器需要配置虚拟通道号、数据格式(RAW8/RAW10/RAW12、YUV422、RGB565 等)以及 PHY 的 lane 数量与速率。若传感器输出 RAW10,则每 4 个像素打包为 5 字节,接收端必须按相同规则解包,否则像素值会整体偏移。

STM32N6 图像采集信号链与双缓冲数据流 图像传感器 全局/卷帘快门 RAW8/10/12 I2C 配置通道 SCL/SDA 100~400kHz 接口层 DCMI: PIXCLK/HSYNC/VSYNC CSI-2: Lane0/1 + CLK DCMI/CSI 控制器 格式解包/裁剪 帧/行同步解析 DMA 双缓冲 Buf0 / Buf1 交替 半传输/传输完成中断 帧缓冲区 AXI SRAM / PSRAM DCMI 时序要点: VSYNC ↓ 帧开始 HSYNC ↓ 行有效 PIXCLK 采样边沿 DMA 半传输中断 帧完成中断

二、I2C 传感器配置:从地址到寄存器写入

传感器上电后处于默认状态,必须通过 I2C 写入一系列寄存器才能输出预期格式。典型流程是:先确认 7 位从机地址(常见 0x21、0x36、0x30 等,部分器件可通过 SID 引脚切换),再读取 Chip ID 寄存器验证通信正常,然后依次配置时钟分频、PLL、输出格式、分辨率、曝光与增益。以一款常见的 1280×800 全局快门传感器为例,其 Chip ID 寄存器为 0x0000,期望值为 0x56;若读回 0x00 或 0xFF,说明地址错误或总线未上拉。

I2C 写入通常采用“寄存器地址高字节 + 低字节 + 数据”的 16 位地址格式。STM32 HAL 库中可用 HAL_I2C_Mem_Write() 完成,注意 MemAddressSize 设为 I2C_MEMADD_SIZE_16BIT。配置顺序上,应先关闭流输出(如写入 0x0100 = 0x00),再改分辨率与格式,最后重新使能,避免在输出过程中改参数导致帧错乱。若传感器支持分组参数保持(Group Hold),可在一次写入中锁定多组寄存器,再统一生效。

// 示例:I2C 写入 16 位寄存器地址
uint8_t buf[2] = {0x01, 0x00}; // 寄存器 0x0100
uint8_t val = 0x00;            // 关闭流输出
HAL_I2C_Mem_Write(&hi2c1, 0x21 << 1, 0x0100,
                  I2C_MEMADD_SIZE_16BIT, &val, 1, 100);

三、全局快门与卷帘快门的初始化差异

全局快门(Global Shutter)所有像素在同一时刻曝光,适合拍摄运动物体,不会产生果冻效应。其初始化重点在于曝光时间寄存器与帧长寄存器的配合:曝光时间不能超过帧长,否则会拖慢帧率。卷帘快门(Rolling Shutter)逐行曝光,初始化时需额外关注行时间与帧率的关系,以及是否开启自动曝光。对于卷帘快门,若曝光时间大于一帧时间,会出现多帧叠加或亮度异常,因此通常要求曝光时间 ≤ 帧周期。

两类传感器在寄存器层面还有一个关键差异:全局快门常提供“触发模式”寄存器,可配置为自由运行或外部触发;卷帘快门则更多依赖内部时序发生器。若系统需要多相机同步,应优先选择支持外部触发/同步信号的全局快门传感器,并将触发源接到 STM32N6 的定时器输出或 GPIO。

四、DMA 双缓冲采集与帧同步

DCMI/CSI 接收到的像素数据通过 DMA 搬入内存。单缓冲模式下,CPU 必须在下一帧到来前处理完当前帧,否则会丢帧。双缓冲(Double Buffer)则让 DMA 在 Buf0 和 Buf1 之间交替写入:当 Buf0 写满时触发半传输中断,CPU 可处理 Buf0,同时 DMA 继续写 Buf1;Buf1 写满时触发传输完成中断,CPU 处理 Buf1,DMA 回到 Buf0。这样 CPU 有整整一帧的时间做图像处理。

配置时需注意:DMA 目标地址应 32 字节对齐,以匹配 AXI 总线突发;帧缓冲区大小 = 宽 × 高 × 每像素字节数,RAW10 需按 5/4 倍计算。若使用 STM32N6 的 Cache,必须在 DMA 写入后、CPU 读取前执行 SCB_InvalidateDCache_by_Addr(),否则可能读到旧数据。帧同步方面,可利用 DCMI 的 VSYNC 中断或 CSI 的帧起始短包中断来标记帧边界,配合定时器实现固定帧率采集。

双缓冲的“半传输”和“传输完成”中断分别对应 Buf0 和 Buf1 就绪。若只使用传输完成中断,则每两帧才能处理一次,实时性下降一半。

五、曝光控制与帧率权衡

曝光控制通常通过写传感器的曝光时间寄存器实现,单位可能是行数或微秒。以行数为单位时,曝光时间 = 行数 × 行时间;行时间由 PIXCLK、HTS(水平总周期)决定。例如 PIXCLK = 72 MHz,HTS = 1600,则行时间 ≈ 22.2 μs;若曝光寄存器写 400,则曝光约 8.9 ms。帧率 = 1 / (VTS × 行时间),VTS 为垂直总周期。若曝光时间接近帧周期,需增大 VTS 或降低帧率,否则会出现曝光不足或帧撕裂。

实际调试时,可先固定增益,只调曝光,观察图像亮度是否线性变化;再固定曝光,调增益,观察噪声变化。若画面出现横向条纹,通常是曝光时间与光源频率(如 50 Hz 工频)不同步,可尝试将曝光时间设为 10 ms 的整数倍,或启用传感器的抗闪烁模式。

参数典型示例值影响
PIXCLK72 MHz决定行时间与数据吞吐
HTS1600行总周期,影响行时间
VTS1000帧总周期,影响帧率
曝光行数400曝光时间 ≈ 8.9 ms
帧率≈ 45 fps1 / (1000 × 22.2 μs)

综合来看,一条稳定的采集链路需要接口时序正确、I2C 配置完整、DMA 双缓冲就绪、曝光与帧率匹配。建议在 bring-up 阶段先用低分辨率、低帧率验证通路,再逐步提高参数,并用示波器观察 PIXCLK 与 VSYNC 的相位关系,用逻辑分析仪抓取 I2C 写入序列,确保每一步都有可观测的验证点。