Не могу забрать данные, на дисплее выводиться черный экран
Контроллер STM32F429
Чтобы не отпугивать людей, выложу только основную функцию:
// DCMI
DCMI_HandleTypeDef OV7670_hdcmi_eval;
void DCMI_DMA_init(void){
GPIO_InitTypeDef GPIO_InitStruct;
static DMA_HandleTypeDef hdma;
DCMI_HandleTypeDef *hdcmi = &OV7670_hdcmi_eval;
// Тактирование
__DCMI_CLK_ENABLE();
__DMA2_CLK_ENABLE();
__GPIOE_CLK_ENABLE();
__GPIOA_CLK_ENABLE();
__GPIOC_CLK_ENABLE();
__GPIOD_CLK_ENABLE();
__DCMI_CLK_ENABLE();
__DMA2_CLK_ENABLE();
// Настройка DCMI портов (вырезано для экономии места)
// DCMI
hdcmi->Init.SynchroMode = DCMI_SYNCHRO_HARDWARE;
hdcmi->Init.CaptureRate = DCMI_CR_ALL_FRAME;
hdcmi->Init.HSPolarity = DCMI_HSPOLARITY_LOW;
hdcmi->Init.SynchroMode = DCMI_SYNCHRO_HARDWARE;
hdcmi->Init.VSPolarity = DCMI_VSPOLARITY_HIGH;
hdcmi->Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B;
hdcmi->Init.PCKPolarity = DCMI_PCKPOLARITY_RISING;
hdcmi->Init.JPEGMode = DCMI_JPEG_DISABLE;
hdcmi->Instance = DCMI;
// DMA
hdma.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma.Init.PeriphInc = DMA_PINC_DISABLE;
hdma.Init.MemInc = DMA_MINC_ENABLE;
hdma.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma.Init.Mode = DMA_NORMAL;
hdma.Init.Priority = DMA_PRIORITY_HIGH;
hdma.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
hdma.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
hdma.Init.MemBurst = DMA_MBURST_SINGLE;
hdma.Init.PeriphBurst = DMA_PBURST_SINGLE;
hdma.Instance = DMA2_Stream1;
// Связываем DMA с DCMI
__HAL_LINKDMA(hdcmi, DMA_Handle, hdma);
// Прерывание по завершении передачи
HAL_NVIC_SetPriority(DCMI_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(DCMI_IRQn);
// Прерывание при полном приеме
HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn);
// Инициализация DMA с DCMI
HAL_DCMI_Init(hdcmi);
HAL_DMA_Init(hdcmi->DMA_Handle);
// Включение DMA с DCMI
__HAL_DCMI_ENABLE(&OV7670_hdcmi_eval);
__HAL_DMA_ENABLE(OV7670_hdcmi_eval.DMA_Handle);
}
Данные забираю этой функцией
// Обновить буфер
void OV7670_update(void){
HAL_DCMI_Start_DMA(&OV7670_hdcmi_eval, DCMI_MODE_SNAPSHOT, (uint32_t)&OV7670_buffer, IMG_ROWS * IMG_COLUMNS * 2 / 4);
}
Прерывание DCMI_IRQHandler вызывается. После каждого вызова OV7670_update() срабатывает DMA2_Stream1_IRQHandler