STM32F4 DMA可以并行工作吗?

时间:2016-06-22 16:20:21

标签: stm32 dma stm32f4

我正在使用STM32F446进行一项需要3x SPI(我在所有这些中都是主机)和SDIO接口的应用。

2个SPI(SPI1和SPI2)是需要每1ms读取一次的传感器。对于SPI1,我需要写1个字节,对它的响应将是值。对于SPI2,我需要写1个字节,然后读6个。

第三个SPI(SPI3)和SDIO用于通信/记录,它们都不需要以固定的周期传输数据。

看看STM32F46x manual,第9节,它看起来不像我可以用外围设备中断触发DMA传输(这太糟糕了),但是我可以做所有这样的事情:

  1. 每1ms定时器中断:内部ISR SPI1和SPI2 DMA传输被触发。 DMA传输使用接收的传感器数据填充缓冲区;
  2. 每当我需要写入SDIO或SPI3时,我开始执行DMA传输,优先级低于SPI1和SPI2。
  3. 我猜测SPI1和SPI2可以并行执行,因为我有2个DMA控制器,如果它们与SPI2和SDIO同时发生,则后者将被阻塞,直到控制器空闲。是吗?

1 个答案:

答案 0 :(得分:2)

  

对于SPI1,我需要写1个字节,对此的响应将是   值。对于SPI2,我需要写1个字节,然后读6个。

请注意,对于SPI,读取和写入同时发生,您可以通过写入虚拟字节来读取字节,在设置要传输的字数时应考虑到这一点。

  

DMA传输使用接收到的传感器数据填充缓冲区;

除非在传输之间将CS设置为高,否则某些SPI从设备将无法正常工作。如果您的传感器属于这种情况,则应在接收DMA流中断中执行此操作。如果你想让DMA自动填满一个大的缓冲区,那么在这种情况下就不行了。

  

我猜测SPI1和SPI2可以并行执行,因为我有2个   DMA控制器,如果它们与SPI2和SPI同时发生   SDIO,后者将被阻止,直到控制器空闲。就是它   正确?

只要优先级较高的传输不会完全占用DMA带宽,它们就不会被阻塞,而是交错存在。没有SPI传输可以做到这一点,因为SPI需要至少16个时钟周期来传输单个字节(至少2个周期/位)。