Использование DMA для чтения каждого второго байта только из DCMI

В настоящее время я использую плату обнаружения STM32F4 и камеру OV7670.
Используя DCMI и DMA на плате обнаружения, мне удалось получить фотографии.

Камера установлена ​​в режим YCbCr422 (поэтому 4 байта для 2 пикселей), но в конце я извлекаю из нее только байт Y, чтобы получить оттенки серого / монохромный образ.

Моя проблема заключается в следующем:
Из-за ограниченного объема оперативной памяти на плате Discovery мне удалось получать изображения только в разрешении QCIF (176 x 144).

На плате Discovery имеется 192 КБ SRAM, которые распределены по 3 блокам: 112 КБ + 16 КБ + 64 КБ.
Таким образом, самый большой блок смежных блоков составляет 112 КБ.

Я оценил следующие потребности в памяти (в байтах) для разных разрешений камеры:

  • QCIF 160×121:
    RAM USED:
    4 байта 2 пиксель: 38720 — только оттенки серого: 19360

  • QVGA 320×240:
    RAM USED:
    4 байта 2 пикселя: 153600 — только оттенки серого: 76800

  • VGA 640×480:
    RAM USED:
    4 байта 2 пикселя: 614400 — только оттенки серого: 307200

Так что VGA просто невозможен.
При использовании 4 байтов для 2 пикселей только QCIF помещается в первый блок RAM. Однако, если можно использовать только байт в градациях серого, QVGA также подойдет!

Я не нашел режим для камеры, чтобы выводить только изображения в градациях серого. Поэтому мне нужно найти другой способ сделать это (если это возможно).

Таким образом, DCMI всегда читает 4 байта, которые соответствуют значениям YUV: Y0, Cb, Y1, Cr

DMA сохраняет их в моей памяти и увеличивает после каждого шага. Мне нужен был бы только каждый второй байт DCMI, так есть ли способ сказать DMA читать только каждый второй байт?
Это решило бы мою проблему. Но я не уверен, как это сделать.

Есть ли другой способ?
Любые предложения приветствуются!

С уважением

3

Решение

@robo С 8-битным интерфейсом, я не думаю, что вы будете делать это с одним DMA, как вы указали.

Set your HDMI DMA to bring data into a short buffer (say 1K)
Set interrupts for half and full buffer
Use mem->mem DMA to transfer alternate bytes to your final buffer
m->m is set to word in, byte out

Вероятно, лучше избавиться от ненужных данных, прежде чем они попадут на ваш процессор

 Run 2 shift registers (SRa and SRb) connected by 8 bits in parallel
SRa  is a SIPO  SRB is a PISO (SIPO = Serial in , Parallel out)
Clock SRa at the incoming bitspeed
Clock SRb at half the speed
Latch the data from SRa to SRb once every 16 bit times
SRb feeds the 8 bits you want to the DMA

Все это может управляться таймерами и GPIO на вашем процессоре.

Вы выбираете, какой байт синхронизировать строб передачи.

Два устройства серии 74xx595 сделают свое дело, просто проверьте рейтинг скорости. Это будет стоить около 1 доллара. Во встроенном ПО часто требуется немного внешнего оборудования, хотя с каждым годом это уменьшается, и этого следует избегать.

1

Другие решения

Первый способ с DCMI

Сконфигурируйте DMA для циклического приема по 4 байта. Каждый DMA TC irq копирует второй байт из буфера DMA в другой большой буфер.

Второй способ без DCMI

Вы можете получать байты приема от порта данных с помощью сигналов VSYNC, HSYNC и HREF, так что вы можете запускать таймер с помощью сигнала HREF с PSC = 1 и событием сравнения (должно быть настроено для соответствия второму байту) из любого канала, поворачивающего DMA, чтобы получить один байт. Таймер должен быть включен сигналом VSYNC для события сравнения соответствия с порядком байтов.

Заключение

Я предпочитаю второй способ, потому что он будет более эффективным для экономии энергии.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector