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

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

Войти через центр авторизации
Похожие вопросы