本帖最后由 可以么 于 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;
|