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.

[参考译文] MSP430F5528:ADC12MEMx 和读取之间可能存在冲突、同时它从12位 ADC 内核写入

Guru**** 2539500 points
Other Parts Discussed in Thread: MSP430F5528

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/750479/msp430f5528-possible-conflict-between-adc12memx-and-read-out-and-while-its-written-from-12-bit-adc-core

器件型号:MSP430F5528

您好!

我想在"重复自动扫描模式"下运行 ADC12、而不使用 ISR 来处理结果。

相反、我想使用 ISR 方法创建对"所有最新的方法" ADC 结果的"随机"读取访问。

硬件是否在某种程度上注意到 ADC12MEMx 的读取始终是可能的? 因此、不会有 读取错误数据的风险、因为 ADC 内核可能会在读取 ADC12MEMx 的同时写入寄存器?

此致、

David

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

    尊敬的 David:

    我建议使用 ISR、而不是轮询 ADC 通道的中断标志。 您是否考虑过在设置 ADC12IFGx 时使用 DMA 自动拉取 ADC12MEMx 数据? 这样、您就可以释放 CPU 以执行应用所需的其他操作、因为 DMA 可以在没有 CPU 干预的情况下运行。

    有关如何将 DMA 控制器与 ADC12模块一起使用的更多信息、请参阅 《MSP430x5xx 和 MSP430x6xx 系列用户指南》中的第11.2.12节。

    此致、

    James

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

    尊敬的 James:

    感谢你的答复。 实际上、我目前使用 DMA 将 ADC 结果从 ADC12MEMx 传输到 RAM 中的"unsigned int ADC_Result[9]"。

    但是、DMA 正在将 CPU 暂停一段时间以执行"块传输"。 我尝试避免这种情况、因为我有另一个 ISR 需要尽快执行。

    由于 MSP430F5528有一个内存缓冲器"ADC12MEMx"并且 ADC 有 可用的"重复自动扫描模式"、我 A 将假定执行的方式是 ADC12MEMx 可以无风险地读取、但是我在用户指南中找不到任何与此相关的东西。

    此致、

    David  

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

    [引用 user="David Bahr86">但 DMA 正在暂停 CPU 一段时间以执行"块传输"。 我尝试避免这种情况、因为我有另一个 ISR 需要尽快执行。

    您可以参考数据表中的表6-1来查看 ISR 优先级。

    [引用用户="David Bahr86"] 由于 MSP430F5528 有一个内存缓冲器"ADC12MEMx"、并且 ADC 有可用的"重复自动扫描模式"、因此我假设实现的方式是 ADC12MEMx 可以毫无风险地读取、但我在中找不到任何相关内容 用户指南。[/quot]

    对于序列、只需确保序列中最后一次转换的 ADC12IFG 为触发器。 当转换完成且 ADC12IFG 被置位时一个传输被触发。 用软件置位 ADC12IFG 不会触发一个传输。 当相关的 ADC12MEMx 寄存器被 DMA 控制器访问时、所有 ADC12IFG 标志都会自动复位。  假设您有足够的带宽来在样本之间执行其他所有操作、我看不出这是什么问题。

    此致、

    James

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    CPU 被 DMA 暂停、因此 ISR 的优先级不会让 CPU 运行。

    我想知道、当 ADC 以"重复自动扫描模式"运行时、是否可以在没有 DMA 的情况下安全读取 ADC12MEMx?

    此致、

    David
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    根据用户指南、CPU 在块模式中具有20%的执行能力。 我不确定这是否是 CPU 处理优先级 ISR 的足够时间。 也许您可以使用其他 DMA 模式逐件传输 ADC 数据、从而使 CPU 在两次传输之间更频繁地释放。 为了安全读取 ADC 数据、您可以检查标志以确定数据是否已溢出。

    此致、

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

    尊敬的 James:

    感谢您的回答。

     

    "根据用户指南、CPU 在块模式中具有20%的执行能力。 我不确定这是否是 CPU 处理优先级 ISR 的足够时间。"

    我真的不能承担停止 CPU 的成本!

     

    "也许您可以使用其他 DMA 模式逐件传输 ADC 数据、从而使 CPU 在传输之间更频繁地释放。"

    此外、我还尝试避免使用 DMA 逐步降低刷新率。

     

    "为了安全读取 ADC 数据、您可以检查标志以确定数据是否已溢出。"

    我同意... 这将会节省、但确实有必要?

    但我想知道  、ADC 触发的 ADC12MEMx 的写入是否以某种方式与 MCLK 同步、或者 IC 设计中是否存在任何机制、以便随时读取 ADC12MEM0可以节省成本。

    是否有任何方法可以解决此问题? 可能在论坛之外? 我可以联系任何 FAE /技术支持?

    此致、

    David

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

    尊敬的 David:

    有几种可能的方法、但我认为您的方法最有意义。 对于其他社区成员、请随时在此处跳转。

    首先、您可以简单地轮询 ADCIFGx 标志、并在设置该标志时读出数据。 但是、这会浪费 CPU 带宽。 如果需要执行任何其他操作、您可能会错过该标志并太晚地读取数据。 使用 ADC ISR 更有利、更高效、因为它会在数据准备好读取时触发。

    其次、您可以启用 ADC、进入 ADC ISR 以读取数据、然后立即禁用 ADC、重复此过程。 这将确保您不会丢失 ADC 数据、但可能会限制采样频率。

    第三、当 ADCIFGx 标志被置位时、你可以使用一个非块 DMA 传输来访问 ADC 数据、但是这可能需要比使用块 DMA 传输更长的时间。

    第四种方法是使用块 DMA 传输来访问 ADC 数据、我认为这是最好的方法。 由于您在自动扫描模式下跨多个通道运行 ADC、因此您将捕获大量数据。 DMA 块模式一次传输此数据。 当然、CPU 在这里是有限的、但可能是其他方法中最不重要的。

    最终、CPU 会在所有这些方法期间停止、因此您需要选择停止 CPU 最少的方法。 正如我之前提到的、如果中断的优先级高于 DMA、它将被处理、然后 DMA 传输将恢复。 如果它的优先级较低、它将在 DMA 传输完成时得到处理。

    此致、

    James

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由于即将到来的美国假期、我将从现在开始到1月2日结束办公。 遗憾的是、回复会延迟、因此我们感谢您的耐心。

    此致、

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

    我一直在低消耗、希望我知道问题是什么。 是这样吗?

    问:MEM 寄存器是否通过16位总线连接到 ADC 内核和 CPU、以便 CPU 无法获取半更新的 MEM 值?

    答:我想是这样,但我不知道。 (没有人给我发了韦里罗格的钥匙。)

    如果我非常担心这一点、我会将访问打包到一个函数中、该函数读取 MEM 寄存器两次并对其进行比较。 额外的成本可能是6个时钟、您只需获取值、而不是每次转换(如 DMA 中所示)就会产生额外的成本。

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

    你(们)好 James

    "最终、CPU 会在所有这些方法中停止、因此您需要选择停止 CPU 最少的方法。 正如我之前提到的、如果中断的优先级高于 DMA、它将被处理、然后 DMA 传输将恢复。 如果它的优先级较低、它将在 DMA 传输完成时得到处理。"

    DMA 是否真的在等待执行更高优先级的中断? 我知道 CPU 立即保持?!

    B.R.

    David

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

    好主意。 但我想了解从 MCU 设计的角度来看、最好的方法是什么。

    我习惯从 MCU 供应商那里获取此类信息是否有任何方法可以与设计人员或 FAE 联系?

    B.R.

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

    尊敬的 David:

    [引用 user="David Bahr86"] DMA 是否真的在等待执行更高优先级的中断? 我知道 CPU 立即处于保持状态?![/报价]

    让我澄清一下。 对于不可屏蔽中断(NMI)、这是正确的、但对于系统中断则不是如此。 对于系统中断、它们不会中断 DMA 传输、并且将保持挂起状态、直到传输完成、然后根据其优先级执行。 DMA 传输中断系统 ISR (例如 USCI ISR)、如果这些 ISR 不应被中断、则在执行 ISR 之前应禁用 DMA。

    当 ADC12已经完成一个通道的采样并且已经将转换结果载入 ADC12MEMx、那么 ADC12MEMx 中断标志、ADC12IFGx 被置位。 当使用带有 ADC12的 DMA 控制器时、ADC12IFG 标志会触发从 ADC12MEMx 到定义的目的的传输。 使用这种方法时不应发生冲突、因为在将转换加载到 ADC12MEMx 中后、ADC12IFGx 标志总是被置位。

    如果您担心在有源转换期间读取 ADC12MEMx、那么我建议检查 ADC12BUSY 标志。

    此致、

    James

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

    尊敬的 James:

    "当 ADC12已经完成一个通道的采样并且已经将转换结果载入 ADC12MEMx、那么 ADC12MEMx 中断标志、ADC12IFGx 被置位。 当使用带有 ADC12的 DMA 控制器时、ADC12IFG 标志会触发从 ADC12MEMx 到定义的目的的传输。 使用这种方法时不应发生冲突、因为在将转换加载到 ADC12MEMx 中后、ADC12IFGx 标志总是被置位。"

    我的问题是、使用具有"通道重复序列"模式(CONSEQx = 3)的 ADC 时、DMA 在每次转换后都不会被触发!

    从 slau208q 11.2.12:"当 CONSEQx ={1、3}时、中最后一个 ADC12MEMx 的 ADC12IFG 标志
    序列可以触发 DMA 传输。"  

    由于 DMA 仅在完整的 ADC 序列后被触发、因此我只能在"重复块传输"中使用 DMA、这会保留 CPU。

    如果在通道重复序列模式下每次 ADC 转换后有一种触发 DMA 的方法、那将会很好。

    此致、

    David

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

    尊敬的 David:

    [引用 user="David Bahr86"]我的问题是使用具有"通道重复序列"模式的 ADC (CONSEQx = 3)、DMA 在每次转换后都不会被触发!

    感谢您对问题进行总结。 您如何确认 DMA 在每次转换后不会被触发?

    [引用 user="David Bahr86"]如果在通道重复序列模式下进行每个 ADC 转换后有一种触发 DMA 的方法,那将会非常好。[/quot]

    我认为您的问题是、您的采样速度太快。 降低采样率、查看 DMA 是否在每个转换序列后被触发。 如果采样率超快、我怀疑 DMA 会在第一个转换序列后被触发、但无法及时完成以捕获下一组。 因此、某些样本会由于溢出而丢失。 但是、在这种情况下、您还会限制可用的 CPU 处理时间。 在代码中、确保在采样之间有足够的时间(1)使用 DMA 移动转换、然后(2)在下一个采样之前使用 CPU 处理转换。

    此致、

    James

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

    "如何确认 DMA 在每次转换后都不会被触发?"

    用户指南中说明了这一点:

    从 slau208q 11.2.12:"当 CONSEQx ={1、3}时、中最后一个 ADC12MEMx 的 ADC12IFG 标志
    序列可以触发 DMA 传输。"  

    除此之外、我还测量到 DMA 仅在 ADC 的完整环路后才被触发! 为此、我记录了几个具有已知刷新率的 ADC 结果。

    B.R.

    David

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

    感谢您的澄清。 在你的最后一个回复中、我错误地假定"每次转换"你意味着 DMA 在序列中的最后一个 ADC 转换之后没有被其 ADC12IFG 触发。 您观察到的是 CONSEQx 模式的正常 DMA 行为。 如果您希望在每次 ADC 转换后触发 DMA、则需要使用 CONSEQx ={0、2}。 遗憾的是、对于 CONSEQx ={1、3}、没有方法可以执行此操作。

    此致、

    James