Как настроить периферийное устройство DCMI на STM32H7 - PullRequest
0 голосов
/ 21 ноября 2018
  1. Как настроить периферийное устройство DCMI для получения изображения / видео активного поля?
  2. Как получить только Y-часть (серое видео) из оцифрованного потока?
  3. Как настроить внешний декодер?
  4. Как определить разрешение камеры?

1 Ответ

0 голосов
/ 21 ноября 2018

Настройка периферийного устройства DCMI для получения изображения активного поля \ видео:

(этот код лучше смотреть с документацией о том, что эти регистры делают в разделенном окне)

// 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-битный, вы получите 2-пиксельное цветное изображение, используя Y0:Cb0:Cr0 и Y1:Cb0:Cr0.Где Y - это значение яркости (> яркости) -> это значение, которое вы хотите для полутонового видео.Вот что делает эта часть:

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

Из 32-битного слова мы извлекаем каждый второй (0x1 << 16) четный (0x1 << 18) байт. </p>

Оставшаяся часть тривиальна:

// 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...