一、SPI 通信中何时需要使用 DMADMA直接内存访问的核心作用让外设和内存直接传输数据不占用 CPU。SPI 场景下适合开 DMA 的情况大数据量、长帧传输比如 SPI 驱动液晶屏、Flash 读写、音频数据流字节数很多时。高频波特率 连续传输SPI 速度快CPU 频繁中断取数据会大量占用资源甚至丢数据。需要同时做别的任务系统还要跑按键、屏幕刷新、算法、协议栈等不想被 SPI 中断抢占。降低 CPU 负载、减少中断频繁触发不用每字节进一次中断DMA 搬完一整段才触发一次完成中断。简单记大量、高速、连续、CPU 还要干别的事 → 用 SPI DMA。二、如何避免 DMA 传输时的内存冲突DMA 是硬件直接访问内存如果 CPU 同时改这块内存就会出现数据错乱、死机、传输异常 → 这就是内存冲突。避免方法标准答法传输期间CPU 不要修改 DMA 源/目标缓冲区启动 DMA 后直到 DMA 完成中断到来前不写、不修改该数组/缓冲区。使用双缓冲Double Buffer机制缓冲 A 给 DMA 传输缓冲 B 给 CPU 处理/填充传输完成后切换缓冲从根源避免同时访问。保证缓冲区是正常可访问的 RAM不使用栈上临时变量栈变量可能被覆盖、生命周期不可控极易出问题。开启总线保护/原子访问根据芯片支持有些 Cortex-M 内核支持总线矩阵仲裁CPU 与 DMA 访问不会互相阻塞。严格按“启动→等待完成→再操作”的流程不中途取消、不重复启动 DMA不乱改指针和长度。禁用或谨慎使用在 DMA 缓冲区上的中断重入防止在 DMA 进行中被意外改写。总结1何时用 SPI DMA数据量大、传输速率高需要降低 CPU 占用需要连续、长时间传输多任务系统避免频繁中断2如何避免 DMA 内存冲突传输中 CPU 不修改 DMA 缓冲区使用双缓冲机制分离读写使用固定 RAM 缓冲区不使用临时栈变量等待 DMA 传输完成再操作数据保证总线访问有序避免重复启动