veydlin
@veydlin
Мне никогда не жалко средств на свое любопытство

DCMI + DMA + OV7670 — как забрать данные?

Не могу забрать данные, на дисплее выводиться черный экран
Контроллер 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
  • Вопрос задан
  • 2360 просмотров
Решения вопроса 1
veydlin
@veydlin Автор вопроса
Мне никогда не жалко средств на свое любопытство
Надо обновить версию HAL
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы