#include "custom_prephrals.h" #include #include "ov2640.h" #include "fx_api.h" #define OV2640_I2C_ADDR 0x60 #define PICTURE_BUFFER_SIZE 60000 uint32_t picture[PICTURE_BUFFER_SIZE]; extern "C" { VOID fx_ggeta_driver(FX_MEDIA *media_ptr); } FX_MEDIA sdio_disk; FX_FILE file; UINT status; UINT media_memory[1024]; int main() { cam_board_init(); cam_resetb.set_high(); cam_pdwn.set_low(); led1.set_high(); delay_ms(200, true); auto ret = sdmmc2.sdmmc_init(); while (ret != HAL_OK) ret = sdmmc2.sdmmc_init(); led1.set_low(); ov2640_start(); status = fx_media_open(&sdio_disk, "STM32_SDIO", fx_ggeta_driver, 0, (VOID *) media_memory, sizeof(media_memory)); 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(); int pic_cnt = 0; status = 0; // status = fx_media_open(&sdio_disk, (char *) "STM32_SDIO", fx_ggeta_driver, 0, (VOID *) media_memory, sizeof(media_memory)); 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(300, 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 delay.delay_ms(1000); dma10.dma_stop(); dcmi.capture_disable(); dcmi.disable(); 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) { break; } } if (i == 4 * PICTURE_BUFFER_SIZE - 1) { continue; } // cam_pdwn.set_high(); // TIM1->CCER &= ~TIM_CCER_CC1E; std::string file_name = "picture" + std::to_string(pic_cnt) + ".jpg"; pic_cnt++; status = fx_file_create(&sdio_disk, (char *) file_name.c_str()); if (status == FX_ALREADY_CREATED) { // delete file and create empty file status = fx_file_delete(&sdio_disk, (char *) file_name.c_str()); status = fx_file_create(&sdio_disk, (char *) file_name.c_str()); } status = fx_file_open(&sdio_disk, &file, (char *) file_name.c_str(), FX_OPEN_FOR_WRITE); status = fx_file_seek(&file, 0); status = fx_file_write(&file, (uint8_t *) picture, i+1); status = fx_file_close(&file); status = fx_media_flush(&sdio_disk); // status = fx_media_close(&sdio_disk); if (status != FX_SUCCESS) { status = 0; continue; } status = 0; led2.set_high(); delay.delay_ms(100); led2.set_low(); memset(picture, 0, PICTURE_BUFFER_SIZE * 4); // TIM1->CCER |= TIM_CCER_CC1E; // cam_pdwn.set_low(); } }