arm - STM32 - 如何在 HAL 库中为外设 R/W 选择 DMA 或中断
问题描述
我正在使用 STM32F3 微控制器和 HAL 库。对于许多外设(例如 ADC、SPI、I2C),HAL 库提供了 3 种读取/写入数据的方式:轮询模式、中断模式和 DMA 模式。我知道我不想要轮询模式,因为它会阻塞。但是,我不确定如何在中断和 DMA 模式之间进行选择。有一般的经验法则吗?我觉得 DMA 模式应该总是更好,因为它可以在没有 CPU 干预的情况下将值写入内存?
解决方案
DMA 的优点是不需要 CPU 干预。DMA 传输可以在 CPU 忙于做其他事情或空闲时运行。
DMA 的一些缺点是:
大多数微控制器的 DMA 通道数量有限,因此可能无法将 DMA 用于所有外设。
当需要许多小传输时,例如当通过 USART 接收单个字符时,设置和执行 DMA 传输的开销可能会抵消它的好处。
DMA 通常不支持与设备的异常交互(例如与某些 SPI 设备的双向数据传输)。
DMA 传输在微控制器的总线矩阵上施加了更重(且更难以预测)的负载,使它们成为经常出现的勘误表。
一般来说,我建议不要对 I 2 C使用 DMA 。该协议通常仅在 100 - 200 kHz 下运行,因此使用中断不会给微控制器带来特别重的负载。
推荐阅读
- dataframe - 通过 csv 读取文件和在 julia 中读取管道有什么区别?
- python - 我将如何使字符串在引号内起作用?
- python - 有隐藏项目时关注下一个 QListWidget 项目
- javascript - 减少 h1 标签中的值
- r - 应用在 2 个数据帧中获取匹配列的函数,在列上循环
- python-3.x - 如何使用 python3 将输入数据存储到文本文件中并打印数据输出?
- java - 如何获取 JPanel 的大小?
- python - Python和Matplotlib:将x轴放在中心但刻度线和标签不跟随x轴
- python - 如何通过在 Django 中按下按钮来获取用户的经纬度?
- amazon-web-services - 如何使用 AWS Glue 处理多个表