В данной библиотеке описывается подключение модуля цифровой камеры 1,3МПикселя (на базе контроллера OV9655) с использованием DMA через интерфейс DCMI к отладочной плате TM32F4 Discovery.
Стоимость модуля на Ebay составляет примерно 15 евро. Камера имеет разрешение 1280х1024 (SXGA) и глубину цвета 16 бит. Связь с чипом осуществляется через I2C (400кГц максимум), а данные изображения передаются по 8ми битной шине DCMI. Поддерживаются 15 и 30 кадров в секунду.
В данной статье автор реализует просмотр изображения на ЖК-дисплее, на данный момент имеются библиотеки для работы с QVGA дисплеем (320×240) и QQVGA (160×120). Передача осуществляется через DMA для разгрузки процессора и более плавного отображения на дисплее (на данный момент картинка отображается зеркально). Версия библиотеки 1.1 позволяет сохранять снимки. Если выбрано разрешение 160х120 пикселей, снимок может быть сохранен в оперативную память. Полученное изображение может быть в итоге может быть преобразовано из массива в памяти в BMP формат с помощью библиотеки “UB_OV9655_RAM2BMP”. Данные могут быть переданы через UART (для этого требуется подключение UART-библиотеки).
Примечание: некоторые DCMI-порты процессора на модуле Discovery уже заняты кодеком CS43L22 и акселерометром LIS302 (PA4, PA6, PB6, PB9, PC7). Проблем с работой камеры замечено не было, однако, две микросхемы, наверное, одновременно не могут быть использованы.
Важное замечание по отладочной плате: При использовании отладочной платы необходимо переподключить два пина. Стандартное подключение DCMI (CON6) предусматривает использование D2 и D3 на пинах процессора PE0 и PE1. Но эти порты используются для обработки прерываний LIS302 и линии всегда подтянуты к низкому уровню!! Автор подключает эти линии к выводам PC8 и PC9, которые также являются линиями D2 и D3 шины DCMI.
Ещё одно замечание: 18 пиновый разъем CON6, помеченный как OV9655, не совсем совместим по пинам, поэтому необходимо припаять переходник. Модуль камеры требует подачи частоты (10-48МГц). В примере используется генератор 16МГц, по умолчанию используется 24МГц, но у автора его не было:-) Для работы с дисплеем и I2C-шиной используется две библиотеки «STM32_UB_LCD_ST7783» и «STM32_UB_I2C1». Для отображения на QQVGA используется библиотека версии 1.5.
Пример исполнения:
Используемые выводы и DMA:
PA4 -> DCMI_HSYNC = Camera HSYNC (HREF)
PA6 -> DCMI_PCLK = Camera PIXCLK (PCLK)
PB6 -> DCMI_D5 = Camera D5 (D7)
PB7 -> DCMI_VSYNC = Camera VSYNC (VSYNC)
PB8 -> I2C1-SCL = Camera I2C-SCL (SIOC)
PB9 -> I2C1-SDA = Camera I2C-SDA (SIOD)
PC6 -> DCMI_D0 = Camera D0 (D2)
PC7 -> DCMI_D1 = Camera D1 (D3)
PC8 -> DCMI_D2 = Camera D2 (D4)
PC9 -> DCMI_D3 = Camera D3 (D5)
PE4 -> DCMI_D4 = Camera D4 (D6)
PE5 -> DCMI_D6 = Camera D6 (D8)
PE6 -> DCMI_D7 = Camera D7 (D9)
(*) Текст в скобках соответствует выводу на модуле OV9655
DMA : или DMA2_STREAM1_CHANNEL1
или DMA2_STREAM7_CHANNEL1
Camera (GND) = GND
Camera (Vcc) = 3,3V
Camera (XCLK) = 24MHz (10…48MHz)
Camera (PWDN) = nc
Camera (RET) = nc
Требуемые библиотеки:
Подключаемые модули CooCox-IDE: DCMI, DMA
Поддерживаемые библиотеки: STM32_UB_I2C1, STM32_UB_LCD_ST7783
Перечисления:
typedef enum {
OV9655_OK =0, // OV9655 OK
OV9655_I2C_ERR, // Ошибка I2C
OV9655_MIDH_ERR, // Ошибка ID-HIByte
OV9655_MIDL_ERR, // Ошибка ID-LoByte
OV9655_PID_ERR, // Ошибка Produkt-ID
OV9655_LCD_ERR // Ошибка Display
}OV9655_ERR_t;
Функции:
OV9655_ERR_t UB_OV9655_Init(void); // Инициализация OV9655
void UB_OV9655_CaptureStart(void); // Запуск режима Capture
void UB_OV9655_CaptureStop(void); // Остановка режима Capture
void UB_OV9655_Snapshot(void); // Сделать один снимок
void UB_OV9655_SetHelligkeit(uint8_t wert); // Регулировка яркости
void UB_OV9655_Snapshot2RAM(void); // Сохранить снимок в памяти
void UB_OV9655_RAM2BMP(void); // Создать файл в формате BMP
Пример использования:
//—————————————————————
// File : main.c
// Datum : 29.03.2013
// Version : 1.0
// Autor : UB
// EMail : mc-4u(@)t-online.de
// Web : www.mikrocontroller-4u.de
// CPU : STM32F4
// IDE : CooCox CoIDE 1.7.0
// Module : CMSIS_BOOT, M4_CMSIS_CORE
// Funktion : Demo der OV9655-Library (Camera per DCMI)
// Hinweis : Diese zwei Files muessen auf 8MHz stehen
// «cmsis_boot/stm32f4xx.h»
// «cmsis_boot/system_stm32f4xx.c»
//—————————————————————
#include «main.h»
#include «stm32_ub_ov9655.h»
int main(void)
{
OV9655_ERR_t check;
SystemInit(); // Инициализация настроек кварца
// Инициализация модуля камеры (OV9655)
check=UB_OV9655_Init();
if(check==OV9655_OK) {
// Если прошла успешно -> Запуск в режиме Capture
UB_OV9655_CaptureStart();
}
else {
// Если ошибка
// Сделать экран красным
UB_LCD_FillScreen(RGB_COL_RED);
}
while(1)
{
}
}
В приложении проект CooCox и отдельная библиотека для использования в других проектах. Автор оригинала статьи просит задавать вопросы на его сайте на немецком или английских языках.
Прикрепленные файлы:
- ub_stm32f4_dcmi_ov9655_v101_rus.rar (15 Кб)
- Demo_27_DCMI_OV9655_rus.rar (260 Кб)