This repository has been archived on 2024-05-28. You can view files and clone it, but cannot push or open issues or pull requests.
2023-11-14 16:25:09 -05:00

75 lines
2.0 KiB
C++
Executable File

#include "bsp.h"
#include "custom_prephrals.h"
#include "prepherials.h"
#include <cstdio>
#include "ov2640.h"
#include <cstring>
//#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");
}
}
}