STM32 MCU 上的 DMA 到 GPIO 的可靠性如何?
Posted
技术标签:
【中文标题】STM32 MCU 上的 DMA 到 GPIO 的可靠性如何?【英文标题】:How reliable is DMA to GPIO on STM32 MCUs? 【发布时间】:2020-06-17 15:29:29 【问题描述】: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。
【问题讨论】:
你知道这是哪个应用笔记吗?我在 STM32H743 上实现了一个 1 MHz 的并行总线作为测试,然后围绕 STM32F407 构建了一个电路,现在我无法让它以相同的方式工作(DMA 不会在定时器和/或 DMA 传输上触发错误和/或其他问题)。 我相信我指的是 AN4666:st.com/resource/en/application_note/… 【参考方案1】:DMA 到/从 GPIO 这只是内存到内存的传输。许多 STM32 uC 都内置了 DMA FIFO - 但他们不会在这里使用。
内核始终优先于 DMA,因此如果可能是问题(非常不可能)放置内核可访问数据(当 DMA 在单独的内存区域中处于活动状态时 uC 将访问的数据 - 例如 CCM(如果您的uC有一个)
回答问题 内存到/从 GPIO 非常可靠 - 我个人对此没有任何问题。
【讨论】:
你用过哪些uC? 我在工作中使用它们。很多型号 L4 L0 F3 F4 F7 H7 G4 & G0 AFAIK,这些 STM32 线之间的 DMA 接口有所不同:功能越强大有 FIFO,而速度越慢(例如检查 L0 或 F3...)没有 FIFO IIRC。【参考方案2】:如果您的时钟可以介于 100 kHz 和 1 MHz 之间,我想您不必担心时钟本身的抖动,只担心数据与时钟的抖动。如果您的时钟不需要连续,那么一个新颖的想法是对数据进行一些预处理,以将时钟信号包含为GPIO 数据的一部分。然后,您可以使用定时器定期触发 DMA,您将在总线上以该速率的一半获得数据频率,并在时钟和数据之间完美对齐。
因此,如果您想在正时钟沿发送数据有效的四位数据5 6 B D
,请按如下方式准备 DMA 缓冲区:05 15 06 16 0B 1B 0D 1D
并连接 GPIO 引脚 4 作为时钟。如果需要,请在缓冲区中保留最后一个字节以将时钟/总线重置为空闲状态。
如果需要,您当然可以扩展这个想法,并结合控制信号,例如芯片选择和外部缓冲器的三态信号。
另请注意,并非所有 DMA 模块都可以访问保存 GPIO 寄存器的 AHB 总线。例如在 STM32F40x 上,只能使用 DMA2(这就是我的原因,直到我读到这个答案 https://***.com/a/46619315/6552613)。
【讨论】:
【参考方案3】:我还没有完全探索这个空间,但是,通过在我的主循环中禁用中断和轮询中断标志,它使我的 GPIO DMA 上的抖动基本上消失了!当然,这可能只是启用了一组中断,但是直到 systick 计时器的一切都在杀死我。通过轮询主循环中的中断,它似乎解决了我的问题。
请注意,这是在 STM32F042 上,我的周期内从未超过 6 MHz。当我尝试,即尝试以 8 MHz 采样时,一切都崩溃了。 YMMV
【讨论】:
以上是关于STM32 MCU 上的 DMA 到 GPIO 的可靠性如何?的主要内容,如果未能解决你的问题,请参考以下文章