如何在STM32H7上配置DCMI外设

How to configure DCMI peripheral on STM32H7

  1. 如何配置 DCMI 外围设备以获取活动字段 image\video?
  2. 如何从数字化流中只获取 Y 部分(灰度视频)?
  3. 如何设置外接解码器?
  4. 如何确定相机的分辨率?

配置DCMI外设以获取活动字段image\video:

(最好查看此代码,并附上有关此寄存器在拆分中的作用的文档 window)

// enable DCIM peripheral clock
RCC->AHB2ENR |= RCC_AHB2ENR_DCMIEN;

// disable DCIM
DCMI->CR = 0;

// NOTE: configure AVID
DCMI->CWSTRTR = 0;
// set top margin offset (VST)
DCMI->CWSTRTR |= ((18 - 1) << 16);
// set lef margin offset (HOFFCNT)
DCMI->CWSTRTR |= ((83 * 2 - 1) << 0);

DCMI->CWSIZER = 0;
// set height of active video (VLINE)
DCMI->CWSIZER |= ((220 - 1) << 16);
// set width of active video (CAPCNT)
DCMI->CWSIZER |= ((700 * 2 - 1) << 0);

为什么我们将水平 AVID 参数乘以 2,因为外设将查看 PIXCLK 时钟的数量,其中 2 个等于 1 个像素。

从数字化流中提取 Y 部分:

4:2:2 格式如何? 这是

Y1 Cr0 Y0 Cb0
Y3 Cr2 Y2 Cb2

每一个都是8位的,用Y0:Cb0:Cr0Y1:Cb0:Cr0就可以得到2像素的彩色图片。其中 Y - 是一个 luma(亮度)值 -> 这个值是你想要的灰度视频。 这就是这部分的作用:

// set Y-only
DCMI->CR |= (0x1 << 16);
DCMI->CR |= (0x1 << 18);

我们从 32 位字中提取每隔 (0x1 << 16) 个偶数 (0x1 << 18) 个字节。

剩下的部分是微不足道的:

// choose data mode (8-bit = 0)
DCMI->CR |= (0x0 << 10);
// capture every 4 frame ( 4frames = 2 , 2frames = 1)
DCMI->CR |= (0x0 << 8);
// set polarity for VSCLK HSCLK PXCLK (0x1 = high)
DCMI->CR |= (0x1 << 7) | (0x1 << 6) | (0x0 << 5);
// choose synchornization (hardware = 0)
DCMI->CR |= (0x0 << 4);
// set AVID (enable = 1)
DCMI->CR |= (0x1 << 2);
// set capture mode (shanpshot = 1)
DCMI->CR |= (0x0 << 1);
// configure HSYNC interrupt
DCMI->IER = 0;
// configure IT lineComplete VSYNC frameComplete
DCMI->IER |= (0x1 << 4) | (0x1 << 3) | (0x1 << 0);
// enable IT for DCMI
// NVIC_EnableIRQ(DCMI_IRQn);
// NVIC_SetPriority(DCMI_IRQn, 1);

// enable DCIM
DCMI->CR |= (0x1 << 14);
// enable Capture
DCMI->CR |= (0x1 << 0);