如何在 Cortex-M7(STM32F746) 上使用不同 DMA 通道的相同 DMA 流?

How to the same DMA Stream with different DMA channel on the Cortex-M7(STM32F746)?

我想将 SPI2 和 UART4 外设与 DMA 一起使用,但正如我所见,DMA1-SPI2-Tx 和 DMA1-UART4-Tx 使用相同的 dma 流。

SPI2_TX  - DMA1_Stream4 (channel 0)
UART4_TX - DMA1_Stream4 (channel 4)

有什么方法可以同时为不同的外围设备使用相同的 DMA 流吗?

Is there any way to use the same DMA stream for the different peripherals at the same time?

不,没有。每个流只能选择一个频道。当然,如果你不是同时在两个端口上传输,那么你可以在通道之间来回切换。

使用另一个流

虽然看起来SPI2 TX和UART4 TX都局限于Stream 4,但是可以通过其他方式控制传输通道

注意:这仅适用于 SPI masterUART,没有流量控制。即只要 MCU 完全控制时序。

没有规定 DMA 传输应该访问请求来自的同一外设(但是对于 DMA1,它们必须在同一 APB 总线上)。可以使用例如TIM6(或连接到 DMA1 的任何其他计时器)在 4 以外的流上生成周期性 DMA 请求,并设置该流以将数据从内存传输到 SPI2->DR

只需将定时器频率设置为以您的 SPI 比特率的 1/8 生成更新 DMA 请求,将几个字节写入 SPI2->DR 以填充 FIFO,然后启动定时器。

使用具有各种框架选项的 UART 会更棘手,但它通常应该可以工作。