首页 > 解决方案 > STM32 - 如何在 HAL 库中为外设 R/W 选择 DMA 或中断

问题描述

我正在使用 STM32F3 微控制器和 HAL 库。对于许多外设(例如 ADC、SPI、I2C),HAL 库提供了 3 种读取/写入数据的方式:轮询模式、中断模式和 DMA 模式。我知道我不想要轮询模式,因为它会阻塞。但是,我不确定如何在中断和 DMA 模式之间进行选择。有一般的经验法则吗?我觉得 DMA 模式应该总是更好,因为它可以在没有 CPU 干预的情况下将值写入内存?

标签: arminterruptstm32dma

解决方案


DMA 的优点是不需要 CPU 干预。DMA 传输可以在 CPU 忙于做其他事情或空闲时运行。

DMA 的一些缺点是:

  • 大多数微控制器的 DMA 通道数量有限,因此可能无法将 DMA 用于所有外设。

  • 当需要许多小传输时,例如当通过 USART 接收单个字符时,设置和执行 DMA 传输的开销可能会抵消它的好处。

  • DMA 通常不支持与设备的异常交互(例如与某些 SPI 设备的双向数据传输)。

  • DMA 传输在微控制器的总线矩阵上施加了更重(且更难以预测)的负载,使它们成为经常出现的勘误表。

一般来说,我建议不要对 I 2 C使用 DMA 。该协议通常仅在 100 - 200 kHz 下运行,因此使用中断不会给微控制器带来特别重的负载。


推荐阅读