双缓冲DMA传输怎么感觉比普通模式还容易出错?
用双缓冲搬图像数据到SPI,一会传一会停,是哪里没配对?你关了Cache没?不然很可能数据错。 我也搞不定双缓冲,干脆改用单缓冲。 数据交换时机很讲究,要加判断标志。 DMA中断函数要自己手动写好。 是不是缓冲区没对齐? 试下设置成Cacheable属性。 用DTCM内存试试?访问快些。 H7系列DMA设置确实比F1复杂。 数据大小有没有超过FIFO容量? 我参考官方DMA2D例程写的。 STM32H7内部包含多个内存区域,如DTCM、AXI SRAM等,不同区域的DMA主设备支持情况不同。若将双缓冲区的地址分配在DMA无法访问的区域,会导致传输错误 确保双缓冲区位于DMA能够访问的内存区域,如AXI SRAM。可以通过修改项目配置或使用__attribute__((section(".ARM.__at_address")))来指定缓冲区地址 双缓冲模式下,DMA会在缓冲区填满后自动切换,并触发中断通知CPU处理数据。若中断处理函数编写不当或优先级设置不合理,可能导致数据丢失或处理不及时。编写正确的中断处理函数,确保在中断发生时能够及时处理数据 若缓冲区大小设置不合理,如过小可能导致溢出,过大则可能浪费内存。根据数据传输的需要设置合适的缓冲区大小。可以通过实验或计算来确定最佳的缓冲区大小 DMA的初始化代码顺序可能影响传输的正确性。若初始化顺序不当,可能导致DMA无法正常工作,按照STM32H7的参考手册或相关文档,正确编写DMA的初始化代码,并确保初始化顺序合理 其实楼主可以检查DMA请求源的设置,确保DMA能够在正确的事件发生时被触发 合理设置中断优先级,避免与其他重要中断冲突 在双缓冲模式下,特别需要注意在切换缓冲区时处理缓存数据 在启用D-Cache的情况下,若未正确处理缓存一致性,可能导致DMA读取到的数据与CPU处理的数据不一致。可以使用SCB_CleanDCache_by_Addr()等函数确保缓存一致性
页:
[1]