This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSPM0G3519:MSPM0G3519:14 通道的 ADC DMA 配置

Guru**** 2988540 points

Other Parts Discussed in Thread: MSPM0G3519

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1663197/mspm0g3519-mspm0g3519-adc-dma-configuration-for-14-channel

器件型号: MSPM0G3519

尊敬的团队:

我们在系统中使用 MSPM0G3519 MCU、总共 14 个 ADC 通道配置如下:

ADC12_0:7 个通道
ADC12_1:7 个通道

目前、使用 ADC_GetRawValue (x、y) API 每 500ms 读取一次 ADC 值。 此实现可正常工作、并且所有通道值均按预期读取。

为了减少 CPU 开销、我们尝试使用 DMA 将 ADC 转换结果直接传输到 RAM 中。 但是、传输的数据不可靠。 一些通道偶尔会包含 0、即使对于恒定输入(例如,固定输入电压)的输入也是如此、在这种情况下、需要零值。

当前的 DMA 配置为:

DMA 样本计数:7.
DMA 触发器:MEM6 结果加载中断
地址模式:固定地址→块地址
自动启用:已禁用
源长度:半字(16 位)
目标长度:半字(16 位)
传输大小:7.
传输模式:重复块

设置: settings.txt 
记录的 ADC 数据: DMA_Buffer.csv 
INIT、
/*----- ADC0 DMA ---------------- */
DL_DMA_setSrcAddr (DMA、DMA_CH0_CHAN_ID、DL_ADC12_getFIFOAddress (ADC12_0_INST));
DL_DMA_setDestAddr (DMA、DMA_CH0_CHAN_ID、(uint32_t) ADC0_DMA_BUFFER);
DL_DMA_enableChannel (DMA、DMA_CH0_CHAN_ID);
/*----- ADC1 DMA ----------- */
DL_DMA_setSrcAddr (DMA、DMA_CH1_CHAN_ID、DL_ADC12_getFIFOAddress (ADC12_1_INST));
DL_DMA_setDestAddr (DMA、DMA_CH1_CHAN_ID、(uint32_t) ADC1_DMA_BUFFER);
DL_DMA_enableChannel (DMA、DMA_CH1_CHAN_ID);

我们期望在 7 通道转换序列完成后、DMA 将七个 16 位 ADC 结果传输到 RAM 缓冲区中。

我们想澄清以下几点:

  1. MSPM0G3519 ADC 是否支持将 7 通道转换序列直接传输到 RAM 中?
  2. 如果是、此用例的建议 DMA 配置是什么?
  3. MEM6 结果是否加载了正确的 DMA 触发器、或者是否应该使用不同的 ADC 事件?
  4. 是否需要任何其他 ADC 或 DMA 设置才能可靠地传输重复的多通道转换序列?

此致、
亚伯拉罕

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、

    是、MSPM0G3519 支持针对七通道 ADC 序列进行 DMA 传输。 问题可能是将 ADC FIFO 与七个 16 位 DMA 传输一起使用。 FIFO 数据成对打包、因此奇数七个样本序列可能会导致通道数据不对齐、零或移位。

    建议配置:

    • 禁用 ADC FIFO。
    • MEM0 通过配置。 MEM6
    • MEM6 result loaded 用作 DMA 触发器。
    • 将 ADC DMA 样本计数和 DMA 传输大小设置为 7。
    • MEMRES0 用作 DMA 源并通过递增 MEMRES6。
    • 将目标递增到 uint16_t[7] 缓冲区中。
    • 仅在 DMA 完成后处理缓冲区。

    如果每 500ms 进行一次测量、请在每个间隔触发一个 ADC 序列、而不是使用连续重复模式。

    如果 FIFO 必须保持启用状态、则使用 32 位 DMA 传输并添加第八次虚拟转换、以使样本保持对齐。 希望这对您有所帮助!

    -布赖恩