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

Ken*_*Lin 1 arm interrupt stm32 dma

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

小智 6

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

DMA 的一些缺点是:

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

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

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

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

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