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

标签 timer stm32 gpio dma stm32f4

ST 有一些应用笔记讨论使用 DMA 到 GPIO 模拟并行总线。我很感激,但它没有回答重要的问题。我正在浏览引用手册,但似乎无法澄清我所关心的事情。

我最关心的是抖动。引用手册反复指出,当 DMA 被触发时(例如,通过定时器),DMA Controller 将读取内存并将值传输到外设。对于具有自己的 FIFO 的外设,这可能没问题。在那里,当 FIFO 中有可用空间时,将触发 DMA 并填充 FIFO。这可能会在 FIFO 运行为空之前发生。

但是对于 GPIO,如果 DMA channel 本身没有 FIFO,那么当定时器触发时数据将不会准备好,需要从 SRAM 中获取。因此,在定时器触发和实际到达 GPIO 输出寄存器的值之间,可能会过去一些时间。当查看定时器和 GPIO 引脚的时钟输出时,这可能是可测量的。 DMA Controller 必须与正在运行的程序竞争对 SRAM 的访问,因此程序的某些事件可能会增加抖动。

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

我需要将 3 到 4 个引脚同步切换到 100kHz 到 1MHz 的时钟。我正在考虑 DMA 到 GPIO 并滥用 QuadSPI Controller 。我目前正在 STM32L4 上进行测试,但我也在考虑 STM32F4 甚至 F1。

最佳答案

与 GPIO 之间的 DMA 只是内存到内存的传输。许多 STM32 uC 内置了 DMA FIFO - 但它们不会在这里使用。

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

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

关于timer - STM32 MCU 上 DMA 到 GPIO 的可靠性如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60537914/

相关文章:

python - 在 gpiozero 中模拟 "button pressed"上升事件

c++ - 使用 libgpiod 如何即时切换请求行的方向?

javascript - jQuery TimeCircles 事件监听器范围

java - 单线程中断 sleep

将 GPIO_TypeDef 从 STM32L1xx 转换为 STM32F10x

c - STM32 串行 DMA - 查找流的开头

java - 用于 UNIX sys/classes/gpio 文件的 NIO watchservice

javascript - 如何在 JavaScript 中处理(很多)计时器

c - 需要说明在 GNU C 中使用 settimer 和 alarm 函数的程序

c - f3发现: trying to use an lcd screen 1602 with an I2C module