HC32F4A0+DVP+SDRAM数据搬运问题
本帖最后由 可以么 于 2025-7-24 14:34 编辑在使用HC32F4A0的DVP外设做图传时,发现使用DMA搬运图像数据至SDRAM上数据会丢失。
图像数据320*240则不会,一旦图像数据超出了某个阈值则会出现数据丢失。
后续使用双路DMA模拟双缓冲解决了该问题,但不完美。
暂定解决方案:
1.DMA1搬运图像数据至MCU内部sram缓冲区A->半满中断设置aos使能DMA2搬运缓冲区A的数据至SRAM内(注HC32的AOS次数只能单次,所以搬运将分成大数据块传输,避免多次中断的占用CPU的处理时间)
2.DMA1搬运图像数据至MCU内部sram缓冲区B->全满中断设置aos使能DMA2搬运缓冲区B的数据至SRAM内(注HC32的AOS次数只能单次,所以搬运将分大数据成块传输,避免多次中断的占用CPU的处理时间)
如此往复;
该解决方案带来的问题:
①占用了DMA1、DMA2,将导致其余需要使用DMA的外设将出现阻塞、dma错误等异常问题
②如一,当全速搬运图片数据时,其余通信外设(如串口、spi等使用dma的外设),因数据传输的不连续性将给应用层带来很多额外的问题
有没有哪位前辈也有过DVP+SDRAM类似经历,是否有更加完美的方案分享,万分感谢
SDRAM时序如下:
stcDmcInit.stcTimingConfig.u8CASL = 2U;
stcDmcInit.stcTimingConfig.u8DQSS = 0U;
stcDmcInit.stcTimingConfig.u8MRD = 2U; /* tMRD: 2CLK */
stcDmcInit.stcTimingConfig.u8RAS = 2U; /* tRAS: min=42ns */
stcDmcInit.stcTimingConfig.u8RC = 2U; /* tRC:min=63ns */
stcDmcInit.stcTimingConfig.u8RCD_B = 3U; /* tRCD: min=15ns */
stcDmcInit.stcTimingConfig.u8RCD_P = 0U;
stcDmcInit.stcTimingConfig.u8RFC_B = 3U; /* tRFC: min=63ns */
stcDmcInit.stcTimingConfig.u8RFC_P = 0U;
stcDmcInit.stcTimingConfig.u8RP_B = 3U; /* tRP:min=15ns */
stcDmcInit.stcTimingConfig.u8RP_P = 0U;
stcDmcInit.stcTimingConfig.u8RRD = 1U; /* tRRD: min=14ns */
stcDmcInit.stcTimingConfig.u8WR = 2U; /* tWR:2CLK */
stcDmcInit.stcTimingConfig.u8WTR = 1U;
stcDmcInit.stcTimingConfig.u8XP = 1U;
stcDmcInit.stcTimingConfig.u8XSR = 3U; /* tXSR: min=70ns */
stcDmcInit.stcTimingConfig.u8ESR = 3U;
补充:使用单路DMA双缓冲机制可以做到比DVP DMA搬运至SDRAM更高的数据完整性,但分辨率上去了仍然会丢数据,目前所试方案 最完美的就是双路DMA,图像搬运可以做到ov5640的最高分辨率 HC32F4A0的DMA在传输大数据量时可能存在性能瓶颈,特别是当数据量超过某个阈值时,DMA可能无法及时完成传输,导致数据丢失。 增大内部SRAM缓冲区,如果内部SRAM缓冲区有限,可以考虑采用分块传输的方式,将图像数据分成多个小块进行传输,减少单次传输的数据量。 考虑降低图像分辨率或帧率以减少数据量。 使用HC32F4A0的DVP外设做图传时,发现使用DMA搬运图像数据至SDRAM上数据会丢失。 如果内部SRAM缓冲区设置过小,无法容纳大分辨率图像数据,也会导致数据丢失。 DMA通道冲突? SDRAM的时序配置如果与DMA传输不匹配,可能导致数据丢失。 为高速总线分配独立的DMA通道。
页:
[1]