Timer STM32 MCU上DMA到GPIO的可靠性如何?

Timer STM32 MCU上DMA到GPIO的可靠性如何?,timer,stm32,gpio,dma,stm32f4,Timer,Stm32,Gpio,Dma,Stm32f4,ST有一些关于使用DMA到GPIO模拟并行总线的应用说明。我很感激,但它不能回答重要的问题。我正在看参考手册,似乎找不到能澄清我所关心的事情 我最关心的是抖动。参考手册反复说明,当DMA被触发时(例如,由定时器触发),DMA控制器将读取内存并将值传输到外围设备。对于拥有自己FIFO的外围设备来说,这可能没问题。在那里,当FIFO中有可用空间时,DMA被触发并填充FIFO。这可能会在FIFO清空之前发生 但对于GPIO,如果DMA通道本身没有FIFO,则当计时器触发时,数据将无法准备就绪,需要从S

ST有一些关于使用DMA到GPIO模拟并行总线的应用说明。我很感激,但它不能回答重要的问题。我正在看参考手册,似乎找不到能澄清我所关心的事情

我最关心的是抖动。参考手册反复说明,当DMA被触发时(例如,由定时器触发),DMA控制器将读取内存并将值传输到外围设备。对于拥有自己FIFO的外围设备来说,这可能没问题。在那里,当FIFO中有可用空间时,DMA被触发并填充FIFO。这可能会在FIFO清空之前发生

但对于GPIO,如果DMA通道本身没有FIFO,则当计时器触发时,数据将无法准备就绪,需要从SRAM中提取数据。因此,在计时器触发和实际到达GPIO输出寄存器的值之间,可能会经过一段时间。当查看计时器和GPIO引脚的时钟输出时,这可能是可测量的。DMA控制器必须与正在运行的程序竞争对SRAM的访问,因此程序的某些活动可能会增加抖动

也许这对我来说是一个巨大的疏忽,但ST的参考手册似乎并没有提到FIFO是DMA的一部分。如果是这种情况,将导致抖动,这可能会影响更高频率下的性能


我需要切换3至4引脚同步时钟从100kHz到1MHz。我正在考虑DMA到GPIO,还滥用QuadSPI控制器。我目前正在测试STM32L4,但我也在考虑STM32F4甚至F1。

DMA到/从GPIO它只是内存到内存的传输。许多STM32 uCs都内置了DMA FIFO,但它们在这里不会使用

core始终优先于DMA,因此如果可能(不太可能)将core可访问数据(当DMA在单独的内存区域中处于活动状态时,uC将访问该数据-例如CCM(如果您的uC有一个)放入

回答问题
从GPIO到GPIO的内存非常可靠-我个人没有任何问题。

如果你的时钟可以在100 kHz到1 MHz之间,我想你不担心时钟本身的抖动,只担心数据相对于时钟的抖动。如果你的时钟不需要连续,那么一个新的想法就是对数据进行一些预处理将时钟信号作为GPIO数据的一部分。然后,您可以使用计时器以固定的间隔触发DMA,然后您将以该速率的一半在总线上获得数据频率,并且时钟和数据之间完全对齐

因此,如果要发送四位数据,且数据在正时钟边缘有效,请按如下方式准备DMA缓冲区:
05 15 06 16 0B 1B 0D 1D
,并连接GPIO引脚4作为时钟。如果需要,在缓冲区中保留最后一个字节,以将时钟/总线重置为空闲状态

当然,如果需要的话,您可以扩展这个想法,并将诸如芯片选择和外部缓冲器的三态信号之类的控制信号结合起来


还请注意,并非所有DMA块都可以访问保存GPIO寄存器的AHB总线。例如,在STM32F40x上,只能使用DMA2(这就是我得到的答案,直到我阅读此答案).

我还没有完全探索这个空间,但是,通过禁用中断并轮询主循环中的中断标志,它使我的GPIO DMA上的抖动基本上消失了!虽然可能只是中断集启用了,但一切都是由于systick定时器造成的。通过轮询主循环中的中断,它可以似乎已经解决了我的问题


请注意,这是在STM32F042上,我的周期内从未超过6 MHz。当我尝试,即尝试到8 MHz采样时,一切都会崩溃。YMMV

您一直在使用哪些uCs?我在工作中使用了它们。许多型号L4 L0 F3 F4 F7 H7 G4和G0AFAIK,这些STM32线路之间的DMA接口不同:功能更强大的线路具有FIFO,而功能更强大的线路具有FIFOe较慢(例如,检查L0或F3…)没有FIFO IIRC。你知道这是哪个应用程序注释吗?我在STM32H743上实现了1 MHz的并行总线作为测试,然后围绕STM32F407构建了一个电路,现在我无法使其以相同的方式工作(DMA不会触发计时器和/或DMA传输错误和/或其他问题).我想我指的是AN4666: