ST意法半导体
直播中

陈静

7年用户 1284经验值
私信 关注
[问答]

从DCMI到外部SDRAM的数据传输问题求解

从 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 桥?

回帖(1)

秦玫

2023-2-3 14:55:57
从 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 桥?

举报

更多回帖

发帖
×
20
完善资料,
赚取积分