c - DMA在STM32的什么地方存放ADC的值?

标签 c arm embedded stm32 dma

我为 CubeMX 中的 ADC1 启用了 DMA 外设到内存的传输并生成了代码。但是,我对 ADC 的数据将写入何处感到困惑?我应该明确定义一个变量来包含这些数据吗?如何检索 DMA channel 1 ISR 中的数据?

最佳答案

DMA 不管理内存,也不选择有效地址来设置数据。一般来说,DMA 允许在不使用 CPU 的情况下进行数据传输,但仅此而已。


STM32 微 Controller 提供来自以下方面的传输:

  • 内存到内存
  • 外设内存
  • 外设到内存

在所有这些中,开发人员必须了解它们的目的,以便配置(除了 DMA 之外)源和目标位置,例如外围设备的地址,保留内存(以及什么样的内存)等.


在您的特定情况下(检查 RMANdocs 等),ADC 到内存(外设到内存)传输的主要参与者是:

  • 来源:ADC 外设,开发人员必须知道 ADC 外设的位置,并根据作为信息源的 ADC 参数配置(除了 ADC 之外)DMA。
  • Destination:内存,开发者必须预留一堆内存(heap/stack/global/etc),并根据已经分配的内存空间配置DMA。这样做,DMA 将允许您以不同的方式设置值(取决于设备),例如连续环形缓冲区、一个循环、乒乓缓冲区(stm32 使用术语“循环双缓冲区”)等。<
  • DMA 和 ADC 配置:为了简单起见,我不打算包括大量因素,通常由制造商的 HAL 简化(使用它取决于您)。

关于c - DMA在STM32的什么地方存放ADC的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55058248/

相关文章:

c++ - 使用 GCC 或/和 IAR 编译时如何禁用 double 学?

c - 调试时从寄存器中提取单个位

c - CC253x 固件的非标准 ZCL 封装支持

c++ - 高级 C 和 C++ 编译 : unable to compile the example program mentioned in the book

c++ - wcsdup 分配的内存是否应该显式释放?

c - 矩阵计算器错误 - 无法正常工作

ARM、MIPS、x86 的 Android os.arch 输出?

linux - 将函数指针从内核驱动程序传递到管理程序

c - 消息队列支持多线程吗?

c - 如何在没有竞争条件的情况下将两个 32 位计数器读取为 64 位整数