我正在使用 STM32L072KB 微控制器并尝试熟悉定时器。我想使用定时器通过 DMA 切换 GPIO/LED。 我在《Mastering STM32》一书中读到(https://leanpub.com/mastering-stm32),这里显然不可能使用DMA直接访问带有STM32L0内核的GPIO,但我还没有找到参考手册中确认该限制的任何内容(https://www.st.com/resource/en/reference_manual/dm00108281.pdf):
这里是书上F4核的例子,使用定时器+DMA并直接访问GPIO:
但这似乎是真的:我在论坛上发现了一篇帖子,有人认为对于 L0 核心,可以另外使用 PWM 作为使用 DMA 的解决方法。
有人可以解释一下,为什么 DMA 无法直接在 L0 核心上访问 GPIO 以及如何实现 GPIO/LED 切换(也许通过 PWM 建议)?
TLDR:这些 MCU 上的 GPIO 不连接 AHB 或 APB,而是连接到直接连接到 CPU 内核的专用总线。 DMA 只能访问 AHB 和 APB。
这是因为 DMA 可以在称为 AHB 的系统总线上进行传输。它可以使用充当 AHB 从机的 AHB-APB 桥来访问 AHB 从机(RAM 和闪存)和外设。具有 Cortex-M0+ CPU 内核的微控制器上的 GPIO 端口将 GPIO 端口连接到无法从系统总线 (AHB) 访问的专用端口。相反,有专用端口。这允许从 CPU 内核进行更快且确定性的 GPIO 访问,而不会因来自其他主设备(如 DMA)的 AHB 事务而导致延迟。但不幸的是,使用这条专用总线会阻止其他 AHB 主设备访问它。它根本不限于STM32L0或STM32。其他 MCU 供应商(例如 Microchip)也以同样的方式设计。
您可以在STM32L0参考手册RM0367,修订版8第56页的图1中看到它。DMA连接到Busmatrix(这是AHB的实现)并且可以访问连接到它的所有外设(SRAM,FLASH称为MIF内存接口)使用 AHB-APB 桥,它可以访问除 GPIO 之外的所有外设(如 SPI、I2C、RTC...)。 GPIO 端口未连接到该总线,但它们使用标记为 IOPORT 的箭头直接连接到 Cortex-M0+ 内核,因此,只有 Cortex-M0+ 内核可以访问它。