从 DCMI 到外部 SDRAM 的数据传输有问题(OVERRUN 标志)。
我有 STM32H753,它在 AN5020 中有这样的架构:
(应用笔记,STM32 MCU 的数码相机接口 (DCMI))
因此它通过 DMA1/2 和 D2-D1 桥在 DCMI 和 FMC 之间建立连接。
很好,但是...
当我将帧 320x240@RGB888 从 DCMI 发送到 SDRAM 时,
我得到 HAL_DCMI_GetError 值 0x41 (HAL_DCMI_ERROR_DMA | HAL_DCMI_ERROR_OVR)
在 HAL_DMA_GetError 中值为 0x00 (HAL_DMA_ERROR_NONE)。
DCMI 和 DMA 的配置:
- hdcmi.Instance = DCMI;
- hdcmi.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE;
- hdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_RISING;
- hdcmi.Init.VSPolarity = DCMI_VSPOLARITY_HIGH;
- 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;
- ...
- hdma_dcmi.Instance = DMA1_Stream0;
- 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_NORMAL;
- hdma_dcmi.Init.Priority = DMA_PRIORITY_VERY_HIGH;
- hdma_dcmi.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
- hdma_dcmi.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
- hdma_dcmi.Init.MemBurst = DMA_MBURST_SINGLE;
- hdma_dcmi.Init.PeriphBurst = DMA_PBURST_SINGLE;
一些系统信息:
- 系统时钟 = 400Mhz
- AXI/HCLK = 400Mhz
- FMC = 200Mhz(SDRAM @ 100Mhz)
- SDRAM(is42s16800,12位地址,16位数据)
- STM32Cube FW_H7 V1.6.0
一些测试:
- DMA1(外设到内存)从 DCMI 到 RAM_D2(内部)中的缓冲区,它可以工作,帧 320x240x3 需要 78-83 毫秒
- DMA1(内存到内存)从 RAM_D2 中的缓冲区到 SDRAM 中的缓冲区,它工作并且对于帧 320x240x3 需要 3-8ms,所以它比 1 快)
- DMA1(外设到内存)从 DCMI 到 SDRAM 中的缓冲区,它不起作用。
- DMA1(外设到内存)从 DCMI 到 AXI SRAM 中的缓冲区,它不起作用
有没有人遇到过类似的问题?
DCMI 是否有一些其他配置与外部 SDRAM?还是直接存取存储器?或 D2-D1 桥?
从 DCMI 到外部 SDRAM 的数据传输有问题(OVERRUN 标志)。
我有 STM32H753,它在 AN5020 中有这样的架构:
(应用笔记,STM32 MCU 的数码相机接口 (DCMI))
因此它通过 DMA1/2 和 D2-D1 桥在 DCMI 和 FMC 之间建立连接。
很好,但是...
当我将帧 320x240@RGB888 从 DCMI 发送到 SDRAM 时,
我得到 HAL_DCMI_GetError 值 0x41 (HAL_DCMI_ERROR_DMA | HAL_DCMI_ERROR_OVR)
在 HAL_DMA_GetError 中值为 0x00 (HAL_DMA_ERROR_NONE)。
DCMI 和 DMA 的配置:
- hdcmi.Instance = DCMI;
- hdcmi.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE;
- hdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_RISING;
- hdcmi.Init.VSPolarity = DCMI_VSPOLARITY_HIGH;
- 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;
- ...
- hdma_dcmi.Instance = DMA1_Stream0;
- 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_NORMAL;
- hdma_dcmi.Init.Priority = DMA_PRIORITY_VERY_HIGH;
- hdma_dcmi.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
- hdma_dcmi.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
- hdma_dcmi.Init.MemBurst = DMA_MBURST_SINGLE;
- hdma_dcmi.Init.PeriphBurst = DMA_PBURST_SINGLE;
一些系统信息:
- 系统时钟 = 400Mhz
- AXI/HCLK = 400Mhz
- FMC = 200Mhz(SDRAM @ 100Mhz)
- SDRAM(is42s16800,12位地址,16位数据)
- STM32Cube FW_H7 V1.6.0
一些测试:
- DMA1(外设到内存)从 DCMI 到 RAM_D2(内部)中的缓冲区,它可以工作,帧 320x240x3 需要 78-83 毫秒
- DMA1(内存到内存)从 RAM_D2 中的缓冲区到 SDRAM 中的缓冲区,它工作并且对于帧 320x240x3 需要 3-8ms,所以它比 1 快)
- DMA1(外设到内存)从 DCMI 到 SDRAM 中的缓冲区,它不起作用。
- DMA1(外设到内存)从 DCMI 到 AXI SRAM 中的缓冲区,它不起作用
有没有人遇到过类似的问题?
DCMI 是否有一些其他配置与外部 SDRAM?还是直接存取存储器?或 D2-D1 桥?
举报