В настоящее время я использую плату обнаружения 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 читать только каждый второй байт?
Это решило бы мою проблему. Но я не уверен, как это сделать.
Есть ли другой способ?
Любые предложения приветствуются!
С уважением
@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 доллара. Во встроенном ПО часто требуется немного внешнего оборудования, хотя с каждым годом это уменьшается, и этого следует избегать.
Первый способ с DCMI
Сконфигурируйте DMA для циклического приема по 4 байта. Каждый DMA TC irq копирует второй байт из буфера DMA в другой большой буфер.
Второй способ без DCMI
Вы можете получать байты приема от порта данных с помощью сигналов VSYNC, HSYNC и HREF, так что вы можете запускать таймер с помощью сигнала HREF с PSC = 1 и событием сравнения (должно быть настроено для соответствия второму байту) из любого канала, поворачивающего DMA, чтобы получить один байт. Таймер должен быть включен сигналом VSYNC для события сравнения соответствия с порядком байтов.
Заключение
Я предпочитаю второй способ, потому что он будет более эффективным для экономии энергии.