Question
STM32L4R7VI DCMI with large image resolution
Hi Community,
I'm trying to get an image from a camera with a resolution of 752x480.
In this case, the size (752 * 480) / 4 = 90240 exceeds the maximum DMA transfer length 65535.
And I get a broken image:

1/4 of the image is duplicated.
Original image:
DMA MemToMem initialization:
void MX_DMA_Init(void)
{
/* DMA controller clock enable */
__HAL_RCC_DMAMUX1_CLK_ENABLE();
__HAL_RCC_DMA1_CLK_ENABLE();
__HAL_RCC_DMA2_CLK_ENABLE();
/* Configure DMA request hdma_memtomem_dma2_channel1 on DMA2_Channel1 */
hdma_memtomem_dma2_channel1.Instance = DMA2_Channel1;
hdma_memtomem_dma2_channel1.Init.Request = DMA_REQUEST_MEM2MEM;
hdma_memtomem_dma2_channel1.Init.Direction = DMA_MEMORY_TO_MEMORY;
hdma_memtomem_dma2_channel1.Init.PeriphInc = DMA_PINC_ENABLE;
hdma_memtomem_dma2_channel1.Init.MemInc = DMA_MINC_ENABLE;
hdma_memtomem_dma2_channel1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma_memtomem_dma2_channel1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
hdma_memtomem_dma2_channel1.Init.Mode = DMA_NORMAL;
hdma_memtomem_dma2_channel1.Init.Priority = DMA_PRIORITY_HIGH;
if (HAL_DMA_Init(&hdma_memtomem_dma2_channel1) != HAL_OK)
{
Error_Handler();
}
/* DMA interrupt init */
/* DMA1_Channel5_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);
/* DMA2_Channel1_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA2_Channel1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA2_Channel1_IRQn);
}DCMI initialization:
void MX_DCMI_Init(void)
{
hdcmi.Instance = DCMI;
hdcmi.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE;
hdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_FALLING;
hdcmi.Init.VSPolarity = DCMI_VSPOLARITY_LOW;
hdcmi.Init.HSPolarity = DCMI_HSPOLARITY_LOW;
hdcmi.Init.CaptureRate = DCMI_CR_ALL_FRAME;
hdcmi.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B;
hdcmi.Init.JPEGMode = DCMI_JPEG_DISABLE;
hdcmi.Init.ByteSelectMode = DCMI_BSM_ALL;
hdcmi.Init.ByteSelectStart = DCMI_OEBS_ODD;
hdcmi.Init.LineSelectMode = DCMI_LSM_ALL;
hdcmi.Init.LineSelectStart = DCMI_OELS_ODD;
if (HAL_DCMI_Init(&hdcmi) != HAL_OK)
{
Error_Handler();
}
}
void HAL_DCMI_MspInit(DCMI_HandleTypeDef* dcmiHandle)
{
__HAL_RCC_DCMI_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
.......
Pins initialization....
.....
/* DCMI DMA Init */
/* DCMI Init */
hdma_dcmi.Instance = DMA1_Channel5;
hdma_dcmi.Init.Request = DMA_REQUEST_DCMI;
hdma_dcmi.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_dcmi.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_dcmi.Init.MemInc = DMA_MINC_ENABLE;
hdma_dcmi.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma_dcmi.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
hdma_dcmi.Init.Mode = DMA_CIRCULAR;
hdma_dcmi.Init.Priority = DMA_PRIORITY_HIGH;
if (HAL_DMA_Init(&hdma_dcmi) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(dcmiHandle,DMA_Handle,hdma_dcmi);
/* DCMI interrupt Init */
HAL_NVIC_SetPriority(DCMI_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(DCMI_IRQn);
/* USER CODE BEGIN DCMI_MspInit 1 */
/* USER CODE END DCMI_MspInit 1 */
}
}
In main:
extern DMA_HandleTypeDef hdma_memtomem_dma2_channel1;
extern DCMI_HandleTypeDef hdcmi;
hdcmi.DMAM2M_Handle = &hdma_memtomem_dma2_channel1;
uint8_t buf[ 752 * 480 ];
HAL_DCMI_DisableCrop( &hdcmi );
HAL_DCMI_Start_DMA( &hdcmi, DCMI_MODE_SNAPSHOT, (uint32_t)buf, 752 * 480 / 4 );Does DCMI in STM32L4R7 support this resolution?
If so, what could be the problem?
