#include "bsp.h" #include "custom_prephrals.h" #include "prepherials.h" #include #include "ov2640.h" #include //#define cam_i2c i2c3 #define OV2640_I2C_ADDR 0x60 #define PICTURE_BUFFER_SIZE 60000 uint32_t picture[PICTURE_BUFFER_SIZE]; int main() { system_init(); setup_prepherials(); setup_pins(), setup_timer(), cam_i2c.init(); led3.set_high(); led1.set_high(); cam_resetb.set_high(); cam_pdwn.set_low(); delay.delay_ms(10); ov2640_start(); led2.toggle(); delay.delay_ms(100, true); dma10.init(86, DMA_DATA_WIDTH_32_BITS, DMA_DATA_WIDTH_32_BITS, DMA_ADDR_FIX, DMA_ADDR_INC, DMA_TYPE_PREPHERIAL, DMA_TYPE_MEMORY, PICTURE_BUFFER_SIZE * 5); dcmi.init_old(); while (1) { dma10.dma_start((uint32_t) &DCMI->DR, (uint32_t) picture, 4 * PICTURE_BUFFER_SIZE); // first few frames may cause green screen, if so we can extend the Delay to skip them. delay_ms(100, true); // wait for camera to be ready -- skip first frame 12.5fps = 80ms dcmi.enable(); dcmi.capture_enable(); delay_s(2, true); // wait for picture to be captured then stop dma // dma_stop(dcmi_dma); // disable(dcmi_p); auto *tmp = (uint8_t *) picture; uint32_t i = 0; for (i = 0; i < 4 * PICTURE_BUFFER_SIZE - 1; i++) { if (tmp[i] == 0xff && tmp[i + 1] == 0xd9) { printf("%lu\n", i); break; } } cam_pdwn.set_high(); cam_resetb.set_low(); if (i == 4 * PICTURE_BUFFER_SIZE - 1) i = 0; // if (uart_send_massive(usart1_p, (uint8_t *) picture, i + 5) != HAL_OK) // printf("no enough space in uart buffer\n"); memset(picture, 0, sizeof(picture)); // delay_s(2, true); printf("%lu\n", i); // tim1.tim_out_enable(); TIM1->CCER &= ~TIM_CCER_CC1E; led2.set_low(); while (1) { asm volatile ("wfi"); } } }