STM32 - 如何在 HAL 库中为外设 R/W 选择 DMA 或中断

STM32 - How to choose between DMA or Interrupt for peripheral R/W in HAL library

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

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

DMA 的一些缺点是:

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

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

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

  • DMA 传输给微控制器的总线矩阵带来了更重(且更不可预测)的负载,使它们成为勘误表的常见来源。

一般来说,我建议反对对I2C使用DMA。该协议在 100 - 200 kHz 时通常只有 运行s,因此使用中断不会给微控制器带来特别重的负载。