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

Arm STM32-如何在HAL库中为外设R/W选择DMA或中断,arm,interrupt,stm32,dma,Arm,Interrupt,Stm32,Dma,我正在使用STM32F3微控制器和HAL库。对于许多外围设备(如ADC、SPI、I2C),HAL库提供3种读/写数据的方式:轮询模式、中断模式和DMA模式。我知道我不想要轮询模式,因为它被阻塞了。但是,我不确定如何在中断和DMA模式之间进行选择。有一般的经验法则吗?我觉得DMA模式应该总是更好,因为它可以在没有CPU干预的情况下将值写入内存。DMA的优点是它不需要CPU干预。DMA传输可以在CPU忙于做其他事情或空闲时运行 DMA的一些缺点是: 大多数微控制器的DMA通道数量有限,因此不可能对

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

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

DMA的一些缺点是:

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


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

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

  • DMA传输在微控制器的总线矩阵上放置了更重(且不可预测)的负载,这使得它们经常出现错误


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

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

DMA的一些缺点是:

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


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

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

  • DMA传输在微控制器的总线矩阵上放置了更重(且不可预测)的负载,这使得它们经常出现错误


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

这取决于您对i/o的操作:访问的数量和类型、频率、转换时间等。您可以扩展您想要做的吗?因为我提到了几个外围设备,让我们选一个来缩小问题的范围!我想使用i2c向EEPROM和IMU发送/接收数据。我会在中断模式还是DMA模式下使用i2c?惯性测量单元。关键是我正在读取i2c上的传感器值。您必须始终根据自己的要求使用它们。一些外围设备需要它们的组合。例如,如果您需要使用UART的RX,并且您不知道通过DMA接收数据的实际大小,那么您可能需要将UART的空闲中断与DMA同时使用。尽管由于上述原因,始终首选使用DMA。这取决于您对i/o所做的操作:访问的数量和类型、频率、转换时间等。您可以扩展您想要做的事情吗?因为我提到了几个外围设备,让我们选择一个来缩小问题的范围!我想使用i2c向EEPROM和IMU发送/接收数据。我会在中断模式还是DMA模式下使用i2c?惯性测量单元。关键是我正在读取i2c上的传感器值。您必须始终根据自己的要求使用它们。一些外围设备需要它们的组合。例如,如果您需要使用UART的RX,并且您不知道通过DMA接收数据的实际大小,那么您可能需要将UART的空闲中断与DMA同时使用。尽管由于上述原因,始终首选使用DMA。“当需要许多小型传输时,设置和执行DMA传输的开销可能会抵消其好处“。您在这里提到的那种开销实际上会消耗CPU周期?DMA传输不是不需要CPU干预的一部分吗?DMA传输不是凭空产生的——CPU必须配置DMA外围设备来启动传输,并且在传输完成时必须处理中断。这两件事都需要时间。“当需要许多小的传输时,设置和执行DMA传输的开销可能会抵消其好处”。您在这里提到的那种开销实际上会消耗CPU周期?DMA传输不是不需要CPU干预的一部分吗?DMA传输不是凭空产生的——CPU必须配置DMA外围设备来启动传输,并且在传输完成时必须处理中断。这两件事都需要时间。