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

90 lines
3.0 KiB
C++
Executable File

#include "custom_prephrals.h"
#include <string>
#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();
}
}